ich habe ein ungewöhnliches Problem. Ich versuche mittels pyModBus Bibliothek ein Modbus Gateway über Netzwerk anzusteuern. An dem Gateway sind 16 Aktoren angeklemmt die einzeln angesteuert werden können. Die 16 Zustände der Aktoren werden in einem Register gespeichert. Das Register kann ich problemlos auslesen und neu beschreiben. Das klappt also alles einwandfrei. Mein Problem ist nun, dass ich nur eines der 16 Bits schalten möchte bzw ändern möchte ohne das die Zustände der anderen geändert werden. Hat das schonmal jemand gemacht und könnte mir einen Tipp geben? Bei google bin ich leider nur auf ein Bespiel gestoßen das mich aber nicht wirklich weitergebracht hat.
ein großes Danke schonmal im voraus.
Code: Alles auswählen
from pymodbus.client import ModbusTcpClient as ModbusClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.payload import BinaryPayloadBuilder
import pymodbus
import time
host = '192.168.1.10'
port = 502
client = ModbusClient(host, port)
client.connect()
print("Client verbunden!")
try:
while True:
builder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little)
builder.add_bits([1,0,0,0,0,0,0,0]) #Modbus 9-16
builder.add_bits([0,0,0,0,0,0,0,0]) #Modbus 1-8
payload = builder.build()
client.write_registers(9000, payload, skip_encode=True, unit=1)
#bg02 = client.read_input_registers(8000,16,unit=1)
register = client.mask_write_register(9000, and_mask=0xFFFF, or_mask=0b1000000000000000, skip_encode=True)
result = client.read_holding_registers(9000, 1, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big, wordorder=Endian.Little) #Modbus Output 9-16
sec_8_bits_in_reg = decoder.decode_bits()
first_8_bits_in_reg = decoder.decode_bits()
time.sleep(2)
print("-" * 60)
print("-" * 60)
print(payload)
print(result)
print(first_8_bits_in_reg + sec_8_bits_in_reg)
print("-" * 60)
print("_" * 60)
print("-" * 60)
except:
client.write_registers(9000,0,unit=1)
client.close()