我使用modbus_tk库作为modbus_tk从站。我有一个现成的Modbus RTU主模拟器,通过usb到485转换器在另一台PC上运行。我在师父身上看不见我的持有登记簿。
我已经验证了串行链接是好的,因为我可以发送字符串到从程序使用串行程序。我已经尝试设置了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)
发布于 2019-06-03 14:59:25
首先,我不认为您有任何理由继续更新循环中"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)
有一个包含命令行参数的完整从示例,所有这些都包含在代码中: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)
。
https://stackoverflow.com/questions/56428678
复制相似问题