Skip to content
Menu

Установка и обновление

This page is not translated yet. The text below is the Russian source. Facts are unchanged.

Все команды на устройстве выполняются от имени root по SSH. В примерах <IP-адрес СА-02м> — адрес вашего устройства, <пароль> — пароль администратора устройства.

vPLC состоит из двух частей, которые ставятся отдельно:

  1. Рантайм — пакет vplc_<версия>_armhf.deb (в репозитории — packaging/vplc_<версия>_armhf.deb).
  2. Веб «ЦИНТРОН · Установка» — каталог файлов и служба vplc-plant-ui. Ставится скриптом tools/deploy_plant.py из репозитория vPLC (см. раздел «Веб «ЦИНТРОН · Установка»» ниже).
Путь на устройстве Что это Кто создаёт
/usr/bin/vplc Исполняемый файл рантайма Пакет
/usr/lib/systemd/system/vplc.service Служба vplc Пакет
/etc/vplc.conf.default Конфигурация по умолчанию Пакет
/etc/vplc.conf Рабочая конфигурация Копируется из .default при первой установке, если файла нет
/usr/lib/arm-linux-gnueabihf/libopen62541.so* Библиотека OPC UA Пакет
/var/lib/vplc/program.so Загруженная программа Вы (загрузка программы)
/var/lib/vplc/dump.bin Сохранённые значения переменных Рантайм
/var/lib/vplc/project.vplc Проект с картой MQTT (mqtt_io_map) и устройствами Modbus Рантайм при загрузке проекта
/var/lib/vplc/plant_config.json Конфигурация объектов веба установки Веб установки при первом сохранении настроек
/opt/vplc-plant-ui/ Сервер и страницы веба, контракты, привязки bindings.json, журнал событий events.jsonl Скрипт выкладки веба
/etc/systemd/system/vplc-plant-ui.service Служба веба установки Скрипт выкладки веба
/run/vplc-plant-ui/ui.sock Unix-сокет веба для маршрута панели /vplc/ Служба vplc-plant-ui при запуске
/etc/systemd/system/vplc.service.d/10-rt.conf Дополнение службы: право на приоритет реального времени для скана Вы (необязательно)
Служба Что запускает Перезапуск при сбое Журнал
vplc /usr/bin/vplc --config /etc/vplc.conf от root Restart=on-failure, через 5 с journalctl -u vplc
vplc-plant-ui python3 /opt/vplc-plant-ui/server.py от root, группа www-data Restart=on-failure, через 5 с journalctl -u vplc-plant-ui

Служба vplc стартует после сети и брокера MQTT (After=network.target mosquitto.service). Служба vplc-plant-ui стартует после vplc и брокера и подтягивает vplc (Wants=vplc.service). После установки обе службы включены в автозапуск.

  1. Скопируйте пакет на устройство:

    Окно терминала
    scp vplc_<версия>_armhf.deb root@<IP-адрес СА-02м>:/tmp/
  2. Установите пакет и запустите службу:

    Окно терминала
    ssh root@<IP-адрес СА-02м>
    dpkg -i /tmp/vplc_<версия>_armhf.deb
    systemctl enable --now vplc

    Пакет создаёт каталоги /var/lib/vplc и /var/log/vplc, копирует /etc/vplc.conf.default в /etc/vplc.conf (только если файла ещё нет) и включает службу в автозапуск.

  3. Настройте /etc/vplc.conf — см. рекомендуемую конфигурацию. После правки файла перезапустите службу:

    Окно терминала
    systemctl restart vplc
  4. Необязательно: разрешите скану приоритет реального времени. Это нужно, если в /etc/vplc.conf задан scan_rt_priority больше 0, а в журнале появляется строка SCHED_FIFO priority N refused. Создайте дополнение службы:

    Окно терминала
    mkdir -p /etc/systemd/system/vplc.service.d
    cat > /etc/systemd/system/vplc.service.d/10-rt.conf <<'EOF'
    [Service]
    AmbientCapabilities=
    AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_SYS_NICE
    EOF
    systemctl daemon-reload
    systemctl restart vplc
    journalctl -u vplc -n 40 --no-pager | grep -E 'SCHED|scan_rt'

    После пуска скана (при "scan_rt_priority": 10) ожидаемая строка: Scan thread tid N: SCHED_FIFO priority 10. Приоритет получает только поток скана; REST, MQTT и OPC UA остаются обычными потоками.

