ModBus用户自定义文件读写功能

290 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情 #ModBus用户自定义文件读写功能 ##功能分类 ###公共功能码

  • 是较好地被定义的功能码,
  • 保证是唯一的,
  • MODBUS 组织可改变的,
  • 公开证明的,
  • 具有可用的一致性测试,
  • MB IETF RFC 中证明的,
  • 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。 ###用户定义功能码
  • 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。
  • 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码
  • 不能保证被选功能码的使用是唯一的。
  • 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。 ###保留功能码
  • 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。 这里写图片描述

##(0x03)读多个寄存器 发送 | 地址域 | 功能码 | 起始地址 | 寄存器数量 | CRC | | ------------- |:------:| -----:| | 0x05 | 0x03 | 0x1000 | 0x0001| crcL crcH | 回复 | 地址域 | 功能码 | 字节数 | 寄存器值 | CRC | | ----- |:-----:| -----:| -----:| | 0x05 | 0x03 | 0x02 | 0x0001| crcL crcH |

##(0x10)写多个寄存器 发送 | 地址域 | 功能码 | 起始地址 | 寄存器数量 | 字节数 |寄存器值 |CRC | | ------------- |:-------------:| -----:| | 0x05 | 0x10 | 0x0000 | 0x0001|0x02|0x0001| crcL crcH | 回复 | 地址域 | 功能码 | 起始地址 | 寄存器数量 | CRC | | ------------- |:-----:| -----:| | 0x05 | 0x10 | 0x0000 | 0x0001| crcL crcH |

##(0x14)读文件记录 发送 | 地址域 | 功能码 | 字节数 | 参考类型 | 文件号 | 记录号 | 记录长度 | CRC | | ------------- |:------:| -----:| | 0x05 | 0x14 | 0x06 | 0x06| 0x0001| 0x0001| 0x0002| crcL crcH | 回复 | 地址域 | 功能码 | 响应数据长度 | 文件响应长度 |参考类型 |记录数据 | CRC | | ----- |:-----:| -----:| -----:| | 0x05 | 0x14 | 0x07 | 0x05| 0x06 | xx xx xx xx | crcL crcH |

##(0x15)写文件记录 发送 | 地址域 | 功能码 | 请求数据长度 | 参考类型 | 文件号 | 记录号 | 记录长度 |记录数据 | CRC | | ------------- |:------:| -----:| | 0x05 | 0x15 | 0x0a | 0x06| 0x0001| 0x0001| 0x0002|xx xx| crcL crcH | 回复 | 地址域 | 功能码 | 请求数据长度 | 参考类型 | 文件号 | 记录号 | 记录长度 |记录数据 | CRC | | ------------- |:------:| -----:| | 0x05 | 0x15 | 0x0a | 0x06| 0x0001| 0x0001| 0x0002|xx xx| crcL crcH |

有感于ModBus的文件读写文件功能有点怪异和不合理

  1. 写文件功能不合理,发送和回复是一样的
  2. 参考类型定死了0x06,不清楚其作用。 而且ModBus 256字节的限制,导致读写速度很慢,所以想自己扩展ModBus读写文件功能。

##(0x44)自定义读文件 发送 | 地址域 | 功能码 | 文件号 | 记录号 | 记录包长度 |记录长度 | CRC | | ------------- |:------:| -----:| | 0x05 | 0x44 | 0x0001| 0x0001| 0x0400|0x0002| crcL crcH | 回复 | 地址域 | 功能码 | 记录长度 |记录数据 | CRC | | ----- |:-----:| -----:| -----:| | 0x05 | 0x44 | 0x0002 | xx xx | crcL crcH |

##(0x45)自定义写文件 发送 | 地址域 | 功能码 | 文件号 | 记录号 | 记录包长度 |记录长度 | 记录数据|CRC | | ------------- |:------:| -----:| | 0x05 | 0x45 | 0x0001| 0x0001| 0x0400|0x0002|xx xx| crcL crcH | 回复 | 地址域 | 功能码 | 文件号 | 记录号 | 记录包长度 |记录长度 | CRC | | ----- |:-----:| -----:| -----:| | 0x05 | 0x45 | 0x0001 |0x0001 |0x0400 |0x0001 | crcL crcH |

N个文件,通过文件号来区分(0x00000xFFFF) 1个文件分成N包来读写,通过记录号来区分(0x00000xFFFF) 每个记录包的长度大小固定,通过记录包长度来区分(0x0000~0xFFFF) 而实际当次读写的长度,定义为记录长度。