Вопрос о внедрении сервера pymodbusTCP - PullRequest
1 голос
/ 09 октября 2019

У нас есть симулятор (клиент) и контроллер (сервер). Контроллер отправляет командный сигнал через ModbusTCP на симулятор. Я хочу эмулировать этот контроллер на моем компьютере.

Что я сделал

  1. Для теста я написал скрипт сервера pymodbus на моем компьютере и скрипт клиента pymodbus на другом ПК. Не было проблем с чтением регистра хранения и ввода с клиентского ПК.

  2. Я подключил свой компьютер Clinet к контроллеру (серверу), чтобы узнать, какие значения я должен отправить фактическому клиенту (симулятору). Я обнаружил, что 8 регистров (от 0 до 7) используются для хранения целочисленных значений.

  3. Я пытался установить соединение между моим компьютером (сервером) иСимулятор компьютера (клиента). Мне удалось установить соединение и отправить ответ клиенту.

Проблема

  1. У меня нет информации об этом клиенте (симуляторе), потому что у нас нет доступа к клиентскому скрипту,

  2. Я обнаружил, что этот клиент отправляет запрос не только на чтение, но и на запись.

  3. Когда я использую регистр хранения, я получаю сообщение об ошибке «Недопустимый адрес данных». Но входной регистр не показывает никакой ошибки. По этой причине я использую input_register для сохранения определенного целого числа.

  4. Я сохранил некоторые значения в input_register, но несколько input_registers записываются клиентом (имитатором), как показано ниже.

запрос на запись от клиента (симулятора)

сервер опросов (ПК) с программным обеспечением modpoll

Вопрос

  1. почему запросы на запись от клиента (симулятора) перезаписывают мой input_register? Насколько я знаю, input_register используется только для чтения. Я предполагаю, что допустил ошибку при сохранении переменной в input_register.

  2. Когда я устанавливаю соединение между контроллером и симулятором, wireshark и modpoll показывают, что клиент (симулятор) читает регистры (от 0 до 7) . Но когда я устанавливаю соединение между моим сервером (ПК) и клиентом (имитатором), мой ответ сервера с разными номерами регистра, как показано ниже. Номер резистора начинается с 1000. Почему симулятор запрашивает другой стартовый номер регистра? например) от 0: контроллер, от 1000: ПК (сервер)

Первый ответ от сервера (ПК)

Обновление! мой сервер может ответить значениями, но с неправильными номерами регистров. Я изменил начальный номер регистра (0 -> 1000). Я прикрепил картинку.

ответ от сервера (ПК)

Пожалуйста, сообщите мне по этому вопросу. Я приложу все усилия, чтобы решить эту проблему.

'' '

from pymodbus.server.sync import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext


from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSparseDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext

from pymodbus.transaction import ModbusRtuFramer, ModbusBinaryFramer
#%%
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
          ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
#%%


#%%
def run_server():
    store = ModbusSlaveContext( 
    ir=ModbusSequentialDataBlock(0, [28692,28692,28692,28692,28692,65508,65508,65508
    ]),zero_mode=True)
    context = ModbusServerContext(slaves=store, single=True)
    StartTcpServer(context, address=("192.168.1.231", 502))

    identity = ModbusDeviceIdentification()
    identity.VendorName = 'Pymodbus'
    identity.ProductCode = 'PM'
    identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'
    identity.ProductName = 'Pymodbus Server'
    identity.ModelName = 'Pymodbus Server'
    identity.MajorMinorRevision = '1.0'    

#%%
if __name__ == "__main__":
    run_server()

' ''

Уважаемый MarcosG, я прикрепил снимки экрана из wireshark, как показано ниже,

запрос на запись из клинета (симулятора) - как вы можете видеть, клинет (симулятор) отправляет запрос на запись и регистрационный номер начинается с 256.

читатьответ от сервера (контроллера) - Север (контроллер) отвечает на запрос клинета на чтение. И он отправляет ответ и номер регистра начинается с 256.

опрос сервера с программным обеспечением modpoll - мы можем посмотреть значения в регистрах сервера, как вы можете видеть, значения хранятся врегистр от 0 до 7. Эти значения от рычага контроллера. Если я отрегулирую рычаг, эти значения меняются.

запрашиваемый address_exel_File - У нас есть еще один симулятор (bridge2). Он показывает один и тот же номер регистра как для контроллера (сервер), так и для компьютера (сервер).

проблема: фактические регистры сервера, в которых хранятся значения от 0 до 7. Однако клиент и сервер взаимодействуют с различными регистрами (из 256), которые содержат значения «0». Но нет никаких проблем для настройки параметров корабля на симуляторе.

С уважением, Сеонсу

...