Проверка PymodbusTCP, с которой адрес спрашивает клиента - PullRequest
0 голосов
/ 12 марта 2020

Я использую обновленный сервер для записи данных в объект. Мне нужен какой-то способ доступа к адресу в 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))
...