Нужна помощь с использованием библиотеки 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)