Веб ставится с компьютера, на котором есть копия репозитория vPLC, Python 3 и SSH-клиент (ssh/scp; либо модуль Python paramiko). Скрипт входит на устройство как root; пароль берёт из переменной окружения SA02M_PASS.

  1. Посмотрите план (ничего не записывает, печатает полный список файлов):

    Окно терминала
    export SA02M_PASS='<пароль>'
    python3 tools/deploy_plant.py --host <IP-адрес СА-02м>
  2. Выложите веб:

    Окно терминала
    python3 tools/deploy_plant.py --host <IP-адрес СА-02м> --apply

Что делает --apply:

  • копирует страницы, сервер и файлы модели (контракты, schema_gen.json, tags_gen.json, bindings.json) в /opt/vplc-plant-ui;
  • ставит или обновляет /etc/systemd/system/vplc-plant-ui.service (прежний отличающийся файл сохраняется рядом как vplc-plant-ui.service.bak-<время>), выполняет daemon-reload, enable и restart vplc-plant-ui;
  • проверяет unix-сокет (тип, права 0660, владелец root:www-data, каталог 0750) и запрос GET / через него;
  • не трогает nginx, /etc/vplc.conf, брокер MQTT, порты RS-485, plant_config.json и dump.bin;
  • не перезаписывает bindings.json на устройстве, если в нём уже есть привязки к топикам (чтобы заменить его копией из репозитория, добавьте --replace-bindings).

Веб доступен:

  • напрямую: http://<IP-адрес СА-02м>:8088/;
  • через панель устройства по пути /vplc/ — если ваша версия панели СА-02м содержит этот маршрут. Панель пропускает запросы только после входа.

Параметры запуска сервера (--host, --port, --socket, --plant-config и другие) описаны в справочнике конфигурации.

  1. Проверьте службы:

    Окно терминала
    systemctl status vplc vplc-plant-ui --no-pager

    Обе должны быть active (running).

  2. Проверьте рантайм:

    Окно терминала
    curl -s http://127.0.0.1:1234/api/status | python3 -m json.tool

    В ответе: "version": "<версия сборки>"; "state" — IDLE, если программа ещё не загружена, или RUNNING, если программа загружена и запущена.

  3. Откройте в браузере:

    Адрес Что должно быть
    http://<IP-адрес СА-02м>:1234/ Встроенная страница рантайма: состояние, переменные, журнал
    http://<IP-адрес СА-02м>:8088/ Веб «ЦИНТРОН · Установка»
  4. Проверьте журнал запуска:

    Окно терминала
    journalctl -u vplc -n 30 --no-pager

    Ожидаемые строки: vPLC runtime v… starting, Config loaded: …, REST+WS server on port 1234.

Программа — файл program.so для armhf (для типовых установок — universal_armhf.so). Как собрать свою программу — Программирование.

Окно терминала
curl -X POST http://<IP-адрес СА-02м>:1234/api/program/upload \
-H "Content-Type: application/octet-stream" \
--data-binary @universal_armhf.so
curl -X POST http://<IP-адрес СА-02м>:1234/api/start

Загрузка останавливает скан, записывает файл в program_path (/var/lib/vplc/program.so) и загружает программу. Скан после загрузки нужно запустить командой /api/start. Если сохранённые значения переменных (dump.bin) принадлежат программе с тем же именем, они восстанавливаются.

Окно терминала
scp universal_armhf.so root@<IP-адрес СА-02м>:/var/lib/vplc/program.so.new
ssh root@<IP-адрес СА-02м>
curl -s -X POST http://127.0.0.1:1234/api/dump/save
mv -f /var/lib/vplc/program.so.new /var/lib/vplc/program.so
curl -s -X POST http://127.0.0.1:1234/api/program/reload

/api/program/reload перечитывает программу с диска; если скан работал, он запускается снова. Перед перезагрузкой программы сохраните переменные (/api/dump/save): при перезагрузке значения берутся из dump.bin, несохранённые изменения теряются.

Команда vPLC: Compile & Deploy (Ctrl+Shift+D в редакторе ST) компилирует проект, загружает .vplc и .so через REST и запускает скан — см. Программирование.

Окно терминала
python3 tools/deploy_plant.py --host <IP-адрес СА-02м> --apply --so universal_armhf.so

Скрипт сохраняет прежний program.so как program.so.bak-before-universal (если такая копия уже есть — с меткой времени), заменяет файл и вызывает /api/program/reload.

Чтобы после перезагрузки СА-02м программа загружалась и запускалась сама, задайте в /etc/vplc.conf "autostart": true (по умолчанию false) и перезапустите службу.

Для работы с модулями рантайму нужен ещё проект .vplc с картой mqtt_io_map: в program.so карты нет. Для программы universal проект строит и загружает веб установки кнопкой «Применить в ПЛК» в окне «Карта I/O» — см. Настройка установки. Свой проект можно загрузить вручную:

