В предыдущей статье мы подключили CAN bus к STM32-IHM03, настроили базовую коммуникацию и запустили управление PMSM-двигателем. Теперь пришло время расширить проект — добавить в него периферийный микроконтроллер в качестве удалённого I/O-узла и организовать логику управления с помощью OpenPLC.
В этой статье мы рассмотрим, как подключить Raspberry Pi Pico W по Modbus RTU к одноплатному компьютеру Orange Pi, запрограммировать микроконтроллер в среде OpenPLC Editor на языке контактно-релейных схем (LD) и удаленно управлять реле по Modbus. Попутно разберёмся с настройкой шилда RS485 CAN HAT, адресацией пинов и регистров.
Схема подключения устройств

Схема рисовалась в Fritzing, библиотеки для модулей скачивались с разных ресурсов. Вкратце опишем составляющие схемы, и приведем отличия от реальной комплектации. Для упрощения на схеме не показана разводка питания для большинства модулей.
Комплект разработки STM32-IHM03
STM32-IHM03 служит для управления PMSM-двигателем. На схеме показана только плата NUCLEO-G431RB без силового модуля X-NUCLEO-IHM16M1. К плате подключен модуль CAN-трансивер SN65HVD230 как было описано ранее в статье. Рядом изображен PMSM-двигатель в виде желтого круга с трехфазным проводником.
Raspberry pi pico.
В действительности используется Raspberry pi pico w с возможностью подключения к WI-FI сети для отладки проекта. Возможны и другие MCU, как упоминалось выше. Используется как удаленная периферия для управления реле. Программная логика реализована на OpenPLC.
Одноплатный PC Raspberry pi.
Здесь также возможны другие варианты. Важно то, чтобы была возможность подключения CAN bus и Modbus интерфейса. А также достаточно ресурсов для запуска платформ Node-red и N8N. Я использую Orange pi 4 pro.
Модуль реле SRD-05VDC-SL-C 5V.
На схеме — К1 и К2. В данном демо-проекте — это конечное устройство, однако можно найти или придумать множество примеров применения такого реле.
RS485 CAN HAT шилд для Raspberry pi.
На схеме представлен в виде двух отдельных модулей: CAN bus — модуль MCP2515, Modbus-модуль MAX485.
Modbus-модуль на микросхеме MAX485.
Служит для подключения к Modbus-сети микроконтроллера Raspberry pi pico w.
В действительности система в сборе представлена на фото. Кроме всего прочего на макетной плате размещен MCU STM32F401, подключенный по Modbus. Но STM32F401 пока не с какими устройствами не связан, и служит только для проверки работы Modbus при его запуске, поэтому на схеме он не показан. Питания микроконтроллеров, модулей и реле осуществляется с помощью модуля HW-131, но это не принципиально, поэтому на схем он тоже не показан. На макетной плате HW-131 подключался в последнюю очередь, поэтому он расположен не удобно, а схему переделывать уже не было желания. На фото Orange pi 4 pro расположен сверху комплекта STM32-IHM03, в действительности PC достаточно мобильный и может находится в любом положении. Витая пара сине-белых проводов слева — это CAN bus между Orange pi и STM32-IHM03. Витая пара справа — Modbus между Orange pi 4 и Raspberry pi pico w. Двигатель со стендом уже упоминался ранее в предыдущей статье.

Raspberry pi pico pinout
Для программирования OpenPLC нам прежде всего необходимо понимать адресацию пинов устройства в роли PLC. На форуме выложили схему для Raspberry pi pico.

