Warning - total beginner with Modbus and industrial control in general... Sorry for any incorrect terminology/etc. in advance!
I've got a project using a Beckhoff BK9000/BK9100 ethernet coupler and I need to check the states of up to six digital outputs (KL2602 modules) and also turn those same six outputs on/off depending on some logic.
I know that the unit works and is at the IP specified, as I'm able to see it in TwinCat3 and manually manipulate the outputs.
I've been trying to use the following code:
from pyModbusTCP.client import ModbusClient
SERVER_HOST = "172.16.17.32"
SERVER_PORT = 502
# TCP auto connect on modbus request, close after it
c = ModbusClient(host=SERVER_HOST, port=SERVER_PORT, auto_open=True, auto_close=True)
for i in range(4):
print(str(i) + str(c.read_coils(i,16)))
status = c.write_single_coil(0, False)
print(status)
for i in range(4):
print(str(i) + str(c.read_coils(i,16)))
When I do this, I can see that the True/False for coil '0' correspond to the various output states that I set manually using TwinCat3. There are six outputs manually set high, visible here:
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
It appears that when I increment the 'coil' it's just reading one bit further into the stream, as "coil" 1, 2, and 3 are rotating left.
However, I still cannot seem to change the values. I do hear a mystery relay click when setting coil '0' to False (but no click on true) and the status of the coil reads does not change. TwinCat is also showing no change. I'm getting a "None" back from the write, which indicates it's failing according to the module's documentation.
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
None
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
I'm sure this is something simple with bit-wise operations or something like that which I'm overlooking. Any ideas on what I'm doing wrong that causing the writes to fail?