Статьи / KA054 /
Прямое взаимодействие двух Laurent-5 / 5G через TCP клиент
§ 54. Прямое взаимодействие двух Laurent-5 / 5G через TCP клиент
|
Дмитрий Иванов, 28 Мая 2021
|
Рассмотрим решение следующей практической задачи:
Необходимо организовать связь двух модулей Laurent-5 или Laurent-5G что бы один мог управлять другим по
сети и обратно - второй модуль в случае события мог отправить команды управления на первый модуль.
Для конкретики, предположим что к первому модулю подключена кнопка (к линии общего назначения IO_1).
Нужно что бы при нажатии на нее на втором модуле включалось реле RELE_1.
Задача связи двух и более модулей ранее уже рассматривалась в рамках статьи
§ 45. "Удлинитель" механической кнопки по Ethernet.
В ней использовался подход передачи 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-команда для включения, например, 1-го реле выглядит следующим образом:
$KE,REL,1,1
Передадим ее на второй модуль с использованием Ke-комады $KE,PUT. Напомним,
что команда позволяет отправить текстовую строку либо произвольный набор символов (включая непечатные) в HEX форме
в указанный интерфейс (TCP сервер, TCP клиент, RS-232). Поскольку в теле команды управления реле есть непечатные символы
(возврат каретки / перенос на новую строку) - то данные направим в интерфейс TCP клиента в HEX виде.
$KE,PUT,С,H,<Тело 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.

© Дмитрий Иванов
28 Мая 2021 года
http://www.kernelchip.ru