Задача
Прочитать два параметра (напряжение и сила тока) из мультиметра 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()
mb:reportslaveid()