You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.9 KiB

  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. /*定义Modbus的操作功能码,支持01、02、03、04、05、06、15、16功能码*/
  6. typedef enum {
  7. // ReadCoilStatus 读线圈状态(读多个输出位的状态)
  8. ModbusOrder01 = 0x01,
  9. // ReadInputStatus 读输入位状态(读多个输入位的状态)
  10. ModbusOrder02 = 0x02,
  11. // ReadHoldingRegister 读保持寄存器(读多个保持寄存器的数值)
  12. ModbusOrder03 = 0x03,
  13. // ReadInputRegister 读输入寄存器(读多个输入寄存器的数值)
  14. ModbusOrder04 = 0x04,
  15. // WriteSingleCoil 强制单个线圈(强制单个输出位的状态)
  16. ModbusOrder05 = 0x05,
  17. // WriteSingleRegister 预制单个寄存器(设定一个寄存器的数值)
  18. ModbusOrder06 = 0x06,
  19. // WriteMultipleCoil 强制多个线圈(强制多个输出位的状态)
  20. ModbusOrder0F = 0x0F,
  21. // WriteMultipleRegister 预制多个寄存器(设定多个寄存器的数值)
  22. ModbusOrder10 = 0x10,
  23. // ReadFileRecord 读文件记录
  24. ModbusOrder14 = 0x14,
  25. // WriteFileRecord 写文件记录
  26. ModbusOrder15 = 0x15,
  27. // MaskWriteRegister 屏蔽写寄存器
  28. ModbusOrder16 = 0x16,
  29. // ReadWriteMultiRegister 读写多个寄存器
  30. ModbusOrder17 = 0x17,
  31. // ReadDeviceID读设备识别码
  32. ModbusOrder2B = 0x2B,
  33. } ModbusFunctionCode;
  34. /*定义接收到指令检测错误时的错误码*/
  35. typedef enum {
  36. Modbus_OK = 0x00,
  37. InvalidFunctionCode = 0x01, //不合法功能代码
  38. IllegalDataAddress = 0x02, //非法的数据地址
  39. IllegalDataValues = 0x03, //非法的数据值或者范围
  40. SlaveFailure = 0x04, //从站设备故障
  41. Acknowledgement = 0x05, //确认
  42. SlaveDeviceBusy = 0x06, //从属设备忙
  43. MemoryParityError = 0x08, //存储奇偶性差错
  44. GatewayDisabled = 0x0A, //不可用网关路径
  45. GatewayResponseFailed = 0x0B //网关目标设备响应失败
  46. } ModbusStatus;
  47. typedef struct {
  48. uint8_t deviceid;
  49. ModbusFunctionCode functionCode;
  50. union {
  51. /**********read************/
  52. struct {
  53. uint16_t startbit; // bit
  54. uint16_t numbit; // bit
  55. } O01; // ReadCoilStatus
  56. struct {
  57. uint16_t startbit; // bit
  58. uint16_t numbit; // bit
  59. } O02; // ReadInputStatus
  60. struct {
  61. uint16_t startreg; // byte
  62. uint16_t numreg; // reg(一个reg==16bit)
  63. } O03; // ReadInputStatus
  64. struct {
  65. uint16_t startreg; // byte
  66. uint16_t numreg; // reg(一个reg==16bit)
  67. } O04; // ReadInputStatus
  68. /**********write************/
  69. struct {
  70. uint16_t startbit; // bit
  71. uint16_t numbit; // bit
  72. uint8_t bytenum;
  73. uint8_t *bit;
  74. } O0F; // WriteMultipleCoil
  75. struct {
  76. uint16_t startreg; // byte
  77. uint16_t numreg; // byte
  78. uint8_t bytenum; // numreg*2
  79. uint8_t *reg;
  80. } O10; // WriteMultipleCoil
  81. } d;
  82. } ModbusMasterData_t;
  83. typedef struct {
  84. ModbusFunctionCode functionCode;
  85. uint8_t deviceId;
  86. union {
  87. /**********read_receipt************/
  88. struct {
  89. uint8_t bytenum; // bit
  90. uint8_t *byte_table;
  91. } O01; // ReadCoilStatus
  92. struct {
  93. uint8_t bytenum; // byte_table
  94. uint8_t *byte_table;
  95. } O02; // ReadInputStatus
  96. struct {
  97. uint8_t bytenum; // byte
  98. uint8_t *reg;
  99. } O03; // ReadInputStatus
  100. struct {
  101. uint8_t bytenum; // byte
  102. uint8_t *reg;
  103. } O04; // ReadInputStatus
  104. /**********write_receipt************/
  105. struct {
  106. uint16_t startbit;
  107. uint16_t bitnum; // bit
  108. } O0F; // WriteMultipleCoil-->对应01
  109. struct {
  110. uint16_t startreg;
  111. uint16_t regnum; // byte
  112. } O10; // --->对应03
  113. } d;
  114. } ModbusSlaveData_t;
  115. void ZGenerateCRC16CheckCodeToPacket(uint8_t *puckMsg, uint8_t packetlen);
  116. uint16_t ZGenerateCRC16CheckCode(uint8_t *puckMsg, uint8_t usDataLen);
  117. bool ZCheckRTUMessageIntegrity(uint8_t *message, uint8_t length);