#ifndef __MODBUS_EX_LINE_SVR_H #define __MODBUS_EX_LINE_SVR_H #include "daq/daq_protocol.h" #include "utility/CommonDef_v2.h" #ifdef NET_BYTEORDER #define BITORDER 1 #endif //////////////////////////////////////////////////// // #define RxDataLen 17 // #define TxDataMaxLen 1042 #define DataMaxLen 65554 // 64 * 1024 + 帧头 + 数据头 + 校验码 + 1(保证是偶数) #define DINumberPerBlock 16 // 1个DI信息块包含的DI点数 // #define MaxObjPerFrame_DI 512 // 一帧所能包含的DI最大信息块 - 每16个点组成一个信息块,占2个字节和2个地址 // #define MaxObjPerFrame_AI 512 // 一帧所能包含的AI最大信息数 - 1个点组成一个信息块,占2个字节和1个地址 #define FixSysID_Req 15 //0x0F #define FixSysID_Ans 255 //0xFF #define ReqTypeID_DI 1 //DI #define ReqTypeID_AI 3 //AI #define DataHeadLen 8 typedef struct { uint8 HeadLo; // 0xEB uint8 HeadHi; // 0x90 uint8 SysID; // system ID, fixed uint8 PacketNoLo; // package number of frame, circle-self, 0~0xFFFF uint8 PacketNoHi; uint8 LenLo; // calculate from Multi-Flag to the last data byte uint8 LenHi; uint8 FollowupFlag; // 0-end, 1-Subsequent Package } DATA_HEAD; //数据单元标示符 #define DataBodyHeadLen 7 typedef struct { uint8 DataType; // 1-DI, 3-AI uint8 DataCountLB; // Data count uint8 DataCountMB; uint8 DataCountHB; uint8 DataStAddrLB; // Data start address uint8 DataStAddrMB; uint8 DataStAddrHB; uint8 reserved1; } DATA_BODY_HEAD; //数据单元标示符 //////////////////////////////////////////////////// typedef struct _IniRtuParam { uint32 rtuNo; uint32 totalYX; // DI点数量 uint32 totalYxBlock; // 此RTU包含的DI信息块 -- 每个信息块16位,每帧最多512个信息块 (信息块的定义与协议无关,为方便跨RTU转发数据) uint32 totalYC; // AI点数量 // uint32 totalYcFrame; // 此RTU包含的AI帧数量 -- 每帧最多512个AI点 }IniRtuParam, *LPIniRtuParam; typedef struct _IniConfig { uint32 totalRtus; uint32 totalBytesYx; uint32 totalBytesYc; uint32 totalFramesYx; uint32 totalFramesYc; uint8 bufType; // =0: 1K bytes, =1: 2K bytes, =2: 4K bytes, =3: 8K bytes, =4: 16K bytes, =5: 32K bytes, =6: 64K bytes uint8 reserved1; LPIniRtuParam rtuConfArray; }IniConfig, *LPIniConfig; typedef struct _databuf { uint8 * headP; uint8 * trailP; uint8 databuf[DataMaxLen]; } DATABUF; //////////////////////////////////////////////////// class CModbusExLnS : public CProtocol { public: CModbusExLnS(); ~CModbusExLnS(); virtual sint32 MsgProc(sint32 msg); virtual sint32 TxProc(); // 一致接口 virtual sint32 RxProc(); virtual sint32 GetZfFlag( ) { return 1; }; virtual void Init( S_PROTOCOLCFG * pcfg ); static void GetData(void *); sint32 procWriteBuffer_DI(); sint32 procWriteBuffer_AI(); private: void initStation(); void appToLink(uint8 nDataType); void resetIniParam(LPIniConfig pParam); void readIni(); void initBuffer(); void setFrameProperty(uint8 bufType); sint32 procSendDI(); sint32 procSendAI(); public: uint32 m_TxDataMaxLen; uint32 m_FrameObjNum_Max; uint32 m_FrameDINum_Max; sint32 m_hThreadGetData; bool m_bExitMe; uint8 m_b_InitBuff; uint8 m_bufValueHasReady; // =0, no value; =1, has data private: IniConfig m_iniConfig; // parameter from INI file DATABUF m_sendData; BYTE m_flagSendType; // bit0: DI, bit1: AI uint16 m_nSendFrameNo; // index base 0, frame number for each type of send uint16 m_nSendSeqNo; // 0 ~ 0xFFFF, circle-self, frame number uint8 * m_bufYX; uint8 * m_bufYC; sint32 GetNowSecond(unsigned short *mmt); sint32 m_LastSendTime; ushort mm_LastSendTime; sint32 m_State; public: /*#ifdef LOG_WIN Logger *m_logger; #endif*/ DWORD m_timeBeginYX; DWORD m_timeBeginYC; uint16 m_nYXFrameCount; uint16 m_nYCFrameCount; int m_AIfactor; }; #endif//__MODBUS_EX_LINE_SVR_H