Я использую обновленный сервер для записи данных в объект. Мне нужен какой-то способ доступа к адресу в getValues.
, если address == 1060: x = server_context.getValues (3, 1060, 2)
У меня проблема с регистром 1550 грн. Параметр длинный. Но в моем объекте записана переменная в позиции 16 и 1060. Это означает, что иногда в 16, а иногда в 1060.
Решение
x = server_context.getValues(3, 16, 2)
server_context.setValues(3, 1060, server_context.getValues(3, 16, 2))
x = server_context.getValues(3, 1060, 2)
server_context.setValues(3, 16, server_context.getValues(3, 1060, 2))
Работает только в том случае, если значение в адресе 16 заполняется первым, если оно заполняется первым в 1060, server_context.setValues (3, 1060, server_context.getValues (3, 16, 2)) перезапишет значение в 1060, и у меня есть недопустимое значение.
Проблема в том, что это по умолчанию, что я не могу изменить, и при этом я не могу ввести две переменные, такие как x_1 и x_2, и у меня нет доступа к клиенту.
Значения не могут быть проверены на достоверность, потому что они не определены c, и у меня нет значения, как None .
Я знаю, что код в примере не оптимальный, код был сокращен до необходимого
AM, было бы лучше, если бы я получил адрес
как в примере:
if address == 1060:
x = server_context.getValues(3, 1060, 2)
Пример кода
from pymodbus.server.sync import StartTcpServer, ModbusTcpServer
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
class ProtocolData:
def get_parameter_list(self):
parameter_list = [e for e in range(0,1550)]
return parameter_list
class ModbusServerTCP:
def __init__(self):
self.identity = ModbusDeviceIdentification()
self.identity.VendorName = 'Pymodbus'
self.identity.ProductCode = 'PM'
self.identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'
self.identity.ProductName = 'Pymodbus Server'
self.identity.ModelName = 'Pymodbus Server'
self.identity.MajorMinorRevision = '1.0'
# self.address = '10.13.0.130'
self.address = 'localhost'
self.port = 5020
self.interval = 1
def set_parameter_object(self, parameter_wrapper):
self.parameter_wrapper = parameter_wrapper
def set_parameter_object_2(self, parameter_wrapper):
parameter_wrapper.live_data = self.parameter_wrapper.live_data
self.parameter_wrapper = parameter_wrapper
def run_server(self):
# Holding Register (ir) FC4 (Address, [content]*number)
# codes
# 1 = c # 2 = d # 3 = h # 4 = i # 5 = c # 6 = h # 15 = c # 16 = h
# h = 16 ,6, 3 # i = 4 # c = 5, # d = 2
# parameter_list = ProtocolData().get_parameter_list(self.parameter_wrapper_null)
parameter_list = ProtocolData().get_parameter_list()
store = ModbusSlaveContext(
di=ModbusSequentialDataBlock(0, [0]*1000),
co=ModbusSequentialDataBlock(0, [0]*1000),
ir=ModbusSequentialDataBlock(0, [0]*1000),
hr=ModbusSequentialDataBlock(0, parameter_list))
context = ModbusServerContext(slaves=store, single=True)
server = ModbusTcpServer(context, identity=self.identity,
address=(self.address, self.port))
# print(f'store Values {store.getValues(4,0,100)}')
print(f'framer {server.framer}')
t = threading.Thread(target=server.serve_forever, daemon=True)
t.start()
loop = LoopingCall(f=self.updatevalues, a=server)
loop.start(self.interval, now=True)
reactor.run()
def updatevalues(self, a):
start = time.time()
print("------------START----------")
server_context = a.context[0x01]
x= server_context.getValues(3, 16, 2)
x= server_context.getValues(3, 1060, 2)
print("-------------END-------------")
end = time.time()
print("Zeit %s" % str(end - start))