在使用 modbus_tk 库时需要帮助
Need help using modbus_tk library
我正在使用 modbus_tk 库作为 Modbus RTU 从站。我通过 usb 到 485 转换器在另一台 PC 上有一个现成的 Modbus RTU 主模拟器 运行。我在 Master 中看不到我的持股簿。
我已经验证串口 link 是好的,因为我可以使用串口程序向从机发送字符串。我已经尝试为 16 位和 32 位整数设置 Master,响应总是 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)
首先,我看不出有任何理由让你继续更新你的价值观
"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)
你实例化你的数据块和slave的方式也有一个小问题。
所以一个完整的奴隶例子应该是这样的:
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)
我正在使用 modbus_tk 库作为 Modbus RTU 从站。我通过 usb 到 485 转换器在另一台 PC 上有一个现成的 Modbus RTU 主模拟器 运行。我在 Master 中看不到我的持股簿。
我已经验证串口 link 是好的,因为我可以使用串口程序向从机发送字符串。我已经尝试为 16 位和 32 位整数设置 Master,响应总是 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)
首先,我看不出有任何理由让你继续更新你的价值观 "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)
你实例化你的数据块和slave的方式也有一个小问题。
所以一个完整的奴隶例子应该是这样的:
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)