#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的文件读写文件功能有点怪异和不合理
- 写文件功能不合理,发送和回复是一样的
- 参考类型定死了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个文件,通过文件号来区分(0x0000~0xFFFF)
1个文件分成N包来读写,通过记录号来区分(0x0000~0xFFFF)
每个记录包的长度大小固定,通过记录包长度来区分(0x0000~0xFFFF)
而实际当次读写的长度,定义为记录长度。