This commit is contained in:
2021-08-22 23:57:45 +02:00
parent 3192897b06
commit d62356b1f5
7 changed files with 218 additions and 0 deletions

77
src/ModbusHandler.py Normal file
View File

@ -0,0 +1,77 @@
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.exceptions import ModbusIOException
from time import sleep
import threading
MODBUS_CLIENT = '172.16.2.157'
MODBUS_REFRESH_PERIOD = 0.25
def modbusHandler(processImage):
client = ModbusClient(MODBUS_CLIENT)
try:
client.connect()
res = client.read_holding_registers(0x1010, 4)
if isinstance(res, ModbusIOException):
raise Exception(processImage)
if len(res.registers) != 4:
raise Exception("Unexpected number of registers for process image ({})".format(len(res.registers)))
(analogOutputBits, analogInputBits, digitalOutputBits, digitalInputBits) = res.registers
print(f"AO: {analogOutputBits}, AI: {analogInputBits}, DO: {digitalOutputBits}, DI: {digitalInputBits}")
processImage.init(digitalOutputBits, digitalInputBits, analogInputBits)
reg = client.read_coils(0, digitalOutputBits)
if isinstance(reg, ModbusIOException):
raise Exception(reg)
with processImage:
processImage.setCoils(reg.bits)
while True:
try:
if not client.is_socket_open():
client.connect()
reg = client.read_input_registers(0, analogInputBits // 8)
print("M0: ".format(type(reg)))
if isinstance(reg, ModbusIOException):
raise Exception(reg)
analogInputs = reg.registers
print("M1: ".format(reg.registers))
reg = client.read_discrete_inputs(0, digitalInputBits)
if isinstance(reg, ModbusIOException):
raise Exception(reg)
discreteInputs = reg.bits
print("M2: ".format(reg.bits))
coils = None
with processImage:
processImage.setAnalogsInputs(analogInputs)
processImage.setDiscreteInputs(discreteInputs)
if processImage.hasPendingInputChanges():
processImage.notify()
if processImage.hasPendingOutputChanges:
coils = processImage.getCoils()
if coils:
reg = client.write_coils(0, coils)
if isinstance(reg, ModbusIOException):
raise Exception(reg)
except Exception as e:
print("Exception in inner modbus handler loop: {}".format(e))
client.close()
finally:
sleep(MODBUS_REFRESH_PERIOD)
except Exception as e:
print("Exception in modbus handler: {}".format(e))
finally:
client.close()