Logic Machine Forum
Modbus rs485-2 - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Modbus rs485-2 (/showthread.php?tid=1413)



Modbus rs485-2 - eirik - 26.05.2018

Hi

I have some projects where I need to use 2 RS485 ports on each LM5. 
On the current firmware the second port must be implemented using scripts, is this correct?

I need to integrate a heatpump with approximately 20 registers. 
It only possible to read one register at the time, with a max poll-frequense of 1 sec.

Is the datatype inside the ( ), the knx variable or the MB-registers dataype? 
All the registers are holding registers with the INT16, on modbus-slave, and are actually temperatures with the scaling 0.1.
Is this conversation done correctly in my script......?

I haven't used scripting on modbus for quite some time, so I wonder if the code is correct(ish Smile ):

Code:
--Heatpump, with a maximum polling frequens 1s for each register, and timeout 2,3sek
--If the polling of each adress is faster than 1 sec, the communication of the slave stops and the slave have to reboot
--what should the resident-script's sleep intervall be in this case (1 sec, between every execute)
--the os.sleep(1) is used to ensure that poll frequens is slow enough is this the correct approach??
--and will the log(err) be the correct code and is the value_1, err = the correct way to do this?

require('luamodbus')
mb = luamodbus.rtu()
mb:open('/dev/RS485-2', 9600, 'N', 8, 1, 'H')
mb:connect()
mb:setslave(1) --modbusadresse
mb:setresponsetimeout(3) 


--Register 1
value_1, err = mb:readregistervalue(40004, "float16")
grp.checkwrite(32/3/1, value_1*0.1) --respose-value from the slave??? 
log(err) --logs the response like time out?

os.sleep(1) --used to make sure it's only one poll to slave each second??? 

--Register 2
value_2, err = mb:readregistervalue(40014, "float16")
grp.checkwrite(32/3/2, value_2*0.1)
log(err)

os.sleep(1)

--Register 3
value_3, err = mb:readregistervalue(40018, "float16")
grp.checkwrite(32/3/3, value_3*0.1)
log(err)

os.sleep(1)
--Register 4
value_4, err = mb:readregistervalue(40062, "float16")
grp.checkwrite(32/3/4, value_4*0.1)
log(err)

os.sleep(1)

--Register 5
value_5, err = mb:readregistervalue(40080, "float16")
grp.checkwrite(32/3/5, value_5*0.1)
log(err)

os.sleep(1)

--Register 6
value_6, err = mb:readregistervalue(40106, "float16")
grp.checkwrite(32/3/6, value_6*0.1)
log(err)

os.sleep(1)

--Register 7
value_7, err = mb:readregistervalue(40128, "float16")
grp.checkwrite(32/3/7, value_7*0.1)
log(err)

os.sleep(1)

--Register 8
value_8, err = mb:readregistervalue(42102, "float16")
grp.checkwrite(32/3/8, value_8*0.1)
log(err)

os.sleep(1)

--Register 9
value_9, err = mb:readregistervalue(42148, "float16")
grp.checkwrite(32/3/9, value_9*0.1)
log(err)

os.sleep(1)

--Register 10
value_10, err = mb:readregistervalue(43002, "float16")
grp.checkwrite(32/3/10, value_10*0.1)
log(err)

os.sleep(1)

--Register 11
value_11, err = mb:readregistervalue(43008, "float16")
grp.checkwrite(32/3/11, value_11*0.1)
log(err)

os.sleep(1)

--Register 12
value_12, err = mb:readregistervalue(43018, "float16")
grp.checkwrite(32/3/12, value_12*0.1)
log(err)

os.sleep(1)

--Register 13
value_13, err = mb:readregistervalue(43038, "float16")
grp.checkwrite(32/3/13, value_13*0.1)
log(err)

os.sleep(1)

--Register 14
value_14, err = mb:readregistervalue(43146, "float16")
grp.checkwrite(32/3/14, value_14*0.1)
log(err)

os.sleep(1)

--Register 15
value_15, err = mb:readregistervalue(44004, "float16")
grp.checkwrite(32/3/15, value_15*0.1)
log(err)

os.sleep(1)

--Register 16
value_16, er = mb:readregistervalue(44008, "float16")
grp.checkwrite(32/3/16, value_16*0.1)
log(err)

os.sleep(1)

--Register 17
value_17, err = mb:readregistervalue(44010, "float16")
grp.checkwrite(32/3/17, value_17*0.1)
log(err)

os.sleep(1)

--Register 18
value_18, err = mb:readregistervalue(44018, "float16")
grp.checkwrite(32/3/18, value_18*0.1)
log(err)

os.sleep(1)

--Register 19
value_19, err = mb:readregistervalue(44124, "float16")
grp.checkwrite(32/3/19, value_19*0.1)
log(err)

os.sleep(1)

--Register 20
value_20, err = mb:readregistervalue(44126, "float16")
grp.checkwrite(32/3/20, value_20*0.1)
log(err)

os.sleep(1)

mb:close()

Hope someone could give me some feedback or friendly advise on this one Big Grin

BR
Eirik


RE: Modbus rs485-2 - admin - 26.05.2018

Data type is for modbus, so you need to place int16 there. This script can be simplified by using a table with registers and output addresses. It will minimize chanced of copy-paste errors.