Нужна помощь с использованием библиотеки modbus_tk

Я использую библиотеку modbus_tk для использования в качестве ведомого устройства Modbus RTU. У меня есть готовый симулятор Modbus RTU, работающий на другом ПК через конвертер usb в 485. Я не вижу свой регистр хранения в Мастере.

Я проверил, что последовательная связь хороша, потому что я могу послать строки ведомому, используя последовательную программу. Я попытался настроить мастер для 16 и 32-битных битов, ответ всегда 83 04. Я пытался использовать несколько разных мастеров с начальным адресом 0, этот случай по умолчанию первый регистр 40001. Скорость передачи и настройки последовательного порта матч.

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial
import time  

modbusServ = modbus_rtu.RtuServer(serial.Serial('/dev/ttyS0'),baudrate= 9600,
                 bytesize=8, parity='N', stopbits=1, xonxoff=0)
print("start")

modbusServ.start()

slave_1 = modbus_tk.modbus.Slave(1)

slave_1.add_block("BlockName", modbus_tk.defines.HOLDING_REGISTERS, 40001, 10)

aa= (1,2,3,4,5,6,7,8,9,10) # data in the register

while True:

    slave_1.set_values ("BlockName", 40001, aa)
    time.sleep(0.5)

1 ответ

Решение

Во-первых, я не вижу никакой причины, чтобы вы продолжали обновлять значения вашего "BlockName" в цикле, но, возможно, у вас есть.

Нумерация вашего регистра также кажется неправильной, вам не нужно определять регистр 0 как номер 40001, вы можете заменить эти строки:

slave_1.add_block("BlockName", modbus_tk.defines.HOLDING_REGISTERS, 40001, 10)
slave_1.set_values ("BlockName", 40001, aa)

С участием:

slave_1.add_block("BlockName", cst.HOLDING_REGISTERS, 0, 10)
slave_1.set_values ("BlockName", 0, aa)

Существует также небольшая проблема в том, как вы создаете экземпляр своего блока данных и подчиненного устройства.

Таким образом, полный пример ведомого должен выглядеть следующим образом:

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial
import time  

modbusServ = modbus_rtu.RtuServer(serial.Serial('/dev/ttyS0'),baudrate= 9600,
                 bytesize=8, parity='N', stopbits=1, xonxoff=0)
print("start")

modbusServ.start()

slave_1 = modbusServ.add_slave(1)

slave_1.add_block("BlockName", cst.HOLDING_REGISTERS, 0, 10)

aa= (1,2,3,4,5,6,7,8,9,10) # data in the register

#you need to get a new handler to write values to your slave
slave = modbusServ.get_slave(1)

slave.set_values ("BlockName", 0, aa)

while True:

    print("Modbus Server Waiting for client queries...")
    time.sleep(0.5)

Есть полный пример ведомого с аргументами командной строки и все они включены в код: https://github.com/ljean/modbus-tk/blob/master/examples/rtuslave_example.py

Чтобы соответствовать нумерации регистров, в вашем клиенте вы также должны прочитать из регистра 0:

master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)

В результате чего: (1,2,3,4,5,6,7,8,9,10)

Я думаю, вы уже знаете, но есть и другие хорошие библиотеки для работы с Modbus, такие как pymodbus и pylibmodbus.

РЕДАКТИРОВАТЬ: После тестирования мне пришлось исправить мой полный пример, чтобы добавить

slave = modbusServ.get_slave(1)

Видимо, вы не можете использовать оригинал slave_1 в качестве обработчика для записи значений на ваш salve, вместо этого вы должны вызвать функцию modbusServ.get_slave(slave_id)

Другие вопросы по тегам