首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要帮助使用modbus_tk库

需要帮助使用modbus_tk库
EN

Stack Overflow用户
提问于 2019-06-03 13:45:28
回答 1查看 1.9K关注 0票数 2

我使用modbus_tk库作为modbus_tk从站。我有一个现成的Modbus RTU主模拟器,通过usb到485转换器在另一台PC上运行。我在师父身上看不见我的持有登记簿。

我已经验证了串行链接是好的,因为我可以发送字符串到从程序使用串行程序。我已经尝试设置了16位和32位的主机,响应总是83 04。我试过使用几个不同的母版,地址为0,这一次碰巧默认为第一次注册40001。波特率和串口设置匹配。

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 14:59:25

首先,我不认为您有任何理由继续更新循环中"BlockName“上的值,但是您可能有一个。

您的寄存器的编号似乎也是错误的,您不需要将寄存器0定义为40001,您可以替换以下行:

代码语言:javascript
运行
复制
slave_1.add_block("BlockName", modbus_tk.defines.HOLDING_REGISTERS, 40001, 10)
slave_1.set_values ("BlockName", 40001, aa)

通过以下方式:

代码语言:javascript
运行
复制
slave_1.add_block("BlockName", cst.HOLDING_REGISTERS, 0, 10)
slave_1.set_values ("BlockName", 0, aa)

在实例化数据块和从服务器的方式上也存在一个小问题。

因此,完整的从属示例应该如下所示:

代码语言:javascript
运行
复制
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读取:

代码语言:javascript
运行
复制
master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)

结果:(1,2,3,4,5,6,7,8,9,10)

我想您已经知道了,但是还有一些其他好的库可以使用Modbus,比如pymodbus和pylibmodbus。

编辑:测试后,我不得不更正我的完整示例以添加

代码语言:javascript
运行
复制
slave = modbusServ.get_slave(1)

显然,您不能使用原始的slave_1作为处理程序在您的salve上写入值,而必须调用函数modbusServ.get_slave(slave_id)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56428678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档