147 lines
3.8 KiB
C
147 lines
3.8 KiB
C
|
|
|
|||
|
|
#ifndef __MODBUS_DEF_H__
|
|||
|
|
#define __MODBUS_DEF_H__
|
|||
|
|
|
|||
|
|
#include "config.h"
|
|||
|
|
#include "serial.h"
|
|||
|
|
|
|||
|
|
//----------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// modbus Э<>鶨<EFBFBD><E9B6A8>
|
|||
|
|
/*
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
/*modbus<75><73>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>,֧<>ֵ<EFBFBD>Ѱַ<D1B0>ռ<EFBFBD>Ϊ256<35><36>
|
|||
|
|
* ----------------------------------
|
|||
|
|
* | 0 | 1-247 | 248-255 |
|
|||
|
|
* |---------------------------------
|
|||
|
|
* |<EFBFBD>㲥<EFBFBD><EFBFBD>ַ|<EFBFBD>ӽڵ<EFBFBD><EFBFBD><EFBFBD>ַ| <EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
|||
|
|
* |---------------------------------
|
|||
|
|
*/
|
|||
|
|
#ifndef MODBUS_IDXMAX
|
|||
|
|
#define MODBUS_IDXMAX 247 // ֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#define MODBUS_LENMAX 50 // <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(<28><>λ: <20><>)
|
|||
|
|
|
|||
|
|
#define MDBSRXLEN_A (MODBUS_LENMAX*4 + 21) // ASCII <20><>ʽ
|
|||
|
|
#define MDBSRXLEN_R (MODBUS_LENMAX*2 + 10) // RTU <20><>ʽ
|
|||
|
|
|
|||
|
|
#define MDBSRXLEN_MAX MDBSRXLEN_A // <20><>λ<EFBFBD>ֽ<EFBFBD>
|
|||
|
|
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
// ֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define READ_COIL_STATUS 0x01 // <20><>ȡ<EFBFBD><C8A1>Ȧ״̬(λ<><CEBB><EFBFBD><EFBFBD>)
|
|||
|
|
#define READ_INPUT_STATUS 0x02 // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬(λ<><CEBB><EFBFBD><EFBFBD>)
|
|||
|
|
#define READ_HOLDING_REGISTER 0x03 // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
|
|||
|
|
#define READ_INPUT_REGISTER 0x04 // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
#define WRITE_SINGLE_COIL 0x05 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ(λ<><CEBB><EFBFBD><EFBFBD>)
|
|||
|
|
#define WRITE_SINGLE_REGISTER 0x06 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
|
|||
|
|
#define WRITE_MULTIPLE_COIL 0x0F // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ(λ<><CEBB><EFBFBD><EFBFBD>)
|
|||
|
|
#define WRITE_MULTIPLE_REGISTER 0x10 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
#define MODBUS_RD READ_HOLDING_REGISTER // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define MODBUS_WR WRITE_SINGLE_REGISTER // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
#define MODBUS_WR_MULTI WRITE_MULTIPLE_REGISTER // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
#ifndef MODBUS_MAX_WR
|
|||
|
|
#define MODBUS_MAX_WR 10
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MODBUS_MAX_RD
|
|||
|
|
#define MODBUS_MAX_RD 10
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 midx; // <20><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
|
|||
|
|
u8 index; // վ<>ţ<EFBFBD>1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
|
|||
|
|
u8 cmd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u16 addr; // <20><><EFBFBD>ݵ<EFBFBD>ַ
|
|||
|
|
u16 wrdat[MODBUS_MAX_WR]; // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
u16 wlen; // д<><D0B4><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
u16 rddat[MODBUS_MAX_RD]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u16 rlen; // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
}Rs485Cmd;
|
|||
|
|
|
|||
|
|
#ifndef MAX_485CMD
|
|||
|
|
#define MAX_485CMD 20
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
typedef void (*Resv485ExProc)(Rs485Cmd * pcmd); // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
int init; // 1:<3A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 idxNum;
|
|||
|
|
u8 idxList[MODBUS_IDXMAX]; // վ<><D5BE><EFBFBD>б<EFBFBD>,<2C><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
|
|||
|
|
|
|||
|
|
Rs485Cmd cmdbuf[MAX_485CMD];
|
|||
|
|
// <20>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int working; // <20><><EFBFBD>ڶ<EFBFBD>д<EFBFBD><D0B4>; = 1, <20><><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
int bufCmdNum; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; != 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int bufHead;
|
|||
|
|
int bufTail;
|
|||
|
|
|
|||
|
|
int steps;
|
|||
|
|
u32 stepTime;
|
|||
|
|
|
|||
|
|
Resv485ExProc resv485exproc; // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
int modrsvTimout; // <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
|
|||
|
|
|
|||
|
|
}Rs485Ctrl;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
typedef void (*OnOffFunc)(void);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
int modBusMode; // ͨѶģʽ, = 0, RTUģʽ; = 1, ASCIIģʽ
|
|||
|
|
int filterChk; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>λ<EFBFBD><CEBB>־, = 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; = 1, <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
u32 modBusWait; // ͨѶ<CDA8><D1B6>ʱ, <20><>λus,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
|
|||
|
|
// ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
UsartSendData ModBusCommSend; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
UsartGetData ModBusCommReceive; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
UsartCleanRsBuf ModBusCommCleanRsBuf; // <20><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
IsUsartSendOver IsModBusCommSendOver; // <20>жϷ<D0B6><CFB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
|||
|
|
|
|||
|
|
OnOffFunc CommOutEn; // <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
OnOffFunc CommOutDis; // <20><><EFBFBD>ݷ<EFBFBD><DDB7>ͽ<EFBFBD>ֹ
|
|||
|
|
|
|||
|
|
}ModbusCtrl;
|
|||
|
|
|
|||
|
|
// ע<><D7A2>modbusͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
|
|||
|
|
void RegisterModbusCommFunc(ModbusCtrl* pCtrl, UsartSendData send, UsartGetData get, UsartCleanRsBuf clean, IsUsartSendOver sdover, OnOffFunc outen, OnOffFunc outdis);
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// Ĭ<>Ϻ<EFBFBD><CFBA><EFBFBD>
|
|||
|
|
int DefSendData(u8 * pDatBuf, int len);
|
|||
|
|
int DefGetData(u8 * pDat, int expectLen);
|
|||
|
|
int DefCleanRsBuf(void);
|
|||
|
|
int DefIsSendOver(void);
|
|||
|
|
void DefOutEn(void);
|
|||
|
|
void DefOutDis(void);
|
|||
|
|
u16 ModbusCrc16(u8 * puchMsg, u16 usDataLen);
|
|||
|
|
u8 AsciiToRtu(u8 ascii);
|
|||
|
|
u8 RtuToAscii(u8 rtu);
|
|||
|
|
|
|||
|
|
#endif
|