(09.08.2022, 06:27)admin Wrote: If you only need read-only values on the modbus side you can simply periodically update the register values in the resident script itself. Modify register mapping in updateregisters() as needed. Each script must use a unique port (502, 503 etc).
Code:if not mb then
require('luamodbus')
mb = luamodbus.tcp()
mb:open('0.0.0.0', 502)
mb:setslave(2)
function setint64(grpaddr, regaddr)
local value = grp.getvalue(grpaddr) or 0
local raw = knxdatatype.encode(value, dt.int64).dataraw
local r1 = raw:byte(2) * 0x100 + raw:byte(1)
local r2 = raw:byte(4) * 0x100 + raw:byte(3)
local r3 = raw:byte(6) * 0x100 + raw:byte(5)
local r4 = raw:byte(8) * 0x100 + raw:byte(7)
mb:setregisters(regaddr, r4, r3, r2, r1)
end
function updateregisters()
setint64('32/1/1', 3204)
end
mb:setmapping(0, 0, 3300, 0)
updateregisters()
prev = os.time()
end
mb:handleslave()
curr = os.time()
if curr ~= prev then
updateregisters()
prev = curr
end
Sorry Admin, using your script (without modify it, except '32/1/1') no communication with Modbus master is possible.
Note : I suspended cyclic "Modbus handler" script and preserved "mbproxy" script in common functions.
Perhaps interesting for you 'timeout ?' > founded by monotoring in log :
res, err = mb:handleslave()
log("mb:handleslave :",res,err)
* arg: 1
* string: mb:handleslave :
* arg: 2
* nil
* arg: 3
* string: timeout