1.modbus RTU简单介绍

Modbus RTU协议格式概览

 

Markdown

1+---------------+--------------+--------------+-------------------+------------------+
2| 设备地址     | 功能码       | 数据段       | CRC校验码(低字节)| CRC校验码(高字节)|
3| (1字节)       | (1字节)       | 变长         | (1字节)            | (1字节)           |
4+---------------+--------------+--------------+-------------------+------------------+

Modbus标准功能码列表

  • 0x01:读线圈状态
  • 0x02:读离散输入状态
  • 0x03:读保持寄存器
  • 0x04:读输入寄存器
  • 0x05:写单个线圈
  • 0x06:写单个保持寄存器
  • 0x07:读异常状态寄存器
  • 0x08:诊断功能(设备特定)
  • 0x0F:写多个线圈
  • 0x10:写多个保持寄存器
  • 0x11:报告从设备标识符(非标准,使用有限)
  • 0x14:读文件记录(替换0x0B)
  • 0x15:写文件记录(替换0x0C)
  • 0x16:Mask写多个保持寄存器(仅限Modbus TCP)

注意:0x00和0x7F的功能码通常保留不使用。0x80至0xFF的功能码范围通常被设备制造商用来定义自定义扩展功能。

功能码03(读保持寄存器)和06(写单个保持寄存器)的示例

  • 功能码03(读保持寄存器)

     Markdown 
    1报文: 0x01 0x03 0x00 0x01 0x00 0x02 CRC低字节 CRC高字节
    2解释:设备地址为0x01,请求读取从地址0x0001开始的两个保持寄存器的值。
    3注:CRC校验码在此处省略,实际应用中需要根据报文内容计算得出。
  • 功能码06(写单个保持寄存器)

     Markdown 
    1报文: 0x01 0x06 0x00 0x01 0x12 0x34 CRC低字节 CRC高字节
    2解释:设备地址为0x01,请求向地址为0x0001的保持寄存器写入值0x1234。
    3注:这里的CRC校验码也是示例,实际使用中需计算真实CRC值。

注意事项

  • CRC校验:Modbus RTU协议要求每个报文的最后两位是CRC校验码,通过CRC-16算法计算得出。
  • 数据传输:主设备发起通信,从设备响应。报文中的设备地址确保了正确的设备接收和响应命令。
  • 写操作:功能码06用于写入单个保持寄存器,批量写操作应使用功能码10(写多个保持寄存器)。
  • 错误检查:如果接收到的消息中有错误(如CRC校验失败、地址不符等),从设备不会执行操作,并返回错误响应。

扩展指令

  • 非标准扩展功能码:功能码范围0x80至0xFF通常用于制造商定义的扩展功能,它们不属于Modbus官方规范,但可以在特定设备或系统中实现特殊的控制或数据交换功能。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Modbus是一种通信协议,用于在不同设备之间进行数据传输和通信。modbus_tk是一个Python库,提供了在RTU模式下使用Modbus协议的功能。 使用modbus_tk.modbus_rtu模块,你可以在Python中实现Modbus RTU通信。这个模块提供了一些函数和类,用于建立Modbus RTU通信连接、读取和写入数据等操作。 你可以使用modbus_tk.modbus_rtu模块来创建一个Modbus RTU主站或从站,然后通过调用相应的函数来进行读写操作。例如,你可以使用`modbus_tk.modbus_rtu.RtuMaster`类来创建一个主站对象,然后使用该对象的`execute`方法来发送读写请求。 以下是一个简单示例,演示了如何使用modbus_tk.modbus_rtu模块进行Modbus RTU通信: ```python import modbus_tk.modbus_rtu as modbus_rtu import serial # 创建串口连接 ser = serial.Serial(port='COM1', baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0) # 创建Modbus RTU主站 master = modbus_rtu.RtuMaster(ser) # 连接到从站设备 master.open() # 读取保持寄存器的值 data = master.execute(1, modbus_rtu.READ_HOLDING_REGISTERS, 0, 10) # 写入保持寄存器的值 master.execute(1, modbus_rtu.WRITE_SINGLE_REGISTER, 0, output_value=12345) # 关闭连接 master.close() ``` 在上面的示例中,我们首先创建了一个串口连接,然后使用该连接创建了一个Modbus RTU主站对象。然后,我们可以通过调用主站对象的execute方法来发送读写请求。在示例中,我们首先读取了从站设备保持寄存器的值,然后写入了一个新的值。 请注意,上述示例中的参数和函数调用可能需要根据你的实际情况进行相应的修改。此外,你需要确保安装了modbus_tk库和所需的依赖项,以便能够成功运行该代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

allen哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值