PDA

Просмотр полной версии : Обновление приложения через Codesys в ПЛК210



afcffafr
05.11.2024, 17:49
Добрый день!

Я использую обновление проекта через web-интерфейс -> Управление приложениями CODESYS. Этот механизм работает без нареканий, вопросов к нему нет. Сейчас у меня появилась задача обновлять приложение удалённо. Я организовал удалённый доступ к ПЛК210 через Wireguard, но появилось дополнительное условие: объект движется, связь может пропадать и появляться случайным образом и сидеть дежурить перед ПК в надежде, что связь появится, нет никакого желания.

Существует ли какой-то стандартный способ OTA-обновления приложения CODESYS?

Я ничего подобного не нашёл и начал писать свой костыль с примерно таким алгоритмом:
0 - Создаётся папка с файлом обновления, доступная через интернет (конкретно сейчас использую расшаренную папку GoogleDrive)
1 - Контроллер периодически проверяет папку из предыдущего шага и скачивает обновление в /home/root/Projects
2 - ***Запускается скрипт, как на странице загрузки из web-интерфейса***
79852
3 - Контроллер перезагружается
4 - Конец

Проблема сейчас с шагом 2. Приложение скачивается и кладётся в папку, аналогично тому, как это происходит при загрузке через web-интерфейс, но очевидно происходит что-то ещё при нажатии на кнопку "Запустить".

Пожалуйста, подскажите либо какой-то опробованный способ автоматического обновления, либо ткните в сторону скрипта, который делает магию запуска приложения.

Нашёл скрипт, который обновляет приложение с USB/SD флешек, но не хотелось бы делать это через внешние накопители, потому что:
а - сейчас их нет.
б - думаю, что это не слишком безопасно с точки зрения копирования моего приложения.

Информация по моему контроллеру:

Модель OWEN PLC210-03
Серийный номер 84174230932478316
Архитектура ARMv7 Processor rev 2 (v7l)
Версия прошивки plc210 2.4.0601.0905
Версия ядра 4.19.94-rt39-ti-owen-g14165aea90-owen10.57.1.18.16.8

Евгений Кислов
05.11.2024, 18:09
Добрый день.


/home/root/Projects

Это символическая ссылка на /root/Projects.

Для обновления проекта нужно скопировать файлы загрузочного приложения в нужные папки из /root/CODESYS/PlcLogic (посмотрите на содержимое этой директории - интуитивно станет понятно, какие файлы куда копировать).

После этого при необходимости можно очистить RETAIN-память:


service retain clear

и перезапустить рантайм CODESYS для запуска нового проекта:


service codesys restart

afcffafr
07.11.2024, 14:17
Добрый день, Евгений!

Спасибо за быстрый ответ, в целом это помогло в моих поисках. Наверное, я в первом сообщении не смог донести то, что хотел в итоге получить. Я бы хотел, чтобы полностью сохранился и выполнял свою функцию раздел "Управление приложениями CODESYS" в web-интерфейсе ПЛК. Ну то есть чтобы моё автоматическое обновление из CODESYS не ломало бы внешний вид и логику указанного раздела, чтобы также подсвечивался синим активный проект и т.п. Наверное, можно это всё было бы решить через библиотеку FILE, но тасовать файлы через CODESYS для меня сейчас - это просто боль и унижение.
Короче говоря, пришлось поковыряться в файлах ПЛК и там нашёлся prj-man.js, отвечающий за функционал вкладки "Управление приложениями CODESYS". Там я нашёл, во-первых, ссылку на баш-скрипт, который рассовывает файлы из архива с проектом в нужные места и перезагружает среду исполнения (т.е. делает то, что вы и рекомендовали), а во-вторых, название rpc-метода (или я хз как это назвать, честно говоря впервые в жизни видел джаваскрипт), который делает заданный проект "активным" во вкладке "Управление приложениями CODESYS".
В итоге, кусок кода, который делает тоже самое, что и нажатие на кнопку "запустить" в web-интерфейсе, выглядит у меня так:


IF xOTA_UPDATE_ENABLE THEN
//тут выше скачали обновление проекта из облачной папки и положили этот архив в папку /home/root/Projects/APP_B

//магия ubus - дёргаем напрямую метод, который делает активной папку, в которой лежит наш проект
CmpSysExec.sysExecute('ubus call prjman set_actv $'{"name": "APP_B"}$'');
//запускаем скрипт, который распакует проект из нашей папки куда надо и перезапустит среду исполнения
CmpSysExec.sysExecute('/usr/bin/toprj.sh APP_B');
END_IF