// Modbus_Tcpc.h: Modbus_Tcpc DLL 的主标头文件 // #pragma once #if !defined __MODBUS_TCPC_H__ #define __MODBUS_TCPC_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "daq/daq_protocol.h" #include #if !defined(FALSE) #define FALSE 0 #endif #define MAX_BYTE_NUM 250 #define MAX_FUNC_TYPE 43 #define MAX_CNT_NUM 3 class CModbusTcpc : public CProtocol { protected: struct Data { uint16 datauint16; sint16 datasint16; float32 datafloat; sint32 datasint32; uint32 datauint32; }; struct map { uint32 address; uint32 pointnum; uint8 m_type; uint8 r_type; Data data; uint8 start; uint8 end; uint8 visited; }*maplist; struct cmd { uint32 pointnum; uint32 address; uint8 m_type; uint8 group; uint8 func; uint8 r_type; uint8 va; uint8 start; uint8 end; }*cmdlist; sint64 m_LastSendTime; //最后发送时间 sint64 m_RcvTimeOuts; //允许的超时时间 sint32 **duqu;//读取到的配置文件 sint32 duqulength; //配置文件长度 sint32 maplength; //所有点数量 sint64 sleeptime; //使用召唤全数据周期的值来进行滞后,单位S sint64 sleepstarttime; bool readcfgflag; //读取配置文件标志 sint32 cmdlength; sint32 m_SyncTime; //同步时间间隔 uint16 cnt_sequence; //事务次数,最大为65535,2^16-1 ST_TRACK_ADDR m_cmdaddr; //处理外部命令,通过此变量保存外部命令地址信息 // uint16 m_cmdsrc_rtu; // PIPE_LABLE m_cmdsrc; uint32 mapnum; //记录所有点是否读完 uint32 mapIndex; //记录的系统点获取的位置 uint32 duquIndex; //记录每一次读取的位置 uint8 WillSendType; //处理的功能类型 uint32 visitednum; //记录本组点是否读完 uint32 scopeDI; //记录每一次DI读取长度 uint32 scopeAI; uint32 IndexDI; //当前读取到的DI地址 uint32 IndexAI; uint16 numDI; //本次读取的的DI数量 uint16 numAI; bool err; uint8 Policy; //运行状态,空闲或者繁忙,当policy为0时,处理读取遥信遥测,如果为1,处理外部命令 // 重写 bool startFlag; //线程启动、退出标志 public: CModbusTcpc(); virtual ~CModbusTcpc(); virtual sint32 RxProc(); virtual sint32 TxProc(); virtual sint32 GetZfFlag() { return 0; }; virtual void Init(S_PROTOCOLCFG* pcfg); protected: uint8 OperateRegister(uint8 FuncNo, uint16 Address, sint16 Value); uint8 OperateRegister(uint8 FuncNo, uint16 Address, uint16 Value); uint8 Operate_16(uint16 Address, uint16 num, uint16 Value, uint8 func); uint8 Operate_16(uint16 Address, uint16 num, sint16 Value, uint8 func); uint8 ProcCmd(); void putYXYC(); void GetWillSendType(); int ComparePoint(uint16 YxYcId, uint8& value); int ComparePoint_reg(uint16 YxYcId, uint8* buf, int i); sint32 CheckFrameHeader(uint8* buff, sint32 len); uint8 ErrorHandle(uint8 errfunc); sint64 GetNowMilliSecond(); void ReadCfg(); }; #endif