Рассмотрим решение следующей практической задачи:
Необходимо организовать связь двух модулей MP712m Laurent-5 или MP718m Laurent-5G, чтобы один мог управлять другим по сети и обратно - второй модуль в случае события мог отправить команды управления на первый модуль.
Для конкретики, предположим что к первому модулю подключена кнопка (к линии общего назначения IO_1). Нужно что бы при нажатии на нее на втором модуле включалось реле RELE_1.
Задача связи двух и более модулей ранее уже рассматривалась в рамках статьи "Дистанционное управление кнопкой по Enternet с помощью mp718m Laurent-5G".
В ней использовался подход передачи Ke-команд управления через HTTP GET запрос с вызова Ke-команды $KE,URL в качестве реакции на событие в системе логических правил CAT. В текущей статье рассмотрим другой вариант возможной реализации - с использованием TCP клиента и команды $KE,PUT.
Итак, предположим, что в сети есть два модуля Laurent-5. У первого IP адрес 192.168.0.101, а у второго - 192.168.0.102. Давайте их "свяжем" друг с другом с помощью TCP клиентов. В каждом модуле, помимо TCP сервера, ожидающего подключений клиентов на порту 2424, есть так же и независимый TCP клиент. Ему указываются IP и порт сервера, к которому он должен сам подключиться и пытаться поддерживать связь (переподключаться автоматически, например, после сброса питания или разрыва сети).
По установленному подключению TCP клиент-сервер можно обмениваться Ke-командами управления между модулями в обе стороны, в том числе, в автономном режиме, связав различные события (нажатия кнопок, показания датчиков и т.д.) с отправкой данных по TCP соединению в системе логических правил CAT.
Заходим в WEB интерфейсе 1-го модуля в раздел "TCP клиент":
Задаем IP адрес второго модуля (192.168.0.102) и TCP порт сервера 2-го модуля (по умолчанию - 2424). Включаем TCP клиент соответствующей "галочкой". Если все в порядке (модули оба видны в сети, порт 2424 второго модуля не занят другой программой и т.д.) - статус клиента поменяется на значение "Подключено".
Аналогично настроим TCP клиент 2-го модуля на связь с 1-ым модулем:
Отлично! Теперь между модулями налажена двухсторонняя связь по TCP. Можно уже даже передавать Ke-команды управления с одного модуля на другой, но для начала следует выключить систему безопасности на обоих модулях. Иначе каждый из модулей потребует разблокировки интерфейса через пароль. В данном простом примере ограничимся просто выключением запроса пароля при обмене командами по TCP.
Для этого заходим в WEB в раздел "Общие Настройки" → "Безопасность" и снимаем соответствующую галочку:
Настало время проверить связку модулей. Для отладки, давайте отправим Ke-команду управления с одного модуля на другой, например команду на включение реле. Для этого воспользуемся Ke-командой $KE,PUT которая будучи выполненной на конкретном модуле позволяет отправить произвольный набор байт данных в указанный интерфейс (TCP сервер, TCP клиент, порт RS-232 и т.д.).
Полный список всех Ke-команд поддерживаемых модулем можно найти в соответствующем документе Описание Ke-команд управления
Ke-команда для включения, например, 1-го реле выглядит следующим образом:
$KE,REL,1,1
Передадим ее на второй модуль с использованием Ke-комады $KE,PUT. Напомним, что команда позволяет отправить текстовую строку либо произвольный набор символов (включая непечатные) в HEX форме в указанный интерфейс (TCP сервер, TCP клиент, RS-232). Поскольку в теле команды управления реле есть непечатные символы (возврат каретки / перенос на новую строку) - то данные направим в интерфейс TCP клиента в HEX виде.
$KE,PUT,С,H,<Тело Ke-команды в HEX виде>
Подробности о том как перевести тело команды из ASCII (печатного текстового вида) в HEX можно найти в статье Конвертор Ke-команд в HEX.
Преобразовав команду $KE,REL,1,1 в HEX вид (добавив так же в конец символы возврата каретки и переноса на новую строку 0D 0A), помещаем полученную HEX строку в команду $KE,PUT:
$KE,PUT,C,H,244b452c52454c2c312c310d0a
Можно проверить, что с помощью этой команды выполненной на 1-ом модуле мы сможем включить 1-ое реле на втором модуле. Зайдем в терминал KE-команд в WEB интерфейсе 1-го модуля, скопируем туда эту команду и выполним ее:
На 2-ом модуле произойдет включение RELE_1, в чем можно убедиться через WEB интерфейс. Соответственно, если теперь использовать эту команду как реакцию на событие CAT, то можно автоматизировать управление ресурсами второго модуля при возникновении событий на 1-ом и аналогично в обратную сторону.
Займемся системой CAT, но для начала - наладим аппаратные ресурсы. На первом модуле нужно подключить кнопку (или любой механический контакт, например геркон), чтобы детектировать факт его срабатывания. Подключать будем кнопку к линии общего назначения IO_1. Ее нужно перевести в режим "на вход" что бы детектировать уровень напряжения на входе линии.
По умолчанию, все IO линии модуля настроены "на выход". Нажимаем на "стрелочку" возле линии IO_1 что бы перевести ее в режим "на вход".
После изменения направления WEB интерфейс будет выглядеть следующим образом. При этом детектируемый входной сигнал (высокий / низкий уровень) может "плавать", если линию оставить "висящей в воздухе".
Подключим к линии IO_1 подтягивающий резистор от клеммы +3.3 (напряжение +3.3 В от встроенного стабилизатора напряжения на плате). Теперь, если кнопка (контакт) не нажата, то на линии будет высокий уровень напряжения (+3.3 В через резистор). Если кнопку нажать (замкнуть контакт) - то на линии будет логический ноль ("посадим" IO_1 на землю).
Добавим исходно запрошенную автоматику - отправка команды на включение реле на втором модуле при нажатии на кнопку на 1-ом модуле. Будем использовать систему CAT - редактируемые логические правила.
Создаем новое CAT событие - по изменению уровня сигнала на линии IO:
Выбираем линию IO_1 и тип события - при изменении уровня входного сигнала на линии с высокого на низкий (замыкание линии на "землю").
Секцию дополнительных условий пропускаем. Настройки квот можно оставить по умолчанию. На следующем шаге - реакция. Задаем ее в виде списка Ke-команд. В частности, выполним ранее подготовленную команду $KE,PUT с помощью которой направим команду включения реле на 2-ой модуль через соединение по TCP клиенту.
На последнем шаге можно дать удобное текстовое имя событию. После создания события оно появляется в списке в выключенном состоянии. Его следует включить с помощью соответствующей иконки.
Теперь при нажатии на кнопку подключенную к входной линии IO_1 модуль отправит по соединению TCP клиента набор байт представленных в виде HEX строки 244b452c52454c2c312c310d0a через Ke-команду $KE,PUT. Поскольку TCP клиент 1-го модуля установил соединение с TCP сервером 2-го модуля - он воспримет эти данные как KE-команду и выполнит ее. В частности, включит RELE_1.