04.04.2019, 07:44
Hi
Here is modified slave script. I doubled the arrays for registers and added a shift. Fill accordingly all the arrays. registers1 will start from 4096 and registers2 will start from 8192. Make sure you add corresponding regdt for each register. Shift can be changes by shiftR1 or shiftR2 parameter.
Here is modified slave script. I doubled the arrays for registers and added a shift. Fill accordingly all the arrays. registers1 will start from 4096 and registers2 will start from 8192. Make sure you add corresponding regdt for each register. Shift can be changes by shiftR1 or shiftR2 parameter.
Code:
if not mb then
require('genohm-scada.eibdgm')
require('luamodbus')
-- list of coil mapping, starting from 0
coils = { }
-- registers table 1 shift starting from 1
shiftR1 = 4095
-- list of register mapping, starting from 4096
registers1 = { '3/1/26', '3/1/29' }
-- list of register data types, element count must match registers table
regdt1 = { dt.int16, dt.int16 }
-- registers table 2 shift starting from 1
shiftR2 = 8191
-- list of register mapping, starting from 8192
registers2 = { '3/1/32', '3/1/35' }
-- list of register data types, element count must match registers table
regdt2 = { dt.int16, dt.int16 }
-- knx group write callback
function knxgroupwrite(event)
local value
-- try to find matching coil
for id, addr in ipairs(coils) do
if event.dst == addr then
value = knxdatatype.decode(event.datahex, dt.bool)
mb:setcoils(id - 1, value)
end
end
-- try to find matching register1
for id, addr in ipairs(registers1) do
if event.dst == addr then
value = knxdatatype.decode(event.datahex, regdt1[ id ])
mb:setregisters(id + shiftR1, value)
end
end
-- try to find matching register2
for id, addr in ipairs(registers2) do
if event.dst == addr then
value = knxdatatype.decode(event.datahex, regdt2[ id ])
mb:setregisters(id + shiftR2, value)
end
end
end
-- coil write callback
function mbwritecoils(coil, value)
local addr = coils[ coil + 1 ]
if addr then
grp.write(addr, value, dt.bool)
end
end
-- register write callback
function mbwriteregisters(register, value)
local addr1 = registers1[ register -shiftR1 ]
local addr2 = registers2[ register -shiftR2 ]
if addr1 then
grp.write(addr1, value, regdt1[ register - shiftR1])
elseif addr2 then
grp.write(addr2, value, regdt2[ register - shiftR2])
end
end
-- knx group monitor, handles group writes
knxclient = eibdgm:new({ timeout = 0.1 })
knxclient: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(#coils, 0, shiftR2 + 1 + #registers2, 0)
-- init coils
for id, addr in ipairs(coils) do
value = grp.getvalue(addr)
mb:setcoils(id - 1, value)
end
-- init registers1
for id, addr in ipairs(registers1) do
value = grp.getvalue(addr)
mb:setregisters(id + shiftR1, value)
end
-- init registers2
for id, addr in ipairs(registers2) do
value = grp.getvalue(addr)
mb:setregisters(id + shiftR2, value)
end
-- set callbacks for coil and register write
mb:setwritecoilcb(mbwritecoils)
mb:setwriteregistercb(mbwriteregisters)
end
-- handle modbus and knx
mb:handleslave()
knxclient:step()
------------------------------
Ctrl+F5
Ctrl+F5