Окно терминала
curl -X POST http://<IP-адрес СА-02м>:1234/api/project/upload --data-binary @project.vplc
curl -X POST http://<IP-адрес СА-02м>:1234/api/program/reload

Проект — файл SQLite размером до 8 МБ. Если project_path в конфигурации пуст, рантайм сохраняет проект в /var/lib/vplc/project.vplc и сам записывает этот путь в /etc/vplc.conf.

Перед любым обновлением сохраните переменные и сделайте копию:

Окно терминала
curl -s -X POST http://127.0.0.1:1234/api/dump/save
B=/var/lib/vplc/backup-$(date +%Y%m%d-%H%M%S)
mkdir -p "$B"
cp -a /var/lib/vplc/program.so /var/lib/vplc/dump.bin "$B"/
cp -a /var/lib/vplc/project.vplc /var/lib/vplc/plant_config.json "$B"/ 2>/dev/null
cp -a /etc/vplc.conf /usr/bin/vplc "$B"/
cp -a /opt/vplc-plant-ui "$B"/opt-vplc-plant-ui
ls -la "$B"
Что сохранено Зачем
program.so Откат программы
dump.bin Значения параметров и уставок, состав установки, наработки
project.vplc Карта ввода-вывода (MQTT)
plant_config.json Объекты, счётчики, тарифы, расписания веба
vplc.conf Конфигурация рантайма
vplc Откат исполняемого файла рантайма
opt-vplc-plant-ui/ Веб, в том числе привязки bindings.json и журнал событий events.jsonl
  1. Сделайте резервную копию.

  2. Установите новый пакет и перезапустите службу:

    Окно терминала
    dpkg -i /tmp/vplc_<версия>_armhf.deb
    systemctl restart vplc

