Вопрос: как считать информацию об устройстве и проекте в переменные программы?
Для контроллеров ОВЕН эта информация доступна в узле таргет-файла Info.
07-11-2026 18-10-56.png
В текущих версиях CODESYS каналы AUTHOR и VERSION очищаются после перезагрузки контроллера, если загрузочное приложение контроллера создано с помощью команды Создать загрузочное приложение (как в онлайн, так и в оффлайн-режиме).
Этот эффект не проявляется, если загрузочное приложение создано неявно
(при загрузке проекта с помощью команды Логин с установленной галочкой Обновить загрузочное приложение).
Информация об ошибке зафиксирована в баг-трекере CODESYS (CDS-47464).
07-11-2026 18-01-58.png
Данные об авторе и версии проекта вводятся пользователем в CODESYS в меню Проект во вкладке Информация проекта.
При этом следует установить галочку Автоматически генерировать POU ‘Информация о проекте‘.
07-11-2026 18-13-36.png
Собственно, можно использовать в проекте и эти автоматически сгенерированные функции:
07-11-2026 18-17-51.png
Преимуществом функции GetTextProperty является то, что она возвращает значения в виде переменных типа WSTRING, и это позволяет корректно отобразить имя проекта и его автора, если они содержат символы кириллицы.
В каналах PROJECT и AUTHOR узла Info символы кириллицы будут отображены некорректно в связи с особенностями работы системных функций CODESYS.
С PROJECT ничего сделать не получится, а вот для преобразования AUTHOR можно использовать следующий код (ограничение - имя автора должно включать только символы кириллицы и пробелы):
Кроме того, можно получить информацию о проекте с помощью функций библиотеки CmpApp.Код:PROGRAM PLC_PRG VAR xInit: BOOL; iLen: INT; i: INT; abyAuthor: ARRAY [0..159] OF BYTE; wsAuthor: WSTRING; END_VAR IF NOT(xInit) THEN iLen := LEN(TargetVars.stInfo.sAuthorName); FOR i := 0 TO iLen - 1 DO abyAuthor[2 * i] := TargetVars.stInfo.sAuthorName[i]; IF TargetVars.stInfo.sAuthorName[i] = 16#20 THEN // Старший байт кода UTF-16 для пробела abyAuthor[2 * i + 1] := 16#00; ELSE // Старший байт кода UTF-16 для символов кириллицы abyAuthor[2 * i + 1] := 16#04; END_IF END_FOR MEM.MemMove(ADR(abyAuthor), ADR(wsAuthor), TO_UINT(iLen * 2) ); xInit := TRUE; END_IF
Функции возвращают разные структуры, в которых часть полей являются общими, и имеют уже упомянутые проблемы с кириллицей.
07-11-2026 19-07-05.pngКод:PROGRAM PLC_PRG VAR xInit: BOOL; pstAppInfo: POINTER TO CmpApp.APPLICATION_INFO; stAppInfo: CmpApp.APPLICATION_INFO; stProjectInfo: CmpApp.PROJECT_INFO; pstApp: POINTER TO CmpApp.APPLICATION; dwError: DWORD; END_VAR IF NOT(xInit) THEN pstApp := CmpApp.AppGetCurrent(ADR(dwError) ); IF pstApp <> 0 THEN pstAppInfo := CmpApp.AppGetApplicationInfo(pstApp, ADR(dwError) ); dwError := CmpApp.AppGetProjectInformation(pstApp, ADR(stProjectInfo) ); END_IF IF pstAppInfo <> 0 THEN stAppInfo := pstAppInfo^; END_IF xInit := TRUE; END_IF
Если требуется считать информацию об устройстве без использования узла Info (например, в рамках разрабатываемой вами библиотеки), то можно воспользоваться библиотекой CmpSysExec, предназначенной для выполнения команд Linux. Ознакомьтесь с документаций и видеопримером.
Вам потребуется выполнить следующие команды:
Вывод двух последних команд можно фильтровать с помощью утилиты jq:Код:cat /etc/RELEASE ubus call softlogic information ubus call system board
Примеры вывода команд (аналогичный вывод вы получите в CODESYS):Код:ubus call system board | jq .sn
08-11-2026 9-10-21.png 08-11-2026 9-10-08.png
Библиотека CmpSysExec поддержана только на контроллерах ОВЕН - проверить ее работу на виртуальном контроллере и использовать на контроллерах других произвоидителей не получится.


