⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus_protocal.h

📁 Modbus串口通讯协议通讯源代码
💻 H
字号:
/*******************************************************************************
读位通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x01) + 位TAG地址 + 读取位数 + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = M38.6(DEC),读取连续5个位,
          设正常通讯读出值为11010,若通讯错误,则设错误代码为16(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  M38.6(DEC) = M60026(HEX) 读取位数  LRC校验
字节 _1__ ____2____ ____2____ ______________6______________ ____2____ ____2____
HEX  0x3A 0x31 0x36 0x30 0x31 0x4E 0x36 0x30 0x30 0x32 0x36 0x30 0x35 0x38 0x38
ASC  ':'  '1'   '6'  '0' '1'   'M' '6'  '0'   '0'  '2'  '6'   '0' '5'   '8' '8'
     结束符
     ____2____
HEX  0x0D 0x0A
ASC  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码  读取值(字节数为读取位数)  LRC校验     结束符
字节 _1__ ____2____ ____2____ ___________5____________  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x30 0x31 0x31 0x31 0x30 0x31 0x30  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '0' '1'   '1'  '1'  '0'  '1'  '0'   '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x31 0x31 0x30  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '1'   '1'  '0'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
写位通讯帧, 协议为MODBUS协议ASCII方式

协议组成 (':' + 设备地址 + 功能代码(0x0F) + 位TAG地址 + 写入位数 + 写入位数据
             +  LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = M38.6(DEC),连续写4个位, 写入值分别为1001
          若通讯错误,则设错误代码为16(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  M38.6(DEC) = M60026(HEX) 写入位数
字节 _1__ ____2____ ____2____ ______________6______________ ____2____
HEX  0x3A 0x31 0x36 0x30 0x46 0x4E 0x36 0x30 0x30 0x32 0x36 0x30 0x34
ASC  ':'  '1'   '6'  '0' 'F'   'M' '6'  '0'   '0'  '2'  '6'  '0' '4'
     数据(字节数为写入位数)  LRC校验  结束符
     _________4_________     ____2____  ____2____
HEX  0x31 0x30 0x30 0x31     0x^^ 0x^^  0x0D 0x0A
ASC   '1'  '0'  '0'  '1'      '^' '^'  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码   LRC校验     结束符
字节 _1__ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '0' 'F'    '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x46 0x31 0x30  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' 'F'   '1'  '0'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
读字节通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x03) + 字节TAG地址 + 读取字节数 + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MB14(DEC),读取连续5个字节,
          设正常情况下返加的5个值为十六进制{0x13, 0x12, 0x31, 0x33, 0xA5},
          若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MB14(DEC) = MB000E(HEX) 读取字节数  LRC校验
字节 _1__ ____2____ ____2____ ______________6______________ ____2____  ____2____
HEX  0x3A 0x31 0x36 0x30 0x33 0x4E 0x42 0x30 0x30 0x30 0x45 0x30 0x35  0x^^ 0x^^
ASC  ':'  '1'   '6'  '0' '3'   'M' 'B'  '0'   '0'  '0'  'E'   '0' '5'    '^' '^'
     结束符
     ____2____
HEX  0x0D 0x0A
ASC  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码           读取值(占用字节数为读取字节数 * 2)
字节 _1__ ____2____ ____2____ ________________________10________________________
HEX  0x3A 0x31 0x36 0x30 0x33 0x31 0x33 0x31 0x32 0x33 0x31 0x33  0x33 0x41 0x35
ASC  ':'  '1'   '6'  '0' '3'   '1'  '3'  '1'  '2'  '3'  '1'  '3'  '3'  'A' '5'

     LRC校验     结束符
字节 ____2____   ____2____
HEX  0x^^ 0x^^   0x0D 0x0A
ASC  '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x33 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '3'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
写字节通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x04) + 字节TAG地址 + 写入字节数 + 写入值
             + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MB14(DEC),写入连续4个字节,  写入值为十六进制
          {0x12, 0x31, 0x33, 0xA5},  若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MB14(DEC) = MB000E(HEX) 写入字节数
字节 _1__ ____2____ ____2____ ______________6______________ ____2____
HEX  0x3A 0x31 0x36 0x30 0x34 0x4E 0x42 0x30 0x30 0x30 0x45 0x30 0x34
ASC  ':'  '1'   '6'  '0' '4'   'M' 'B'  '0'   '0'  '0'  'E'   '0' '4'
      写入值(占用字节数为写入字节数 * 2)      LRC校验     结束符
     __________________8____________________  ____2____  ____2____
HEX  0x31 0x32 0x33 0x31 0x33 0x33 0x41 0x35  0x^^ 0x^^  0x0D 0x0A
ASC  '1'  '2'  '3'  '1'  '3'  '3'   'A'  '5'   '^'  '^'  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码   LRC校验     结束符
字节 _1__ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x30 0x34  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '0' '4'   '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x34 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '4'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
读字通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x05) + 字TAG地址 + 读取字数 + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MW22(DEC), MW22占用MB22和MB23两个字节,
          设读取连续2个字(读取值为MW22、MW24) 设MW22 = 0x1314, MW24 = 0x3245,
          若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MW22(DEC) = MW0016(HEX)  读取字数   LRC校验
字节 _1__ ____2____ ____2____ ______________6______________ ____2____  ____2____
HEX  0x3A 0x31 0x36 0x30 0x35 0x4E 0x57 0x30 0x30 0x31 0x36 0x30 0x32  0x^^ 0x^^
ASC  ':'  '1'   '6'  '0' '5'   'M' 'W'  '0'   '0'  '1'  '6'   '0' '2'    '^' '^'
     结束符
     ____2____
HEX  0x0D 0x0A
ASC  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码      读取值(占用字节数 = 读取字数 * 4)
字节 _1__ ____2____ ____2____ ___________________8____________________
HEX  0x3A 0x31 0x36 0x30 0x35 0x31 0x33 0x31 0x34 0x33 0x32 0x34  0x35
ASC  ':'  '1'   '6'  '0' '5'   '1'  '3'  '1'  '4'  '3'  '2'  '4'  '5'

     LRC校验     结束符
字节 ____2____   ____2____
HEX  0x^^ 0x^^   0x0D 0x0A
ASC  '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x35 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '5'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
写字通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x06) + 字TAG地址 + 写入字数 + 写入值
             + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MW14(DEC),写入连续2个字,  写入值为十六进制
          {0x1231, 0x33A5},  若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MW14(DEC) = MW000E(HEX) 写入字数
字节 _1__ ____2____ ____2____ ______________6______________ ____2____
HEX  0x3A 0x31 0x36 0x30 0x36 0x4E 0x57 0x30 0x30 0x30 0x45 0x30 0x32
ASC  ':'  '1'   '6'  '0' '6'   'M' 'W'  '0'   '0'  '0'  'E'   '0' '2'
      写入值(占用字节数 = 写入字数 * 4 )      LRC校验     结束符
     __________________8____________________  ____2____  ____2____
HEX  0x31 0x32 0x33 0x31 0x33 0x33 0x41 0x35  0x^^ 0x^^  0x0D 0x0A
ASC  '1'  '2'  '3'  '1'  '3'  '3'   'A'  '5'   '^'  '^'  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码   LRC校验     结束符
字节 _1__ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x30 0x36  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '0' '6'   '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x36 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '6'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/



/*******************************************************************************
读双字通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x07) + 双字TAG地址 + 读取双字数 + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MD22(DEC), MD22占用MB22和MB23,MB24,MB26共四个字节,
          设读取连续1个双字,设MD22 = 0x13143245,
          若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MW22(DEC) = MW0016(HEX)  读取字数   LRC校验
字节 _1__ ____2____ ____2____ ______________6______________ ____2____  ____2____
HEX  0x3A 0x31 0x36 0x30 0x37 0x4E 0x44 0x30 0x30 0x31 0x36 0x30 0x31  0x^^ 0x^^
ASC  ':'  '1'   '6'  '0' '7'   'M' 'D'  '0'   '0'  '1'  '6'   '0' '1'    '^' '^'
     结束符
     ____2____
HEX  0x0D 0x0A
ASC  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码      读取值(占用字节数 = 读取双字数 * 8)
字节 _1__ ____2____ ____2____ ___________________8____________________
HEX  0x3A 0x31 0x36 0x30 0x37 0x31 0x33 0x31 0x34 0x33 0x32 0x34  0x35
ASC  ':'  '1'   '6'  '0' '7'   '1'  '3'  '1'  '4'  '3'  '2'  '4'  '5'

     LRC校验     结束符
字节 ____2____   ____2____
HEX  0x^^ 0x^^   0x0D 0x0A
ASC  '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x37 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '7'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/


/*******************************************************************************
写双字通讯帧, 协议为MODBUS协议ASCII方式

协议组成(':' + 设备地址 + 功能代码(0x08) + 双字TAG地址 + 写入双字数 + 写入值
             + LRC校验 + 结束符)

EXAMPLE:  设备地址 = 22(DEC), TAG = MD14(DEC),写入连续1个双字,  写入值为十六进制
          {0x123133A5},  若通讯错误,设错误代码为15(DEC)

发送帧
     帧头 设备地址  功能代码  TAG  MD14(DEC) = MD000E(HEX) 写入双字数
字节 _1__ ____2____ ____2____ ______________6______________ ____2____
HEX  0x3A 0x31 0x36 0x30 0x38 0x4E 0x44 0x30 0x30 0x30 0x45 0x30 0x31
ASC  ':'  '1'   '6'  '0' '8'   'M' 'D'  '0'   '0'  '0'  'E'   '0' '1'
      写入值(占用字节数 = 写入双字数 * 4 )      LRC校验     结束符
     __________________8____________________  ____2____  ____2____
HEX  0x31 0x32 0x33 0x31 0x33 0x33 0x41 0x35  0x^^ 0x^^  0x0D 0x0A
ASC  '1'  '2'  '3'  '1'  '3'  '3'   'A'  '5'   '^'  '^'  '\r' '\n'

正常返回帧
     帧头 设备地址  功能代码   LRC校验     结束符
字节 _1__ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x30 0x38  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '0' '8'   '^' '^'    '\r' '\n'

错误返回帧
     帧头 设备地址  功能代码  错误代码    LRC校验     结束符
字节 _1__ ____2____ ____2____ ____2____  ____2____   ____2____
HEX  0x3A 0x31 0x36 0x38 0x38 0x30 0x46  0x^^ 0x^^   0x0D 0x0A
ASC  ':'  '1'   '6'  '8' '8'   '0'  'F'   '^' '^'    '\r' '\n'

注意:0x^^代表实际运算的校验和, '^'表示对应的校验和的ASCII表达方式
*******************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -