Help me Binding Modbus 1.9.0 holding

Who can help me.
It has long been expected that the time of a binding update but I can not make it work.
My equipment (DFTS) communicates with Openhab via serial RS232 and Modbus RTU binding.
The DFTS technical specifications say that contains a RAM memory organized in 16-bit registers each (Word).
Each Word contains information regarding the status of the bus modules connected to DFTS, then returning values ​​or input bits and set values ​​or bits to control the outputs.

The inputs can view them while the outputs I can not control them.
Technical support recommends the MODBUS RTU functions that should be used are:

  • To read any Word: Function 3 (read registers)
  • To write any Word: Function 16 (Write multiple registers)

To act on the individual on the individual points (virtual or real) you must act on the relevant Word bit to be understood in decimal format
(Thus the function 16 is to be understood 16 decimal, that is to say 0x10 hex)
The syntax is that used in MODBUS RTU protocol.

File Congfig.cfg

modbus:poll=300
modbus:writemultipleregisters=true

//INGRESSI

#MODULO DFTA ID1
modbus:serial.I1.connection=COM8:19200:8:none:1:rtu
modbus:serial.I1.id=1
modbus:serial.I1.start=1
modbus:serial.I1.length=1
modbus:serial.I1.type=holding

#MODULO DFAI ID2
modbus:serial.I2.connection=COM8:19200:8:none:1:rtu
modbus:serial.I2.id=1
modbus:serial.I2.start=2
modbus:serial.I2.length=1
modbus:serial.I2.type=holding

#MODULO DFAI ID3
modbus:serial.I3.connection=COM8:19200:8:none:1:rtu
modbus:serial.I3.id=1
modbus:serial.I3.start=3
modbus:serial.I3.length=1
modbus:serial.I3.type=holding

#MODULO DFDM ID4
modbus:serial.I4.connection=COM8:19200:8:none:1:rtu
modbus:serial.I4.id=1
modbus:serial.I4.start=4
modbus:serial.I4.length=1
modbus:serial.I4.type=holding

#MODULO DF4IV ID9
modbus:serial.I9.connection=COM8:19200:8:none:1:rtu
modbus:serial.I9.id=1
modbus:serial.I9.start=9
modbus:serial.I9.length=1
modbus:serial.I9.type=holding

#MODULO DF4IV ID10
modbus:serial.I10.connection=COM8:19200:8:none:1:rtu
modbus:serial.I10.id=1
modbus:serial.I10.start=10
modbus:serial.I10.length=1
modbus:serial.I10.type=holding

#MODULO DF4IV ID11
modbus:serial.I11.connection=COM8:19200:8:none:1:rtu
modbus:serial.I11.id=1
modbus:serial.I11.start=11
modbus:serial.I11.length=1
modbus:serial.I11.type=holding

#MODULO DF4IV ID12
modbus:serial.I12.connection=COM8:19200:8:none:1:rtu
modbus:serial.I12.id=1
modbus:serial.I12.start=12
modbus:serial.I12.length=1
modbus:serial.I12.type=holding

//USCITE

#MODULO USCITE ID1 DF4R
modbus:serial.O1.connection=COM8:19200:8:none:1:rtu
modbus:serial.O1.id=1
modbus:serial.O1.start=257
modbus:serial.O1.length=1
modbus:serial.O1.type=holding

#MODULO USCITE ID2 DF4RP
modbus:serial.O2.connection=COM8:19200:8:none:1:rtu
modbus:serial.O2.id=1
modbus:serial.O2.start=258
modbus:serial.O2.length=1
modbus:serial.O2.type=holding

#MODULO USCITE ID4 DFDM
modbus:serial.O4.connection=COM8:19200:8:none:1:rtu
modbus:serial.O4.id=1
modbus:serial.O4.start=260
modbus:serial.O4.length=1
modbus:serial.O4.type=holding
modbus:serial.O4.valuetype=int8

#MODULO USCITE ID9-10-11-12 DF4IV
modbus:serial.V9.connection=COM8:19200:8:none:1:rtu
modbus:serial.V9.id=1
modbus:serial.V9.start=265
modbus:serial.V9.length=1
modbus:serial.V9.type=holding
modbus:serial.V9.valuetype=bit

