Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 4

Hi,

For discrete inputs everything is working fine.

For digital outputs/coils, it’s working … but getting these error messages.

Getting these errors with Modbus and Beckhoff BC9100 / Digital Output

16:10:24.605 [INFO ] [smarthome.event.ItemCommandEvent ] - Item ‘DO01’ received command ON
16:10:24.669 [INFO ] [arthome.event.ItemStatePredictedEvent] - DO01 predicted to become ON
16:10:24.694 [INFO ] [smarthome.event.ItemStateChangedEvent] - DO01 changed from OFF to ON
16:10:24.935 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (BasicModbusWriteCoilRequestBlueprint@89da23[slaveId=1,reference=0,functionCode=WRITE_COIL,bits=SingleBitArray(bit=1),maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 4 [operation ID c2ca648b-fe2c-44d5-a6c4-42099609d1cf]
16:10:25.015 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 2 out of 3 failed when executing request (BasicModbusWriteCoilRequestBlueprint@89da23[slaveId=1,reference=0,functionCode=WRITE_COIL,bits=SingleBitArray(bit=1),maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 4 [operation ID c2ca648b-fe2c-44d5-a6c4-42099609d1cf]
16:10:25.096 [ERROR] [ort.modbus.internal.ModbusManagerImpl] - Last try 3 failed when executing request (BasicModbusWriteCoilRequestBlueprint@89da23[slaveId=1,reference=0,functionCode=WRITE_COIL,bits=SingleBitArray(bit=1),maxTries=3]). Aborting. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 4 [operation ID c2ca648b-fe2c-44d5-a6c4-42099609d1cf]
16:10:25.110 [ERROR] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:beckhoff:coils:do01 ‘Modbus Data’ had ModbusSlaveErrorResponseExceptionImpl error on write: ModbusSlaveErrorResponseException(error=4)
16:10:25.129 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - ‘modbus:data:beckhoff:coils:do01’ changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with write. Request: BasicModbusWriteCoilRequestBlueprint@89da23[slaveId=1,reference=0,functionCode=WRITE_COIL,bits=SingleBitArray(bit=1),maxTries=3]. Description: ModbusSlaveErrorResponseException(error=4). Message: Slave responsed with error=4
16:10:25.217 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - ‘modbus:data:beckhoff:coils:do01’ changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with write. Request: BasicModbusWriteCoilRequestBlueprint@89da23[slaveId=1,reference=0,functionCode=WRITE_COIL,bits=SingleBitArray(bit=1),maxTries=3]. Description: ModbusSlaveErrorResponseException(error=4). Message: Slave responsed with error=4 to ONLINE

Beckhoff
BC9100 (factory reseted and set to fieldbus)
4x KL1408 | 8-channel digital input
2x KL2408 | 8-channel digital output

RasberryPi

Things:
Bridge modbus:tcp:beckhoff [ host=“192.168.5.253”, port=502, id=1 ] {
Bridge poller discreteInputs [ start=0, length=32, refresh=1000, type=“discrete” ] {
Thing data di01 [ readStart=“0”, readValueType=“bit” ]
Thing data di02 [ readStart=“1”, readValueType=“bit” ]
}
Bridge poller coils [ start=0, length=16, refresh=1000, type=“coil” ] {
Thing data do01 [ readStart=“0”, readValueType=“bit”, writeStart=“0”, writeValueType=“bit”, writeType=“coil” ]
Thing data do02 [ readStart=“1”, readValueType=“bit”, writeStart=“1”, writeValueType=“bit”, writeType=“coil” ]
}
}

Items:
Switch DO01 “Digital Output index 01 [%d]” (beckhoff_out) { channel=“modbus:data:beckhoff:coils:do01:switch” }
Switch DO02 “Digital Output index 02 [%d]” (beckhoff_out) { channel=“modbus:data:beckhoff:coils:do02:switch” }

When changing output state from outside openhab the status changs in openhab without error msg

2020-04-07 16:28:02.952 [vent.ItemStateChangedEvent] - DO01 changed from ON to OFF
2020-04-07 16:28:07.413 [vent.ItemStateChangedEvent] - DO01 changed from OFF to ON

Anyone an idea please?

Modbus exception code 4 is a rejection from your PLC, “error”
http://www.simplymodbus.ca/exceptions.htm

It doesn’t like what your asking it to do.
I don’t know what your PLC might like instead; review the addressing of your coils, review if the PLC works with only one of FC05 or FC15 to write coils

No, but it does work, state is changing … only getting the error msg on top … so addressing should be ok (?)
tried with writetype holding and writeMultipleEvenWithSingleRegisterOrCoil
same or worse result

State gets updated because openHAB predicts it when the item receives a command.

You can disable this behavior using autoupdate flag in your item definition, see https://www.openhab.org/addons/bindings/modbus/#autoupdate-parameter-with-items

With autoupdate disabled, I would expect the state to remain unchanged.

State does change on the KL2408 (led turns on/off) … so it really works …
(did already try with autoupdate set to false before)

1 Like

The exception code absolutely comes from your PLC.
If you think the expected write is working, i.e. accepted by the PLC, there remains the possibility that oipenHAB is issuing a “bad” write as well.

You’ve been tinkering with Thing settings in-flight, now reboot so that you know the binding is using only what you think are “good” settings.

1 Like

Did restart openhab few times and also reinstalled the modbus binding.
Restarted and reset beckhoff bc9000 too.
Still getting the error 4.

set log level to TRACE :
openHAB Add-ons :: Bundles :: Modbus Binding
openHAB Add-ons :: Bundles :: IO :: Modbus Transport
But extra info …

This Beckhoff manual page describes why the PLC would respond with modbus exception code 4
https://infosys.beckhoff.com/english.php?content=../content/1033/bk9000/2802220427.html&id=6817846383656792480

the text is

Watchdog or K-bus error
EK9000: E-bus error

and they also make clear that illegal modbus commands would produce different EC to 4

On that basis, I’d say your openHAB config is fine, and the problem is with your PLC config.

It seems odd to both appear to “work” and report an error, but I suppose sometimes the PLC has to try to implement a command to discover an error, so there is a sort of sense there.

Checked and tried all terminals one by one (others removed)
Any Beckhoff/Modbus specialists around or ida how to further troubleshoot this?