Горячая линия Embedded System Rus:8-800-775-06-34 (звонок по России бесплатный)

LM5_N
LM-Wall_N
DALI_N
Vita_N

Запись значения Modbus RTU мультиметра в групповой адрес KNX шины

Задача

Прочитать два параметра (напряжение и сила тока) из мультиметра ABB DMTME и сохранить данные в групповом адресе шины KNX.

Внимание! Будьте внимательны при соединении LogicMachine c Modbus устройством. RS485 «A» необходимо завести на «плюс» (D+), а RS485 «B» — на «минус» (D-).

Добавление объектов KNX

Во вкладке Объекты (Objects) добавляем два KNX объекта. В нашем случае:

  • 5/5/1 – для записи напряжения
  • 5/5/2 – для записи силы тока

Modbus программа

  • Переходим в меню LogicMachine -> Скрипты -> Резидентные (LogicMachine -> Scripting -> Resident) для добавления нового резидентного скрипта, который будет периодически считывать данные с устройства Modbus и записывать их в соответствующий групповой адрес шины KNX.
Нажмем на иконку редактирования скрипта для добавления следующего программного кода:
-- инициализируем  Modbus при первом запуске скрипта
require('luamodbus')
mb = luamodbus.rtu()
-- название и номер порта RS-485 (для LM2 используйте '/dev/ttyS2')
mb:open('/dev/RS485-1', 9600, 'E', 8, 1, 'H')
mb:connect()
 
-- устанавливаем slave ID для чтения и записи данных 
mb:setslave(20)
 
-- читаем  значение напряжения из 32-bit регистра
r1, r2 = mb:readregisters(0x1000, 2)
result = bit.lshift(r1, 16) + r2
grp.write('5/5/1',result)
 
-- читаем  значение силы тока из 32-bit регистра
r1, r2 = mb:readregisters(0x100E, 2)
result = bit.lshift(r1, 16) + r2
grp.write('5/5/2',result)
 
-- закрываем порт
mb:close()

Примечание! Данные Modbus очень часто сохраняются в 16-битных регистрах. В случае если требуется 32 бита, значения должны быть считаны из пары соседних регистров, как в этом примере.

Визуализация объектов Modbus

Используя функцию grp.write свяжите Modbus объект с объектом KNX и используйте новый KNX объект в визуализации.

Еще несколько функций для работы с Modbus

    • Открыть tcp соединение Modbus

 

-- Открыть Modbus TCP соединение:
require('luamodbus')
mb = luamodbus.tcp()
mb:open('192.168.1.1', 1502)
mb:connect()
mb:close()
end

  • Прочитать несколько (count) значений из регистров (registers/coils), начиная со стартового адреса. Функция возвращает все значения, в случае ошибки возвращает nil, и описание ошибки:
mb:readcoils(start, count)
mb:readdiscreteinputs(start, count)
mb:readregisters(start, count)
mb:readinputregisters(start, count)

  • Запись нескольких значений в регистры (registers/coils), начиная со стартового адреса. Функция возвращает успешно записанные данные или nil и описание ошибки в случае неудачи:

Исходный код:

mb:writebits(start, v1, [v2, [v3, …]])

mb:writeregisters(start, v1, [v2, [v3, …]])

  • Прочитать внутренние данные подчиненного устройства. Функция возвращает данные или nil и описание ошибки в случае неудачи:
Исходный код
mb:reportslaveid()