#MODULO USCITE ID9-10-11-12 DF4IV
modbus:serial.V10.connection=COM8:19200:8:none:1:rtu
modbus:serial.V10.id=1
modbus:serial.V10.start=266
modbus:serial.V10.length=1
modbus:serial.V10.type=holding
modbus:serial.V10.valuetype=bit

#MODULO USCITE ID9-10-11-12 DF4IV
modbus:serial.V11.connection=COM8:19200:8:none:1:rtu
modbus:serial.V11.id=1
modbus:serial.V11.start=267
modbus:serial.V11.length=1
modbus:serial.V11.type=holding
modbus:serial.V11.valuetype=bit

#MODULO USCITE ID9-10-11-12 DF4IV
modbus:serial.V12.connection=COM8:19200:8:none:1:rtu
modbus:serial.V12.id=1
modbus:serial.V12.start=268
modbus:serial.V12.length=1
modbus:serial.V12.type=holding
modbus:serial.V12.valuetype=bit

File Items

//Versione del 26/03/2016
Group All
Group s_i “Stato Ingressi” (ALL)
Group s_o “Stato Uscite” (ESE)
Group c_o “Comandi Uscite” (GIMP)
Group Weather (All)

/* Temperatura ESTERNA*/

Number TemperaturaExt “Temp. Ext. [%.1f °C]” (ALL)
Number Temp_ext “Temp. Ext. [%d]” (All) {modbus=“I1:0”}

/* digital input*/

Number D_Input_1 “Input_1 [%d]” (All) {modbus=“I2:0” }
Number D_Input_2 “Input_2 [%d]” (All) {modbus=“I3:0” }

/* STATO INGRESSI */

Contact I9_1 “Ingresso_I9_1 [MAP(on_off.map):%s]” (s_i) { modbus=“I9:0” }
Contact I9_2 “Ingresso_I9_2 [MAP(on_off.map):%s]” (s_i) { modbus=“I9:1” }
Contact I9_3 “Ingresso_I9_3 [MAP(on_off.map):%s]” (s_i) { modbus=“I9:2” }
Contact I9_4 “Ingresso_I9_4 [MAP(on_off.map):%s]” (s_i) { modbus=“I9:3” }

Contact I10_1 “Ingresso_I10_1 [MAP(on_off.map):%s]” (s_i) { modbus=“I10:0” }
Contact I10_2 “Ingresso_I10_2 [MAP(on_off.map):%s]” (s_i) { modbus=“I10:1” }
Contact I10_3 “Ingresso_I10_3 [MAP(on_off.map):%s]” (s_i) { modbus=“I10:2” }
Contact I10_4 “Ingresso_I10_4 [MAP(on_off.map):%s]” (s_i) { modbus=“I10:3” }

Contact I11_1 “Ingresso_I11_1 [MAP(on_off.map):%s]” (s_i) { modbus=“I11:0” }
Contact I11_2 “Ingresso_I11_2 [MAP(on_off.map):%s]” (s_i) { modbus=“I11:1” }
Contact I11_3 “Ingresso_I11_3 [MAP(on_off.map):%s]” (s_i) { modbus=“I11:2” }
Contact I11_4 “Ingresso_I11_4 [MAP(on_off.map):%s]” (s_i) { modbus=“I11:3” }

Contact I12_1 “Ingresso_I12_1 [MAP(on_off.map):%s]” (s_i) { modbus=“I12:0” }
Contact I12_2 “Ingresso_I12_2 [MAP(on_off.map):%s]” (s_i) { modbus=“I12:1” }
Contact I12_3 “Ingresso_I12_3 [MAP(on_off.map):%s]” (s_i) { modbus=“I12:2” }
Contact I12_4 “Ingresso_I12_4 [MAP(on_off.map):%s]” (s_i) { modbus=“I12:3” }

/*COMANDO USCITE */

Switch O1_1 “O1_1_” (c_o) { modbus=“O1:0” }
Switch O1_2 “O1_2_” (c_o) { modbus=“O1:1” }
Switch O1_3 “O1_3_” (c_o) { modbus=“O1:2” }
Switch O1_4 “O1_4_” (c_o) { modbus=“O1:3” }