Перед заменой файлов пакет останавливает службу (при остановке работающий рантайм сам сохраняет переменные в dump.bin); после установки служба только включается в автозапуск, поэтому systemctl restart vplc обязателен. Файлы /etc/vplc.conf и /var/lib/vplc/* при обновлении не перезаписываются.

Проверка: curl -s http://127.0.0.1:1234/api/status — поле version.

Загрузите новый program.so любым способом из раздела Загрузка программы. Переменные восстанавливаются из dump.bin, если имя программы не изменилось (у universal оно всегда universal).

Повторите python3 tools/deploy_plant.py --host <IP-адрес СА-02м> --apply. Привязки bindings.json с топиками и plant_config.json сохраняются. Старые файлы первой поставки (app.js, style.css, setup_*.js в корне /opt/vplc-plant-ui) переносятся в /opt/vplc-plant-ui/_old-<дата>/.

Сначала остановите рантайм: при остановке он записывает dump.bin, и восстановленная копия иначе будет перезаписана.

Окно терминала
systemctl stop vplc
B=/var/lib/vplc/backup-<метка>
cp -a "$B"/vplc /usr/bin/vplc
cp -a "$B"/vplc.conf /etc/vplc.conf
cp -a "$B"/program.so /var/lib/vplc/program.so
cp -a "$B"/dump.bin /var/lib/vplc/dump.bin
cp -a "$B"/project.vplc /var/lib/vplc/project.vplc 2>/dev/null
systemctl start vplc

Откат только программы — без остановки службы:

Окно терминала
cp -a /var/lib/vplc/program.so.bak-<метка> /var/lib/vplc/program.so
curl -s -X POST http://127.0.0.1:1234/api/program/reload

Откат веба: верните файлы из "$B"/opt-vplc-plant-ui/ в /opt/vplc-plant-ui/ и выполните systemctl restart vplc-plant-ui. Прежний файл службы — /etc/systemd/system/vplc-plant-ui.service.bak-<время> (после замены — systemctl daemon-reload).

Чтобы заменить работающий исполняемый файл без пакета, положите новый файл рядом (/usr/bin/vplc.new) и переименуйте его командой mv, а не копируйте cp поверх работающего файла:

Окно терминала
scp vplc root@<IP-адрес СА-02м>:/usr/bin/vplc.new # на компьютере
cp -a /usr/bin/vplc /usr/bin/vplc.bak-$(date +%Y%m%d-%H%M%S)
mv -f /usr/bin/vplc.new /usr/bin/vplc
systemctl restart vplc
Окно терминала
systemctl disable --now vplc-plant-ui
rm /etc/systemd/system/vplc-plant-ui.service
systemctl daemon-reload
dpkg -r vplc

dpkg -r останавливает службу vplc и выключает её автозапуск. Не удаляются (их создаёт не пакет): /etc/vplc.conf, /var/lib/vplc/ (программа, переменные, проект, plant_config.json, резервные копии), /opt/vplc-plant-ui/, /etc/systemd/system/vplc.service.d/. Если они больше не нужны, сделайте копию и удалите их вручную.

vPLC ставится рядом с MPLC4 и не мешает ему:

  • порты REST (1234) и веба (8088) не пересекаются с портами MPLC4;
  • обе среды подключаются к общему брокеру MQTT 127.0.0.1:1883 со своими идентификаторами клиента;
  • vPLC не открывает порты RS-485, модули опрашивает мост панели;
  • Modbus TCP slave vPLC по умолчанию выключен; если включаете — на порту 1502, не 502;
  • OPC UA vPLC по умолчанию выключен; порт 4840 оставьте для CODESYS, для vPLC используйте 4842.

Облегчённый профиль служб (ниже) отключает MPLC4. Если MPLC4 нужен, не применяйте профиль или верните службы ключом --undo.

Скрипт tools/sa02m_lite_services.sh отключает службы СА-02м, которые не нужны vPLC и вебу установки, чтобы освободить память и процессор. Запускается на устройстве от root.

Режим Команда Что делает
Отчёт bash sa02m_lite_services.sh Ничего не меняет: показывает загрузку, память, состояние служб и список к отключению
Применить bash sa02m_lite_services.sh --apply Отключает (disable --now + mask) службы из списка, записывает их в /var/lib/sa02m-lite/disabled
Вернуть bash sa02m_lite_services.sh --undo Снимает mask и включает (enable --now) все службы из /var/lib/sa02m-lite/disabled
Удалить пакеты bash sa02m_lite_services.sh --apply --purge Дополнительно удаляет пакеты — необратимо без переустановки

Запуск с компьютера без копирования файла:

Окно терминала
ssh root@<IP-адрес СА-02м> 'bash -s' < tools/sa02m_lite_services.sh # отчёт
ssh root@<IP-адрес СА-02м> 'bash -s -- --apply' < tools/sa02m_lite_services.sh # применить
ssh root@<IP-адрес СА-02м> 'bash -s -- --undo' < tools/sa02m_lite_services.sh # вернуть

Что отключается (если служба есть на устройстве и включена или запущена):

Группа Службы
Облако и умный дом sa02m-cloud-agent, sa02m-cloud-frpc, sa02m-cloud-control, sa02m-alice-client, sa02m-homekit, sa02m-homeconnect
Сценарии, телеметрия, шлюз sa02m-rules, sa02m-telemetry, sa02m-serial-gateway, sa02m-kernel-service-guard
Другие среды исполнения mplc4, codesys, codesyscontrol, codemeter, codemeter-webadmin, nodered, node-red, docker (служба и сокет), containerd
Прочее ModemManager, lighttpd, postfix
Таймеры sa02m-web-update-check, man-db, dpkg-db-backup, lighttpd-maint, e2scrub_all

Кроме того, --apply увеличивает интервал проверки CHECK_INTERVAL до 30 с и убирает mplc4 из списков в конфигурации sa02m-failure-monitor и sa02m-userspace-watchdog (если файлы есть) и перезапускает эти службы.

Что не трогается: mosquitto, nginx, chrony, ssh, сеть и net-watchdog, sa02m-modbus-mqtt, sa02m-devices-*, sa02m-flasher, sa02m-agent-api, sa02m-rs485-roster, udev и порты COM, часы RTC, службы vplc*, службы загрузки и оборудования СА-02м.

С --purge удаляются пакеты docker.io, containerd, runc, nodejs, node-red, codemeter-lite, codemeter, zsh, aptitude, aptitude-common, mc, git, python3-pip, btrfs-progs и каталоги /opt/mplc4, /opt/vendor-installers/*.

Ожидаемый эффект — освобождение оперативной памяти: занятая память снижается примерно со 157 до 70–90 МБ, нагрузка служб надзора и MPLC4 на процессор — в несколько раз.

Ресурс Значение
Процессор ARMv7 (armhf). Паспорт изделия — СА-02м
Оперативная память рантайма Несколько мегабайт: 2,5–5 МБ резидентной памяти без программы или с тестовой программой
Процессор рантайма Около 0,5–6 % одного ядра без программы или с тестовой программой
Скан программы universal При периоде 100 мс на СА-02м: 95-й процентиль около 12 мс, максимум около 20 мс (поток скана с scan_rt_priority 10)
Диск Пакет — около 0,6 МБ; веб — около 160 файлов в /opt/vplc-plant-ui
Программное окружение Python 3 для веба; брокер MQTT и мост панели для модулей; NTP для расписаний

Памяти СА-02м достаточно, если на устройстве не включена компиляция программ. Компилятор на СА-02м не нужен: программы собираются на компьютере.