![]() |
|
Gateway Modbus RTU to Modbus TCP - Printable Version +- LogicMachine Forum (https://forum.logicmachine.net) +-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1) +--- Forum: Gateway (https://forum.logicmachine.net/forumdisplay.php?fid=10) +--- Thread: Gateway Modbus RTU to Modbus TCP (/showthread.php?tid=2078) |
Gateway Modbus RTU to Modbus TCP - davidsilva - 10.05.2019 Hi, I have 4 meters connected by Modbus RTU (attachment). I would like that the Logic Machine works as a Modbus TCP Slave with this 4 meters and with same ID and registers, and then connect to other device. I.e. the Logic Machine works as a Gateway Modbus RTU to Modbus TCP. Best regards, RE: Gateway Modbus RTU to Modbus TCP - admin - 11.05.2019 This is not possible with default Modbus TCP slave as it only supports one slave ID / one set of registers. One solution is to use single slave ID but different registers addresses for each RTU slave. RE: Gateway Modbus RTU to Modbus TCP - EBMel - 12.05.2019 Will it be possible to program the LogicMachine so that the meter 1 will useĀ Modbus TCP slaveĀ register 1-100, meter 2 register 101-200 ........? The Modbus TCP slave exampel only shows register starting from 1. An exampel/instructions where defined registerts are set would be great! RE: Gateway Modbus RTU to Modbus TCP - admin - 13.05.2019 Actual Modbus addressing starts from 0. Documentation for some devices have addressing starting from 1 which creates confusion. Here's modified slave script where you can specify addresses directly and there can be gaps in register map, for example: 0..15 for meter 1; 100..115 for meter 2 etc. This script supports 16-bit values only. If only one way communication is needed (Modbus values are read-only) then it can be modified to support 32-bit and 64-bit values internally without additional scripts for splitting values into 16-bit parts. Code: if not mb then
require('luamodbus')
-- list of coil mapping, register mapping and register data types
coils, registers, regdt = {}, {}, {}
-- coil definition
coils[ 0 ] = '1/1/1'
coils[ 1 ] = '1/1/2'
-- register definition
registers[ 0 ] = '2/2/2'
regdt[ 0 ] = dt.int8
registers[ 1 ] = '2/2/3'
regdt[ 1 ] = dt.uint16
-- knx group write callback
function knxgroupwrite(event)
local value
-- try to find matching coil
for id, addr in pairs(coils) do
if event.dst == addr then
value = busdatatype.decode(event.datahex, dt.bool)
mb:setcoils(id, value)
end
end
-- try to find matching register
for id, addr in pairs(registers) do
if event.dst == addr then
value = busdatatype.decode(event.datahex, regdt[ id ])
mb:setregisters(id, value)
end
end
end
-- coil write callback
function mbwritecoils(coil, value)
local addr = coils[ coil ]
if addr then
grp.write(addr, value, dt.bool)
end
end
-- register write callback
function mbwriteregisters(register, value)
local addr = registers[ register ]
if addr then
grp.write(addr, value, regdt[ register])
end
end
-- knx group monitor, handles group writes
busclient = require('localbus').new(0.1)
busclient:sethandler('groupwrite', knxgroupwrite)
-- modbus slave, listen on all interfaces and default port 502
mb = luamodbus.tcp()
mb:open('0.0.0.0', 502)
-- setting slave id is optional
-- mb:setslave(1)
mb:setreceivetimeout(0.1)
mb:setmapping(table.maxn(coils) + 1, 0, table.maxn(registers) + 1, 0)
-- init coils
for id, addr in pairs(coils) do
value = grp.getvalue(addr)
mb:setcoils(id, value)
end
-- init registers
for id, addr in pairs(registers) do
value = grp.getvalue(addr)
mb:setregisters(id, value)
end
-- set callbacks for coil and register write
mb:setwritecoilcb(mbwritecoils)
mb:setwriteregistercb(mbwriteregisters)
end
-- handle modbus and knx
mb:handleslave()
busclient:step() |