Switch O2_1 “O2_1_” (c_o) { modbus=“O2:0” }
Switch O2_2 “O2_2_” (c_o) { modbus=“O2:1” }
Switch O2_3 “O2_3_” (c_o) { modbus=“O2:2” }
Switch O2_4 “O2_4_” (c_o) { modbus=“O2:3” }

Number Light_Dimmer “Dimmer [%d]” (s_o) {modbus=“O4:0”}

File Sitemap

sitemap duemmegi label=“La mia sitemap”
{

			/* Temperatura Esterna */

Frame label=“Temperatura” {
Text item=TemperaturaExt label=“Esterna [%.1f °C]”
}

Frame label="Digital Input" {
	Text item=D_Input_1 label="Digital Input_1[%.0f DI]" 
	Text item=D_Input_2 label="Digital Input_2[%.0f DI]"
		}	

	Frame label="GESTIONE IMPIANTO" {
		Group item=s_i label="STATO INGRESSI" icon="firstfloor"
		Group item=c_o label="COMANDO USCITE" icon="firstfloor" {
	
	Frame label="Dimmer" {
Group  item= c_o label="COMANDO DIMMER" icon= "firstfloor" {
Slider item=Light_Dimmer label="Comando Slider [%.0f Lux]" icon="slider"  sendFrequency=5 switchSupport 
Setpoint item=Light_Dimmer label="Comando Up Down" icon="slider" minValue=0 maxValue=100 step=10 
Switch item=Light_Dimmer label="Preset" icon="" mappings=[0="OFF", 20="20%", 40="40%", 60="60%", 80="80%", 100="100%"]
}
}	
	Frame label="rele" {
Group  item= c_o label="COMANDO rele" icon= "firstfloor" {
Switch item=O1_1 label="1" icon="switch" //mappings=[0="OFF", 2="on"]
Switch item=O1_2 label="2" icon="switch" //mappings=[0="OFF", 2="on"]	
Switch item=O1_3 label="3" icon="switch" //mappings=[0="OFF", 4="on"]
Switch item=O1_4 label="4" icon="switch" //mappings=[0="OFF", 8="on"]

Switch item=O2_1 label="1" icon="switch" //mappings=[0="OFF", 2="on"]
Switch item=O2_2 label="2" icon="switch" //mappings=[0="OFF", 2="on"]	
Switch item=O2_3 label="3" icon="switch" //mappings=[0="OFF", 4="on"]
Switch item=O2_4 label="4" icon="switch" //mappings=[0="OFF", 8="on"]


Slider item=Light_dimmer label="word [%.0f ]" icon="" 

}

}
}
}
}

Could you please make a minimal config, with single slave, and single item bound to that slave? Then take verbose logs from that and paste to pastebin.com

You mentioned that the reading worked but writing did not, did you get some error?

Please note the limitation with writing when using valuetype=bit:

Best
Sami

I’m sorry I wanted to make the most possible knowledge available

File CFG

modbus:poll=300
modbus:writemultipleregisters=true

//USCITE

#MODULO USCITE ID1 DF4R
modbus:serial.O1.connection=COM8:19200:8:none:1:rtu
modbus:serial.O1.id=1
modbus:serial.O1.start=257
modbus:serial.O1.length=1
modbus:serial.O1.type=holding
modbus:serial.O1.valuetype=bit

#MODULO USCITE ID2 DF4RP
modbus:serial.O2.connection=COM8:19200:8:none:1:rtu
modbus:serial.O2.id=1
modbus:serial.O2.start=258
modbus:serial.O2.length=1
modbus:serial.O2.type=holding
modbus:serial.O2.valuetype=bit

File ITEMS

Group All
Group c_o “Comandi Uscite” (GIMP)

/*COMANDO USCITE */

Switch O1_1 “O1_1_” (c_o) { modbus=“O1:0” }
Switch O1_2 “O1_2_” (c_o) { modbus=“O1:1” }
Switch O1_3 “O1_3_” (c_o) { modbus=“O1:2” }
Switch O1_4 “O1_4_” (c_o) { modbus=“O1:3” }