Кроме этого нам необходимо знать адресацию Modbus. В документации приведены таблицы для разных устройств. Для чипов RP2040 представлена следующая таблица.
|
Modbus Data Type |
Usage |
PLC Address |
Modbus Data Address |
Data Size |
Range |
Access |
|---|---|---|---|---|---|---|
|
Discrete Output Coils |
Digital Outputs |
%QX0.0 – %QX6.7 |
0 – 55 |
1 bit |
0 or 1 |
RW |
|
Discrete Input Contacts |
Digital Inputs |
%IX0.0 – %IX6.7 |
0 – 55 |
1 bit |
0 or 1 |
R |
|
Analog Input Registers |
Analog Input |
%IW0 – %IW31 |
0 – 31 |
16 bits |
0 – 65535 |
R |
|
Holding Registers |
Analog Outputs |
%QW0 – %QW31 |
0 – 31 |
16 bits |
0 – 65535 |
RW |
|
Holding Registers |
Memory (16-bits) |
%MW0 – %MW19 |
32 – 51 |
16 bits |
0 – 65535 |
RW |
|
Holding Registers |
Memory (32-bits) |
%MD0 – %MD19 |
52 – 91 |
32 bits |
0 – 4294967295 |
RW |
|
Holding Registers |
Memory (64-bits) |
%ML0 – %ML19 |
92 – 171 |
64 bits |
0 – a really big number! |
RW |
Шилд RS485 CAN HAT
В действительности коммуникация между одноплатным PC по CAN bus и Modbus с различными устройствами может выполняться различными способами, не только с помощью шилда. Но RS485 CAN HAT у меня был в наличии, и хорошо работал на Raspberry pi. Я задался идеей адаптировать его на Orange pi 4 pro. Подключение шилда к Raspberry pi описано на сайте Waveshare, и производится достаточно просто.
Для подключения RS485 CAN HAT к Orange pi 4 pro требуется больше усилий и определенных шагов. Первым делом необходимо установить драйвер CAN bus для чипа MCP2515, о чем рассказывало в с статье Can bus на Orange pi 4 pro. Чип MCP2515 на RS485 CAN HAT тактируется частотой 12МГц, поэтому необходимо изменить значение частоты в оверлей файле sun60i-a733-mcp2515.dtbo mcp2515.dts с 8Мгц на 12 МГц. во фрагменте fragment@0:
clock-frequency = <12000000>;
а затем скомпилировать таким же образом как и ранее
sudo dtc -@ -I dts -O dtb -o /boot/dtb/allwinner/overlay/sun60i-a733-mcp2515.dtbo mcp2515.dts
В меню конфигурации он уже будет установлен.
Следующим шагом необходимо активировать UART для связи с 485-трансивером SP3485. Согласно распиновки шилда и Orange pi 4 pro — это порт UART7. Для этого нужно просто выбрать этот порт в меню конфигурации, выполнив команду
sudo orangepi-config
И перейти в меню System -> Hardware

В статье Waveshare указано, что сигналы управляющих пинах RE, DE чипа SP3485 автоматически активируется NPN транзистором согласно схемы. И дополнительных подключений не требуется.

Стоит отметить что расположение процессора Orange pi 4 pro будет под левой частью шилда. И шилд прийдеться немного приподымать или подключать с помощью шлейфа, если еще добавить радиатор к процессору. На фото показано как это расположено у меня на пластиковых стойках подобранной высоты. В целом процессор слабо греется, поэтому температурного влияния на шилд не оказывает.


