Я работаю над созданием среды разработки программ для GKR/
Основным языком будет ST (Structured Text) один из 5ти языков стандарта МЭК 61131-3.
Основной средой разработки будет VS Code.
Я уже написал расширение которое подсвечивает синтаксис, делает подсказки, далее будет делать анализ кода ну и весь набор.
Теперь, когда программа готова, ее нужно откомпилировать и залить на ПЛК. Предположительно это буде работать только на ПЛК основанных на Линукс. Ни каких stm32 или подобное. Компиляторов ST не существует. Потому что ST это как бы не язык а набор рекомендаций. Каждый внедряет этот язык по своему и пишет свой компилятор. В любом случае все заканчивается скорей всего с/С++ кодом. Значит у меня есть 2 пути от сюда.
1. Сделать компилятор и превращать код ST сразу в исполняемый машинный код. Здесь я делаю exit потому что это не мой уровень компетенции и не уверен что это правильно.
2. Сделать транспаилер и из файла ST делать файл другого языка. Получается ST будет типа TypeScript который потом превращается в ванила яваскрипт. Ну здесь стоит выбор языков. Сначала я думал использовать Питон так как он уже часто используется в ПЛК. Но поиграв с ним немного понял, что будет не просто делать минималистические установки. Питон всегда должен быть установлен в ОС. Да и работает он через интерпретатор.
Следующая идея была Nodejs. Она казалась идеальной. Я его знаю на 5, он асинхронный что добавит ПЛК особой гибкости, но почитав о нем статьи автора Express я понял что двигаться в этом направлении можно, и все будет работать, но в конечном итоге я упрусь в некоторые ограничения ядра ноуд.
Вчера встретил знакомого на прогулке, он мне сказал посмотри на ГО. Я посмотрел. И выглядит он идеально. Будет ли это разумно, переводит синтаксис ST в программу на ГО, а потом уже компилировать сам ГО превращая в машинный код?
Что бы было понятно как примерно выгляди ST что бы сделать хоть какуюто оценку вот пример.
TYPE Shelf :
STRUCT
TemperatureIN: POINTER TO WORD;
Temperature: INT;
TemperatureHMI: POINTER TO WORD;
TemperatureStatus: POINTER TO BYTE;
OutByte: POINTER TO WORD;
ByteNum: USINT;
Correction: POINTER TO WORD;
END_STRUCT
END_TYPE
FUNCTION_BLOCK TON_M
VAR_INPUT
IN: BOOL;
PT: TIME;
RS: BOOL;
END_VAR
VAR_OUTPUT
Q: BOOL;
TP: WORD;
TW: TIME;
END_VAR
VAR
TON1: TON;
SR1: SR;
RT1:R_TRIG;
TimeWorked : TIME;
xProcess :BOOL;
END_VAR
IF pt = T#0S THEN
Q := TRUE;
RETURN;
END_IF
IF RS OR (TimeWorked > PT) THEN
TimeWorked := T#0S;
TON1(IN := FALSE);
RETURN;
END_IF
IF NOT TON1.Q AND NOT IN THEN
TimeWorked := TimeWorked + TON1.ET;
END_IF
TON1(IN := IN, PT := SEL(IN, T#0MS, PT - TimeWorked), Q => Q);
TW := TimeWorked + TON1.ET;
TP := REAL_TO_WORD(TIME_TO_REAL(TW) * 100.0 / TIME_TO_REAL(PT));
END_FUNCTION_BLOCK
Вот список вещей которые мне нужно будет достич в конечном результате. Я не вижу сложности первода ST в ГО так как он оба С подобные но в конечном итоге мне понадобиться.
1. Симуляция. Это возможнсть запустить программу и смотреть какая переменная какое значение имеет. Возможно менять значения переменных на лету.
2. Онлайн отладка. Это возможность запустить программу на самом ПЛК и смотреть какие переменные какие значения имеют, в работающем ПЛК. При чем эт должно тображаться поверх кода ST.