Switch O2_1 “O2_1_” (c_o) { modbus=“O2:0” }
Switch O2_2 “O2_2_” (c_o) { modbus=“O2:1” }
Switch O2_3 “O2_3_” (c_o) { modbus=“O2:2” }
Switch O2_4 “O2_4_” (c_o) { modbus=“O2:3” }

File SITEMAP

sitemap duemmegi label=“La mia sitemap”
{
Frame label=“rele” {
Group item= c_o label=“COMANDO rele” icon= “firstfloor” {
Switch item=O1_1 label=“Rele 1 Scheda ID1 (word 257)” icon=“switch” //mappings=[0=“OFF”, 2=“on”]
Switch item=O1_2 label=“Rele 2 Scheda ID1 (word 257)” icon=“switch” //mappings=[0=“OFF”, 2=“on”]
Switch item=O1_3 label=“Rele 3 Scheda ID1 (word 257)” icon=“switch” //mappings=[0=“OFF”, 4=“on”]
Switch item=O1_4 label=“Rela 4 Scheda ID1 (word 257)” icon=“switch” //mappings=[0=“OFF”, 8=“on”]

Switch item=O2_1 label="Rele 1 Scheda ID2 (word 258)" icon="switch" //mappings=[0="OFF", 2="on"]
Switch item=O2_2 label="Rele 2 Scheda ID2 (word 258)" icon="switch" //mappings=[0="OFF", 2="on"]	
Switch item=O2_3 label="Rele 3 Scheda ID2 (word 258)" icon="switch" //mappings=[0="OFF", 4="on"]
Switch item=O2_4 label="Rele 4 Scheda ID2 (word 258)" icon="switch" //mappings=[0="OFF", 8="on"]
	}

}
}

ERROR

22:00:16.437 [ERROR] [w.m.io.ModbusSerialTransaction:199 ] - execute try 1/3 er
ror: I/O exception - failed to read. Request: net.wimpi.modbus.msg.ReadMultipleR
egistersRequest@7ed88d (unit id 1 & transaction 3923). Serial parameters: Serial
Parameters@161bacc[portName=COM8,baudRate=19200,flowControlIn=none,flowControlOu
t=none,databits=8,stopbits=1,parity=none,encoding=rtu,echo=false,receiveTimeoutM
illis=1500]
22:00:16.510 [INFO ] [w.m.io.ModbusSerialTransaction:213 ] - execute eventually
succeeded with 1 re-tries. Request: net.wimpi.modbus.msg.ReadMultipleRegistersR
equest@7ed88d. Serial parameters: SerialParameters@161bacc[portName=COM8,baudRat
e=19200,flowControlIn=none,flowControlOut=none,databits=8,stopbits=1,parity=none
,encoding=rtu,echo=false,receiveTimeoutMillis=1500]
22:00:23.390 [ERROR] [i.modbus.io.ModbusRTUTransport:171 ] - Last request: 01 0
3 01 02 00 01 24 36
22:00:23.391 [ERROR] [i.modbus.io.ModbusRTUTransport:172 ] - failed to read: Er
ror reading response (EOF)
22:00:23.399 [ERROR] [w.m.io.ModbusSerialTransaction:199 ] - execute try 1/3 er
ror: I/O exception - failed to read. Request: net.wimpi.modbus.msg.ReadMultipleR
egistersRequest@a903b6 (unit id 1 & transaction 3949). Serial parameters: Serial
Parameters@161bacc[portName=COM8,baudRate=19200,flowControlIn=none,flowControlOu
t=none,databits=8,stopbits=1,parity=none,encoding=rtu,echo=false,receiveTimeoutM
illis=1500]

Ok so not even the reading works…

Can you please try out with alternative client, e.g modpoll?

http://www.modbusdriver.com/modpoll.html

I have seen some issues with the library on windows so it might be that one as well…

Best
Sami

I thank you, my operating system I use to try is win 7.
and the proposed software does not run.
and I do not think to be able to use it

hello, this is what I could do with modpoll

modpoll -b 19200 -p none -m rtu -a 1 -r 257 -c 2 COM2
modpoll 3.4 - FieldTalk™ Modbus® Master Simulator
Copyright © 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration…: address = 1, start reference = 257, count = 2
Communication…: COM2, 19200, 8, 1, none, t/o 1.00 s, poll rate 1000 ms
Data type…: 16-bit register, output (holding) register table

