Modbus.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef _MODBUS_H
  2. #define _MODBUS_H
  3. /*错误应答码定义*/
  4. #define MODBUS_CMD_NUM 120
  5. #define MODBUS_INF_MAX 200
  6. #define MODBUS_TYPE_YX 1
  7. #define MODBUS_TYPE_YC 2
  8. #define MODBUS_TYPE_YK 3
  9. #define MODBUS_TYPE_DD 4
  10. #define MODBUS_INF_DI 1
  11. #define MODBUS_INF_NUM 2
  12. #define MODBUS_INF_BITS 3
  13. #define MODBUS_INF_SENDADDR 4
  14. typedef struct MODBUS_CMD // modbus规约处理结构体
  15. {
  16. WORD slaveaddr; //装置地址
  17. WORD sendaddr; //发送地址
  18. BYTE cmd; //命令码
  19. BYTE type;
  20. WORD di; //点号
  21. WORD num; //数量
  22. BYTE bitbytes; //
  23. BYTE readbit;
  24. bool byxfirst;
  25. }MODBUS_CMD_DEF;
  26. typedef struct MODBUS_EXT_INF // modbus规约信息附加结构体
  27. {
  28. WORD slaveaddr; //装置地址
  29. BYTE type;
  30. DWORD val; //点号
  31. }MODBUS_EXT_INF;
  32. typedef struct MODBUS // 101规约处理结构体
  33. {
  34. BYTE chnl;
  35. BYTE type;
  36. BYTE nTypeCounter; //接受帧类型
  37. WORD nRecvLenth; //通道A 接收到数据计数器
  38. WORD nRecvCnt; //有效数据记
  39. WORD nRecvCounter;
  40. WORD slaveaddr;
  41. bool bData;
  42. bool bRecvOk;
  43. BYTE nSendCnt;
  44. BYTE recvbuf[512]; // 101规约,接收的报文,最大40个字节
  45. BYTE *sendbuf;
  46. WORD readdi;
  47. DWORD retrytime;
  48. DWORD sendinteraltime;
  49. BYTE yxcmd;
  50. BYTE yccmd;
  51. BYTE ykcmd;
  52. BYTE ddcmd;
  53. BYTE yxbitbytes;
  54. BYTE ycbitbytes;
  55. BYTE ykbitbytes;
  56. BYTE ddbitbytes;
  57. BYTE yksendindex;
  58. BYTE readbit;
  59. #ifdef MODBUS_YX_REG_NUM
  60. /*遥信寄存器个数的取值(针对遥信按位取的情况):
  61. 如果为0,则寄存器数量依据点号的范围判断(例如读取0X20~0X35范围内的若干个遥信,则起始地址为0X20,寄存器个数为2);
  62. 如果为1,则寄存器数量=最大点号-最小点号,可以理解为遥信个数(例如读取0X20~0X35范围内的若干个遥信,则起始地址为0X20,寄存器个数为21);*/
  63. BYTE yxregnum;
  64. #endif
  65. WORD coiladdr;
  66. WORD yc_rate;
  67. WORD ykval_h; //遥控合
  68. WORD ykval_f; //遥控分
  69. bool bcfg;
  70. BYTE cmd_dinum;
  71. BYTE cmd_datnum;
  72. BYTE dat_dir;
  73. BYTE cmdnum;
  74. BYTE bCurrent;
  75. MODBUS_CMD_DEF tcmd[MODBUS_CMD_NUM];
  76. BYTE infnum;
  77. MODBUS_EXT_INF tinf[MODBUS_INF_MAX];
  78. // 遥控发送标志
  79. // 每bits代表一个开关,bit0代表公共,一共1个公共和31个开关。
  80. u32 yk_send_flag;
  81. DWORD dWaitTime; //发送间隔
  82. DWORD dsendtime;
  83. REMOTEYKSTATUS tyk;
  84. }MODBUS_DEF;
  85. void modbus_Applay(MODBUS_DEF *pt);
  86. void modbus_Recv(MODBUS_DEF *pt,unsigned char byRevData);
  87. void modbus_AutoTimer(MODBUS_DEF *pt);
  88. void modbus_Init(MODBUS_DEF *pt,BYTE chnl);
  89. extern BYTE MoDusCRCtableHi[] ; // Modbus 高位校验码
  90. extern BYTE MoDusCRCtableLo[];
  91. WORD Modbus_CRC16(BYTE *inbytes, WORD CRCnumber); // 返回,低字节在高位
  92. #endif