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.

153 lines
4.2 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. /**
  5. * @brief
  6. *
  7. * dep:
  8. * basic_type.h
  9. *
  10. *
  11. * TODO:
  12. * ĿǰͨĹ
  13. * 0x04
  14. * 0x10
  15. *
  16. */
  17. /*����Modbus�IJ��������룬֧��01��02��03��04��05��06��15��16������*/
  18. typedef enum {
  19. // ReadCoilStatus ����Ȧ״̬������������λ��״̬��
  20. ModbusOrder01 = 0x01,
  21. // ReadInputStatus ������λ״̬������������λ��״̬��
  22. ModbusOrder02 = 0x02,
  23. // ReadHoldingRegister �����ּĴ��������������ּĴ�������ֵ��
  24. ModbusOrder03 = 0x03,
  25. // ReadInputRegister �������Ĵ����������������Ĵ�������ֵ��
  26. ModbusOrder04 = 0x04,
  27. // WriteSingleCoil ǿ�Ƶ�����Ȧ��ǿ�Ƶ�������λ��״̬��
  28. ModbusOrder05 = 0x05,
  29. // WriteSingleRegister Ԥ�Ƶ����Ĵ������趨һ���Ĵ�������ֵ��
  30. ModbusOrder06 = 0x06,
  31. // WriteMultipleCoil ǿ�ƶ�����Ȧ��ǿ�ƶ�������λ��״̬��
  32. ModbusOrder0F = 0x0F,
  33. // WriteMultipleRegister Ԥ�ƶ����Ĵ������趨�����Ĵ�������ֵ��
  34. ModbusOrder10 = 0x10,
  35. // ReadFileRecord ���ļ���¼
  36. ModbusOrder14 = 0x14,
  37. // WriteFileRecord д�ļ���¼
  38. ModbusOrder15 = 0x15,
  39. // MaskWriteRegister ����д�Ĵ���
  40. ModbusOrder16 = 0x16,
  41. // ReadWriteMultiRegister ��д�����Ĵ���
  42. ModbusOrder17 = 0x17,
  43. // ReadDeviceID���豸ʶ����
  44. ModbusOrder2B = 0x2B,
  45. } ModbusFunctionCode;
  46. /*�������յ�ָ����������ʱ�Ĵ�����*/
  47. typedef enum {
  48. Modbus_OK = 0x00,
  49. InvalidFunctionCode = 0x01, // ���Ϸ����ܴ���
  50. IllegalDataAddress = 0x02, // �Ƿ������ݵ�ַ
  51. IllegalDataValues = 0x03, // �Ƿ�������ֵ���߷�Χ
  52. SlaveFailure = 0x04, // ��վ�豸����
  53. Acknowledgement = 0x05, // ȷ��
  54. SlaveDeviceBusy = 0x06, // �����豸æ
  55. MemoryParityError = 0x08, // �洢��ż�Բ���
  56. GatewayDisabled = 0x0A, // ����������·��
  57. GatewayResponseFailed = 0x0B // ����Ŀ���豸��Ӧʧ��
  58. } ModbusStatus;
  59. typedef struct {
  60. uint8_t deviceid;
  61. ModbusFunctionCode functionCode;
  62. union {
  63. /**********read************/
  64. struct {
  65. uint16_t startbit; // bit
  66. uint16_t numbit; // bit
  67. } O01; // ReadCoilStatus
  68. struct {
  69. uint16_t startbit; // bit
  70. uint16_t numbit; // bit
  71. } O02; // ReadInputStatus
  72. struct {
  73. uint16_t startreg; // byte
  74. uint16_t numreg; // reg(һ��reg==16bit)
  75. } O03; // ReadInputStatus
  76. struct {
  77. uint16_t startreg; // byte
  78. uint16_t numreg; // reg(һ��reg==16bit)
  79. } O04; // ReadInputStatus
  80. /**********write************/
  81. struct {
  82. uint16_t startbit; // bit
  83. uint16_t numbit; // bit
  84. uint8_t bytenum;
  85. uint8_t *bit;
  86. } O0F; // WriteMultipleCoil
  87. struct {
  88. uint16_t startreg; // byte
  89. uint16_t numreg; // byte
  90. uint8_t bytenum; // numreg*2
  91. uint8_t *reg;
  92. } O10; // WriteMultipleCoil
  93. } d;
  94. } ModbusMasterData_t;
  95. typedef struct {
  96. ModbusFunctionCode functionCode;
  97. uint8_t deviceId;
  98. union {
  99. /**********read_receipt************/
  100. struct {
  101. uint8_t bytenum; // bit
  102. uint8_t *byte_table;
  103. } O01; // ReadCoilStatus
  104. struct {
  105. uint8_t bytenum; // byte_table
  106. uint8_t *byte_table;
  107. } O02; // ReadInputStatus
  108. struct {
  109. uint8_t bytenum; // byte
  110. uint8_t *reg;
  111. } O03; // ReadInputStatus
  112. struct {
  113. uint8_t bytenum; // byte
  114. uint8_t *reg;
  115. } O04; // ReadInputStatus
  116. /**********write_receipt************/
  117. struct {
  118. uint16_t startbit;
  119. uint16_t bitnum; // bit
  120. } O0F; // WriteMultipleCoil-->��Ӧ01
  121. struct {
  122. uint16_t startreg;
  123. uint16_t regnum; // byte
  124. } O10; // --->��Ӧ03
  125. } d;
  126. } ModbusSlaveData_t;
  127. /**
  128. * @brief CRC16У
  129. *
  130. * @param puckMsg ָ
  131. * @param usDataLen ݳ(CRC16)
  132. * @return uint16_t
  133. */
  134. uint16_t modbus_gen_crc16(uint8_t *puckMsg, uint8_t usDataLen);
  135. /**
  136. * @brief CRC16Уӵݰ
  137. *
  138. * @param puckMsg ָԤλøCRC16
  139. * @param packetlen ݳ
  140. */
  141. void modbus_pack_crc_to_packet(uint8_t *puckMsg, uint8_t packetlen);
  142. /**
  143. * @brief CRC16У
  144. *
  145. * @param message ָ
  146. * @param length ݳ(CRC16)
  147. * @return true Уɹ
  148. * @return false Уʧ
  149. */
  150. bool modbus_checkcrc16(uint8_t *message, uint8_t length);