LogicMachine Forum
Modbus rs485-2 - Printable Version

+- LogicMachine 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.