Python: modbus_tk не отвечает в режиме ведомого
Я пытаюсь сделать Modbus-RTU ведомым в Python, используя библиотеку modbus_tk. Ниже приведен основной код, который я пытаюсь заставить его работать.
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial
PORT = 'COM1'
modbusServ =
modbus_rtu.RtuServer(serial.Serial(PORT),baudrate=9600,
bytesize=8, parity='N', stopbits=1, xonxoff=0)
print("start")
try:
modbusServ.start()
print("receiver module started")
slave_1 = modbusServ.add_slave (1)
slave_1.add_block ("a",cst.ANALOG_INPUTS,200, 7)
slave_1.set_values ("a",200,range(7))
slave_2 = modbusServ.add_slave(2)
slave_2.add_block ("b",cst.HOLDING_REGISTERS,200,7)
slave_2.set_values("b",200,range(7))
slave_5 = modbusServ.add_slave(5)
slave_5.add_block("c",cst.COILS,0,7)
slave_5.set_values("c",0,range(1))
while True:
slave_1.set_values ("a",200,1)
slave_1.set_values ("a",201,2)
slave_1.set_values ("a",202,3)
slave_1.set_values ("a",203,4)
slave_1.set_values ("a",204,5)
slave_1.set_values ("a",205,6)
slave_1.set_values ("a",206,7)
finally:
print("ideally do not come here")
Когда код запущен, я выполняю некоторые запросы на чтение от другого мастера (я могу наблюдать на ком-порте, что мастер делает запрос), но ведомый не дает никакого ответа на запрос.
Дополнительная информация
platform: windows 7, 64-bit
Python version: 3.5.2, 64-bit
modbus_tk versoin: 0.5.7
Есть что-то, чего мне не хватает? или любые предложения.
1 ответ
Ваш while True
Цикл постоянно обновляет данные и может занимать все ресурсы процессора.
Я бы постарался сделать небольшую задержку в этом цикле. Что-то вроде
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial
import time # add this
PORT = 'COM1'
modbusServ = modbus_rtu.RtuServer(serial.Serial(PORT),baudrate=9600,
bytesize=8, parity='N', stopbits=1, xonxoff=0)
print("start")
try:
modbusServ.start()
print("receiver module started")
slave_1 = modbusServ.add_slave (1)
slave_1.add_block ("a",cst.ANALOG_INPUTS,200, 7)
slave_1.set_values ("a",200,range(7))
slave_2 = modbusServ.add_slave(2)
slave_2.add_block ("b",cst.HOLDING_REGISTERS,200,7)
slave_2.set_values("b",200,range(7))
slave_5 = modbusServ.add_slave(5)
slave_5.add_block("c",cst.COILS,0,7)
slave_5.set_values("c",0,range(1))
while True:
slave_1.set_values ("a",200,1)
slave_1.set_values ("a",201,2)
slave_1.set_values ("a",202,3)
slave_1.set_values ("a",203,4)
slave_1.set_values ("a",204,5)
slave_1.set_values ("a",205,6)
slave_1.set_values ("a",206,7)
time.sleep(0.1) # small delay to let the communication thread doing his job
finally:
print("ideally do not come here")