Port or socket open error!

hello, the other tests with modpoll

C:\modpoll -b 19200 -p none -m rtu -a 1 -r 257 -c 2 -t 4:hex COM2
modpoll 3.4 - FieldTalk™ Modbus® Master Simulator
Copyright © 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration…: address = 1, start reference = 257, count = 2
Communication…: COM2, 19200, 8, 1, none, t/o 1.00 s, poll rate 1000 ms
Data type…: 16-bit register (hex), output (holding) register table

– Polling slave… (Ctrl-C to stop)
[257]: 0x0000
[258]: 0x0000
– Polling slave… (Ctrl-C to stop)
[257]: 0x0000
[258]: 0x0000
– Polling slave… (Ctrl-C to stop)
^C

Hello, new test whit modpoll

I turned on in sequence the 4 relays of the ID2 card that corresponds to the Word 258 Bit 0 - bit1 - bit2- bit3, and has returned the following results

modpoll -b 19200 -p none -m rtu -a 1 -r 258 -c 2 -t 4:hex COM2
modpoll 3.4 - FieldTalk™ Modbus® Master Simulator
Copyright © 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration…: address = 1, start reference = 258, count = 2
Communication…: COM2, 19200, 8, 1, none, t/o 1.00 s, poll rate 1000 ms
Data type…: 16-bit register (hex), output (holding) register table

– Polling slave… (Ctrl-C to stop)
[258]: 0x0000
[259]: 0x0000
– Polling slave… (Ctrl-C to stop)
[258]: 0x0000
[259]: 0x0001
– Polling slave… (Ctrl-C to stop)
[258]: 0x0000
[259]: 0x0003
– Polling slave… (Ctrl-C to stop)
[258]: 0x0000
[259]: 0x0007
– Polling slave… (Ctrl-C to stop)
[258]: 0x0000
[259]: 0x000F
^C

good night.
I hope in your help

Thanks, could you please make a Minimal config with single slave, matching the last query of modpoll? Please note that register 258 in modpoll corresponds to 257 in the binding.

Also please share all the logs with verbose level on pastebin.com. Now I see successful and error in the logs but do not know the general situation.

Best
Sami

Sorry … I do not understand what evidence do I need to run.
What is pastebin.com?
you can tell me I’m new
what files you need?

Hi

sorry for the unclear message

with minimal config I mean you have only one slave defined, corresponding to modpoll query, e.g.:

and only one item

Switch O1_1 “O1_1_” (c_o) { modbus=“O1:0” }

Then configure verbose logging according the instructions in the wiki.

Then

  1. clear existing logs
  2. start openhab with start_debug
  3. let it run for a while (e.g. 5 minutes)
  4. upload log to pastebin.com, a website for copy-pasting text. It’s really easy to use, just paste the log to the text box, click “Create new paste”, and copy the URL here.

Best,
Sami

Hello,
I tried to paste the contents of Openhab.log files (eg 3 minutes) in Pastebin.com site but it is too big.
How do I proceed
Thank you

Hi

You can try to take the beginning of the log.

Pastebin.com should accept up to 0.5MB

Best
Sami

Hello,
this is the link
I hope it is correct

http://pastebin.com/ECxVX5rr

2° link

http://pastebin.com/Etp84wSu

3° link

http://pastebin.com/VJnnFeuM

4° link

http://pastebin.com/5nCJpdr3

configuration with a single word 257
and control of 4-bit switch.

Albeit very slowly, it works only bit 0 (controls the output and reports the status).
Bit 1-2-3 does not work

modbus:serial.O1.connection=COM2:19200:8:none:1:rtu
modbus:serial.O1.id=1
modbus:serial.O1.start=257
modbus:serial.O1.length=1
modbus:serial.O1.type=holding
modbus:serial.O1.valuetype=bit

You cannot simply change bits in a holding register. This is a limitation of Modbus. As far as the Openhab binding goes, it currently seems to try to write a single bit, but this results in bits above 0 being overwritten or blanked out.

I believe you will have to handle the whole register as a number item, and use rules to extract or set individual bits in that number at the Openhab end.

1 Like

can you help me.
I’m new with OpenHab and I do not know how to do.
Do you have any examples?