Modbus tk 需要使用modbus_tk库的帮助吗

Modbus tk 需要使用modbus_tk库的帮助吗,modbus-tk,Modbus Tk,我使用modbus_tk库作为modbus RTU从机。我有一个现成的Modbus RTU主模拟器,通过usb到485转换器在另一台PC上运行。我看不到我的主控寄存器 我已经验证了串行链接是否良好,因为我可以使用串行程序向从机发送字符串。我已经尝试设置16位和32位整数的主控,响应总是83 04。 我尝试过使用几个起始地址为0的不同主机,这一个碰巧默认为第一个寄存器40001。波特率和串行端口设置匹配 import modbus_tk import modbus_tk.defines as cs

我使用modbus_tk库作为modbus RTU从机。我有一个现成的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)

首先,我看不出你有任何理由不断更新你电脑上的值 “BlockName”在循环中,但可能您有一个

您的寄存器编号似乎也有误,您不需要将寄存器0定义为数字40001,您可以替换这些行:

slave_1.add_block("BlockName", modbus_tk.defines.HOLDING_REGISTERS, 40001, 10)
slave_1.set_values ("BlockName", 40001, 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)
有一个完整的从机示例,其中包含命令行参数,所有参数都包含在代码中:

为了与寄存器编号保持一致,在客户端中,您还必须读取寄存器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\u 1
作为处理程序在salve上写入值,相反,您必须调用函数
modbusServ.get\u slave(slave\u id)

,首先,我看不出您有任何理由继续更新salve上的值 “BlockName”在循环中,但可能您有一个

您的寄存器编号似乎也有误,您不需要将寄存器0定义为数字40001,您可以替换这些行:

slave_1.add_block("BlockName", modbus_tk.defines.HOLDING_REGISTERS, 40001, 10)
slave_1.set_values ("BlockName", 40001, 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)
有一个完整的从机示例,其中包含命令行参数,所有参数都包含在代码中:

为了与寄存器编号保持一致,在客户端中,您还必须读取寄存器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\u 1
作为处理程序在salve上写入值,相反,您必须调用函数
modbusServ.get\u slave(slave\u id)

您好,谢谢您的帮助,在安装库之后,我几乎从示例中剪切并粘贴了这些代码。我按照你的建议创建了新的从处理器,现在主处理器读取数据。它解释为16位整数,不知道如何设置浮点,但我确信我有很多要了解Modbus的工作原理!这可能是另一个问题:)祝你的实验好运请不要忘记将你的问题标记为已解决,以帮助其他人找到itHello,谢谢你的帮助,在安装库之后,我已经从示例中剪切并粘贴了这些代码。我按照你的建议创建了新的从处理器,现在主处理器读取数据。它解释为16位整数,不知道如何设置浮点,但我确信我有很多要了解Modbus的工作原理!这可能是另一个问题:)祝你的实验好运。别忘了把你的问题标记为已解决,以帮助别人找到它