initial
This commit is contained in:
commit
3192897b06
43
snippets/test1.py
Normal file
43
snippets/test1.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
|
||||||
|
from pymodbus.exceptions import ModbusIOException
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
|
||||||
|
client = ModbusClient('172.16.2.157')
|
||||||
|
|
||||||
|
try:
|
||||||
|
client.connect()
|
||||||
|
|
||||||
|
processImage = client.read_holding_registers(0x1010, 4)
|
||||||
|
if isinstance(processImage, ModbusIOException):
|
||||||
|
raise Exception(processImage)
|
||||||
|
|
||||||
|
if len(processImage.registers) != 4:
|
||||||
|
raise Exception("Unexpected number of registers in process image ({})".format(len(processImage.registers)))
|
||||||
|
|
||||||
|
(analogOutputBits, analogInputBits, digitalOutputBits, digitalInputBits) = processImage.registers
|
||||||
|
print(f"AO: {analogOutputBits}, AI: {analogInputBits}, DO: {digitalOutputBits}, DI: {digitalInputBits}")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
reg = client.read_input_registers(0, analogInputBits // 8)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
print(reg.registers)
|
||||||
|
|
||||||
|
reg = client.read_discrete_inputs(0, digitalInputBits)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
print(reg.bits)
|
||||||
|
|
||||||
|
reg = client.read_coils(0, digitalOutputBits)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
print(reg.bits)
|
||||||
|
|
||||||
|
sleep(0.1)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("Exception: {}".format(e))
|
||||||
|
finally:
|
||||||
|
client.close()
|
||||||
|
|
121
snippets/test2.py
Normal file
121
snippets/test2.py
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
coils = []
|
||||||
|
shadowCoils = []
|
||||||
|
|
||||||
|
discreteInputs = []
|
||||||
|
shadowDiscreteInputs = []
|
||||||
|
|
||||||
|
analogInputs = []
|
||||||
|
shadowAnalogInputs = []
|
||||||
|
|
||||||
|
changeCondition = threading.Condition()
|
||||||
|
|
||||||
|
|
||||||
|
def modbusHandler():
|
||||||
|
global coils, shadowCoils, discreteInputs, shadowDiscreteInputs, analogInputs, shadowAnalogInputs
|
||||||
|
|
||||||
|
|
||||||
|
client = ModbusClient(MODBUS_CLIENT)
|
||||||
|
|
||||||
|
try:
|
||||||
|
client.connect()
|
||||||
|
|
||||||
|
processImage = client.read_holding_registers(0x1010, 4)
|
||||||
|
if isinstance(processImage, ModbusIOException):
|
||||||
|
raise Exception(processImage)
|
||||||
|
|
||||||
|
if len(processImage.registers) != 4:
|
||||||
|
raise Exception("Unexpected number of registers in process image ({})".format(len(processImage.registers)))
|
||||||
|
|
||||||
|
(analogOutputBits, analogInputBits, digitalOutputBits, digitalInputBits) = processImage.registers
|
||||||
|
print(f"AO: {analogOutputBits}, AI: {analogInputBits}, DO: {digitalOutputBits}, DI: {digitalInputBits}")
|
||||||
|
|
||||||
|
shadowAnalogInputs = [ -1 ] * (analogInputBits // 8)
|
||||||
|
shadowDiscreteInputs = [ -1 ] * digitalInputBits
|
||||||
|
|
||||||
|
reg = client.read_coils(0, digitalOutputBits)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
coils = reg.bits
|
||||||
|
shadowCoils = coils
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
if not client.is_socket_open():
|
||||||
|
client.connect()
|
||||||
|
|
||||||
|
reg = client.read_input_registers(0, analogInputBits // 8)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
analogInputs = reg.registers
|
||||||
|
|
||||||
|
reg = client.read_discrete_inputs(0, digitalInputBits)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
discreteInputs = reg.bits
|
||||||
|
|
||||||
|
if (discreteInputs != shadowDiscreteInputs) or (analogInputs != shadowAnalogInputs):
|
||||||
|
with changeCondition:
|
||||||
|
changeCondition.notify()
|
||||||
|
|
||||||
|
if coils != shadowCoils:
|
||||||
|
reg = client.write_coils(0, shadowCoils)
|
||||||
|
if isinstance(reg, ModbusIOException):
|
||||||
|
raise Exception(reg)
|
||||||
|
coils = shadowCoils
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def publisher():
|
||||||
|
global coils, shadowCoils, discreteInputs, shadowDiscreteInputs, analogInputs, shadowAnalogInputs
|
||||||
|
|
||||||
|
while True:
|
||||||
|
with changeCondition:
|
||||||
|
changeCondition.wait()
|
||||||
|
|
||||||
|
if discreteInputs != shadowDiscreteInputs:
|
||||||
|
for i in range(len(shadowDiscreteInputs)):
|
||||||
|
if discreteInputs[i] != shadowDiscreteInputs[i]:
|
||||||
|
print("di changed: {}, {}".format(i, discreteInputs[i]))
|
||||||
|
shadowDiscreteInputs = discreteInputs
|
||||||
|
|
||||||
|
if analogInputs != shadowAnalogInputs:
|
||||||
|
for i in range(len(shadowAnalogInputs)):
|
||||||
|
if analogInputs[i] != shadowAnalogInputs[i]:
|
||||||
|
print("ai changed: {}, {}".format(i, analogInputs[i]))
|
||||||
|
shadowAnalogInputs = analogInputs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
modbusThread = threading.Thread(target=modbusHandler)
|
||||||
|
publisherThread = threading.Thread(target=publisher)
|
||||||
|
|
||||||
|
modbusThread.start()
|
||||||
|
publisherThread.start()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user