OpenPLC: промышленный стандарт в DIY
Зачем нам OpenPLC, если можно написать логику на C++ или Python? Ответ в гибкости и стандартизации согласно IEC 61131-3. Если вы захотите изменить алгоритм работы, например, добавить зависимость скорости мотора от датчика температуры, или от положения концевика, в OpenPLC это делается на языке релейных схем (LD) или функциональных блоков (FBD) за минуты.
Мы интегрируем нашу сборку с OpenPLC v4. Теперь микроконтроллер выступает как подчиненное устройство (I/O узел), а координация системы переезжают на Node-red.
Как это работает: Связываем Node-RED и микроконтроллер через Modbus TCP. Строим простой HMI, с помощью которого управляем и мониторим систему. В качестве микроконтроллера можно выбрать любой MCU, поддерживаемый OpenPLC. В моем случае — это Raspberry pi pico w.
Выбор OpenPLC v4 обусловлен несколькими причинами:
-
Runtime и OpenPLC Editor в свободном доступе с MIT License.
-
Проект активно развивается, есть поддержка на форуме
-
OpenPLC editor представляет собой среду разработки для программирования PLC по IEC 61131-3
-
Поддерживает много доступных устройств: Arduino, Raspberry pi, ESP32 и т.д.
-
Реализована связь с устройствами по Modbus.
Подробнее о программировании в OpenPLC v4 Editor можно ознакомится в документации. Посмотреть примеры выполнения проектов можно на канале https://www.youtube.com/@openplc. Есть материалы и примеры для ранней версии OpenPLC v3, например здесь. Как утверждает автор проекта, v4 сейчас в активном развитии, а для v3 разработка уже не ведется.
Реальность против Ожиданий: Почему это (пока) не Siemens и не Mitsubishi
Давайте будем честными: собрать систему на Raspberry Pi Pico и OpenPLC — это отличный способ изучить концепции, но до промышленного уровня здесь все-таки далеко. Если вы решите внедрить это на реальном производстве, приготовьтесь к ряду проблем.
Микроконтроллер — это не PLC
Микроконтроллер за $5 — это чудо инженерной мысли, но в нем нет ничего от промышленного контроллера «из коробки»:
-
Электромагнитная совместимость (ЭМС): Голая плата Pico может зависнуть или перезагрузится от первого же щелчка мощного пускателя рядом. Чтобы сделать её промышленной, вам придется городить огород из гальванической развязки всех входов, супрессоров и качественных фильтров питания.
-
Инфраструктура: В промышленном ПЛК есть жесткие аппаратные механизмы контроля зависания цикла. В нашей связке «Pico + OpenPLC» программный сбой может оставить реле включенным в самый неподходящий момент.
-
Разъемы и монтаж: Micro-USB и гребенки 2.54 мм — это враги вибрации. В реальном шкафу автоматизации всё должно быть на винтовых клеммах и DIN-рейке.
OpenPLC v4 vs CODESYS/TIA Portal и т.п.
OpenPLC — прекрасный проект для сообщества, но сравнивать его с гигантами вроде CODESYS пока рано.
-
Ограниченность функционала: Например, если в CODESYS реализация Modbus — это мощный конфигуратор, где можно настроить всё до бита, то в OpenPLC v4 вы часто упираетесь в функционал, который не реализован.
-
Проблема записи Modbus: Как правильно заметили в комментариях на форуме, текущая реализация часто ограничена. Например, работа с Modbus RTU Slave может быть капризной, а полноценная поддержка записи в разные типы регистров (Holding Registers vs Coils) требует ручного «допиливания» или глубокого копания в исходниках рантайма.
Modbus — необходимый минимум для демо
Подробнее про Modbus можно почитать, например в статье Modbus RTU Basics. Или посмотреть видео OpenPLC on Raspberry Pi with Modbus или лекции элементы протокола Modbus RTU, практика по Modbus RTU.
Существует две разновидности Modbus:
-
RTU — подключение физически по двухпроводной шине
-
TCP — подключение по Ethernet или WI-FI
Как говорилось выше, мы подключаем Raspberry pi pico w по двухпроводной шине Modbus RTU с помощью Modbus-модуля MAX485 к шилду RS485 CAN HAT.
Согласно документации, и описанию из форума отладка проекта OpenPLC происходит по Modbus. В нашем демо используем Modbus TCP для онайн-монитора и отладки.
Modbus представляет собой сеть в которой присутствует один ведущий узел Master и множество ведомых устройств Slave. Master инициирует передачу данных и формирует запрос к Slave. Запрос формируется определенным образом в виде стандартного фрейма, в котором указывается:
-
адрес ведомого устройства
-
Modbus-функция
-
данные
-
контрольная сумма
Не будем подробно разбирать протокол Modbus. Дня нас важно понимать, что Raspberry pi pico w выступает в качестве Slave-устройства с заданным адресом в конфигурации проекта.
Master-устройством является Orange pi с платформой Node-red о чем будет далее.
Входные сигналы и внутренние переменные в памяти называются регистрами. Выходные сигналы называются катушками.
Основные Modbus-функции представляют собой команды на чтение и запись регистров и катушек.
Основные Modbus-функции (Function Codes)
Каждый запрос Modbus содержит код функции (Function Code, FC), определяющий тип операции и тип данных.
|
FC |
Название |
PLC-данные |
Операция |
|---|---|---|---|
|
FC01 |
Read Coils |
Дискретные выходы |
Чтение |
|
FC02 |
Read Discrete Inputs |
Дискретные входы |
Чтение |
|
FC03 |
Read Holding Registers |
Аналоговые выходы |
Чтение |
|
FC04 |
Read Input Registers |
Аналоговые входы |
Чтение |
|
FC05 |
Write Single Coil |
Один дискретный выход |
Запись |
|
FC06 |
Write Single Register |
Один Holding Register ( |
Запись |
|
FC15 |
Write Multiple Coils |
Несколько дискретных выходов |
Запись |
|
FC16 |
Write Multiple Registers |
Несколько Holding Registers ( |
Запись |
Для нашего демо наиболее важны:
-
FC03 — чтение состояния регистров: считать
CYRCLE_STATE(%MW1), чтобы узнать текущий шаг автоматического цикла. -
FC05 — запись в катушку: напрямую включить или выключить реле K1/K2 в ручном режиме.
-
FC06 — запись в один регистр: установить значение
CMD_WORD(%MW0, Modbus-адрес 32) для запуска автоматического цикла или подачи команды. -
FC01 — чтение состояния катушек: проверить текущее состояние выходов
%QX0.0(K1) и%QX0.1(K2).
Краткий экскурс в контактно-релейную логику
Кто впервые столкнулся к языками программирования PLC, концепция написания программы в виде контактно-релейной логике может быть очень непривычна поначалу. Поэтому настоятельно рекомендую посмотреть видео на канале OpenPLC, или поискать уроки на Youtube. Здесь приведу лишь основные инструкции, которые применяются в проекте. Кто хорошо знаком с программированием PLC могут смело скроллить далее.
Вкратце напомню, что в PLC символы %Q означает выход, символы %I — означает вход, а %M — меркер, или глобальные теги (переменные) в памяти. Символ X говорит о том, что это цифровой (битовый) сигнал. Например %IX0.0 значит — входной цифровой сигнал с адресом байта равным 0 и адресом бита тоже равным 0. Сигнал %QX0.1 значит цифровой выход, байт 0, бит 1. Выходной цифровой сигнал %QX часто называют катушкой (coil), название пошло от понятия катушки реле, т.к. изначально исторически электромагнитные реле повсеместно использовались в автоматике. Символ W говорит о то, что это аналоговый сигнал, как правило представляет собой слово (2 байта) из 16 разрядов (бит). Например %QW0 — аналоговый выход с адресом 0; %IW1 — аналоговый вход с адресом 1; %MW0 — глобальное слово 16 bit, адрес 0. В некоторых PLC символ процента перед типом тега упускают. Адресация и количество тегов зависит от конкретного устройство и среды разработки. Для чипов RP2040, что находятся в Raspberry pi pico адресация приведена в таблице выше.
Контактоно-релейная логика сокращенно называется LD — ladder diagram или лестничная диаграмма.
Базовые элементы
В LD логике используются следующие базовые обозначения:
Цифровой сигнал, включающий цепь — любой битовый сигнал: вход, катушка, меркер, локальный битовый сигнал
-| |-
То же самое, но активация только по фронту (нарастанию)
-|P|-
То же самое, но активация только по спаду (убыванию)
-|N|-
Инверсный контакт, т.е. размыкающий
-|/|-
Катушка — битовый сигнал активируемый цепью
-( )-
Катушка, остающаяся активной даже при отключении цепи (Set)
-(S)-
Сброс ранее активированной катушки (Reset)
-(R)-
Катушки также могут быть инверсными, активироваться по фронту или по спаду, но это используется реже. По крайней мере в моей практике редко встречались.
Терминология контактно-релейной логики исходит из электрической цепи.
Часть программы находящаяся в одной горизонтальной секции, начинающаяся с подключения к левой вертикальной черте (шине), и заканчивающаяся правой вертикальной шиной, как правило, называется цепью или сетью.
Хорошей практикой является расположение катушки только в одном месте программы, иначе прийдеться долго выискивать ошибки логики работы. Все промежуточные сигналы, включающие катушку, как правило размещают параллельно. А все отключающие сигналы — последовательно. Самоподпит — также хороший прием, позволяющий использовать всего одну цепь и одну катушку. В противном случае необходимо строить отдельно цепь на активацию катушки -(S)- и сброс -(R)-.
Инструкция MOVE
Запись значение в переменную производится с помощью инструкции MOVE наподобие, как в Assembler, но нагляднее. На LD цепи все элементы должны быть подключены к шинам, контактам или разрешающим выводам.
В OpenPLC Editor v4 разрешающие выводы EN, ENO не включены по умолчанию, поэтому после добавления инструкции на цепь, нужно по ней два раза кликнуть и в меню включить слайдер Execution Control.

Таймер TON
Подробнее про TON можно почитать в документации.
TON означает On-Delay Timer. Блок TON задерживает активацию выхода на заданное время при активации вывода IN.
Значение времени истечения таймера задается на входе PT в формате T#2s
На рисунке контакт CYCLE_RUN_SET подключен к входящей шине. Затем 2 сек таймер с нарастающим значением подключается к выходу контакта. Далее по достижению таймера 2 сек инструкция MOVE вносит значение 2 в переменную CYRCLE_STATE. И после чего активируется катушка TON0_TMP_ON, подключенная к выходной шине.

Инструкция сравнения EQ
Инструкция сравнивает две величины подобно оператору сравнения в языках программирования `==`
На рисунке на одной цепи расположены две инструкции. Первая сравнивает значение переменной CMD_WORD с значением 1, в случае равенства активируется битовый сигнал CMD_1. Вторая инструкция сравнивает CMD_WORD с значением 2, в случае равенства активируется битовый сигнал CMD_2.

Аналогичным образом в составе базовой библиотеки существуют и другие инструкции сравнения GT, GE, LT, LE, NE.
Конфигурация проекта
Управление реле представляет собой очень простой проект. Поэтому вся логика будет строиться с одном модуле Programs -> main.
А конфигурация проекта в `Device -> configuration

В конфигурации проекта выбираем:
-
тип устройства (Device): Raspberry pico w
-
USB-порт подключения к компьютеру (Communication port): в моем случае — это COM21
-
Активируем Modbus:
-
Проводная связь Выбираем
Enable Modbus RTUInterface:Serial1— в этом случае будет задействован UART0 пины GP0, GP1 Baud Rate:115200— стандартная скорость передачи данных по UART Slave ID:10— указываем любое целое число от 1 до 247 RS 485 EN Pin:3— необходимо указать управляющий пин для микросхемы модуля RS485. В нашем случае выбираем GP3. -
Беспроводная WI-FI связь Используется для отладки или на как Modbus TCP Выбираем
Enable Modbus TCPДля динамической установки IP-адреса выбираемEnable DHCPУказываем стандартные параметры авторизации к Wi-Fi
-
-
Pin mapping Здесь назначаем все входные и выходные пины. Для Raspberry pico указаны выше

Ручной режим включения реле
Опишем суть демо-PLC проекта для Raspberry pi pico w. Управлять наш PLC будет двумя реле К1 и К2. Управляющими сигналами для реле являются цифровые выводы %QX0.0 (GP14) — K1 и %QX0.1 (GP15) — K2 соответственно. Входными цифровыми сигналами включающими реле назначим %IX0.3 (GP9) — K1, %IX0.5 (GP11) — K2. Входные сигналы, отключающие реле: %IX0.4 (GP10) — K1, %IX0.6 (GP12) — K2.
Итого в ручном режиме входной цифровой сигнал активирует катушку (цифровой выход), включается реле и становится на самоподпит (сам себя удерживает в активном состоянии), т.е остается включенной пока не поступит сигнал на отключение. Входной цифровой сигнал отключения соответственно отключает катушку реле. Символ P находящийся между графическими обозначениями вертикальных пластинок входного контакта значит, что контроллер принимает сигнал по нарастающему фронту. Другими словами сигнал будет активным только в первый момент скан-цикла программы, даже если при этом физический сигнал на входном пине остается активным. Так часто в PLC-программах обрабатывают входные сигналы от кнопок.
Релейная логики включения реле K1, K2.

Автоматический цикл программы
На момент написания статьи в среде OpenPLC не реализована работа с битовыми меркерами, об этом писали на форуме. Т.е. пока невозможно назначить переменной адрес как %MX0.1 и т.п., а затем по Modbus задать значение Single Register с необходимым сочетанием битов. Но это не помешает нам реализовать управляющую логику должным образом. Выше была приведена картинка с инструкцией сравнения EQ. Так вот, были созданы вспомогательные локальные битовые переменные CMD_1, CMD_2 и др., которые практически выполняют роль битовых меркеров-тегов, но только у них локальная область видимости в рамках модуля main. Но для нас это подойдет, так как мы имеем только один программный модуль. Другими словами мы хотим удаленно управлять катушками реле не напрямую через функцию Modbus write single coil в обход всех условий цепи LD, а опосредованно с помощью входных контактов. Это важно потому, что в программе могут быть дополнительные условия разрешения управления. А прямая активация катушки обходит все условия.
Согласно таблице Modbus-адресации мы можем использовать Holding Memory Registers с адресами %MW0 – %MW19, или Modbus Data Address: 32 – 51.
Создадим переменную CMD_WORD с адресом %MW0 — в Modbus 32. В зависимости от значения этой переменной будут активироваться локальные управляющие биты, включающие или отключающие цепь катушек реле:
-
if(CMD_WORD == 1) CMD_1 = true;
-
if(CMD_WORD == 2) CMD_2 = true;
-
if(CMD_WORD == 3) CMD_3 = true;
-
if(CMD_WORD == 4) CMD_4 = true;
-
if(CMD_WORD == 5) CYCLE_RUN = true; //здесь уже запускается полностью автоматический цикл
Создадим также переменную состояния автоматического цикла CYRCLE_STATE с адресом %MW1, в которой буду фиксировать шаги последовательности.
Так как управляющая программа работает в циклическом режиме — аналог бесконечного цикла while, то в каждом цикле после проверки значения и активации управляющего бита, логика обнуляет CMD_WORD.
Опишем последовательность команд в автоматическом режиме
if(CMD_WORD == 5) CYCLE_RUN = true; если значение CMD_WORD равно 5, цикл запускается

Контакт CYCLE_RUN фиксирует активное состояние локальной битовой переменной CYCLE_RUN_SET -(S)-
Инструкция MOVE вносит значение 1 в переменную состояния CYRCLE_STATE

Далее идет пять идентичных сетей с таймерами. Опишем первую, остальные управляются аналогично — по очереди включаются и отключаются реле K1, K2.
-
Контакт CYCLE_RUN_SET запускает таймер TON0.
-
По истечении 2 сек (значение T#2s) в CYRCLE_STATE устанавливается значение 2
-
активируется сигнал TON0_TMP_ON
-
TON0_TMP_ON активирует промежуточный контакт BTN_ON_1_TMP
-
Промежуточный контакт BTN_ON_1_TMP активирует катушку реле K1. В последней цепи сбрасывается ранее установленный сигнал CYCLE_RUN_SET
-(R)-


Далее вводим вспомогательные цепи, группирующие сигналы включения катушек реле. Помните рекомендацию, о том, что выходной сигнал должен быть в одном месте? Эти цепи как раз служат для этой цели


Если подытожить и убрать детали, логика автоматического режима сводится к следующему:
-
Входной Modbus сигнал устанавливает в CMD_WORD значение 5, тем самым запуская цикл, устанавливается CYCLE_RUN_SET, CYRCLE_STATE = 1
-
Через 2 сек включается реле К1, CYRCLE_STATE = 2
-
Через 2 сек отключается реле К1, CYRCLE_STATE = 3
-
Через 2 сек включается реле К2, CYRCLE_STATE = 4
-
Через 2 сек отключается реле К2, CYRCLE_STATE = 5
-
Через 2 сек сбрасывается CYCLE_RUN_SET, CYRCLE_STATE = 0
или в виде циклограммы
|
Time, sec |
CMD_WORD |
CYRCLE_STATE |
CYCLE_RUN_SET |
K1 |
K2 |
|---|---|---|---|---|---|
|
0 |
5 |
1 |
1 |
0 |
0 |
|
2 |
0 |
2 |
1 |
1 |
0 |
|
4 |
0 |
3 |
1 |
0 |
0 |
|
6 |
0 |
4 |
1 |
0 |
1 |
|
8 |
0 |
5 |
1 |
0 |
0 |
|
10 |
0 |
0 |
0 |
0 |
0 |
Исходный код проекта находится в этом репозитории.
Тестирование управления по Modbus с помощью QModbus
Перед тем как подключать Node-RED, полезно убедиться, что OpenPLC на Pico W отвечает на Modbus-запросы корректно. Для этого удобно использовать графическую утилиту QModbus — бесплатный open-source Modbus Master с поддержкой RTU и TCP. Скачать можно на сайте проекта или из репозитория github.com/ed-chemnitz/qmodbus.
Убедитесь, что Pico W подключён к той же Wi-Fi сети, что и ваш компьютер, и OpenPLC Runtime запущен.
В QModbus:
-
Выберите вкладку Modbus TCP
-
В поля Network Address введите адрес Pico W.
-
Порт оставьте стандартным — 502.
-
Slave ID: укажите значение, заданное в конфигурации OpenPLC (в нашем примере —
10). -
Выбрать необходимую функцию из списка Function code
-
Задать адрес регистра в Start address
-
При необходимости количество регистров в Num of coils
-
В нижней части в таблице ввести необходимое значение в поле Data
-
Отправить команду, нажав кнопку Send
Что удалось сделать:
-
Собрать и подключить оборудование: Raspberry Pi Pico W, шилд RS485 CAN HAT, модули реле и STM32-IHM03 в единую макетную систему.
-
Настроить шилд RS485 CAN HAT на Orange Pi 4 Pro: пересобрать оверлей MCP2515 под тактовую частоту 12 МГц и активировать нужный UART-порт.
-
Разобраться с адресацией пинов и Modbus-регистров для чипа RP2040.
-
Создать проект в OpenPLC Editor v4: настроить конфигурацию, реализовать ручной и автоматический режим управления реле на языке LD.
-
Обойти текущее ограничение OpenPLC v4 по работе с битовыми меркерами
%MXчерез хранящееся слово%MWи инструкции сравнения EQ.
На что стоит обратить внимание:
OpenPLC v4 — живой, активно развивающийся проект, и часть функционала ещё дорабатывается. Некоторые ограничения, описанные в статье (например, работа с битовыми меркерами), могут быть устранены в будущих версиях. Следите за официальным форумом и репозиторием, если хотите использовать его в более сложных проектах.
ссылка на оригинал статьи https://habr.com/ru/articles/1025660/