Serhioromano
@Serhioromano
Web Developer

Среда разработки ПЛК транспайл то GO. Это умно?

Я работаю над созданием среды разработки программ для 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.
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
Программист по автоматике
1) Можно посмотреть примеры на Матлабе. Я предпочитаю графический язык SFC (Codesys), в Матлабе он соответствует (не во всём, в том числе и в графическом представлении) Stateflow.
Видео
Есть переводчик Stateflow -> ST. При этом, уже разбирать и отлаживать ST не так просто (кстати, в вашем примере на ST есть логическая ошибка: обращение к полям TON1.Q и TON1.ET, но не факт, что был вызов TON1 (предыдущее условие IF может быть ложным) Хорошо, если поля содержат нули. А если мусор?).

2) Можно сразу Stateflow переводить на C/C++ для Линукса (в Матлабе и Симулинке есть средства)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы