#ifndef COMMUNPROC_H #define COMMUNPROC_H #include "stdafx.h" //#include "ControlCAN.h" #ifdef _WIN64 #include "include\64\ControlCAN.h" #else #include "include\32\ControlCAN.h" #endif #include "DataStructure.h" #include "WnLog.h" #define DATABUFFSIZE 512 //接收缓冲区尺寸 #define MAX_IDNUM 10 //最大节点组 (从某节点收 又要发给该节点), ////////////////////////////////////////////////////////////////////////// //ER状态 #define ERStatus 401 //ER错误状态 //EL状态 #define ELStatus 402 //EL错误状态 //ST状态 #define ComSuccess 0 //ST000通讯成功 #define IntoCheck 1 //ST001进入自检 #define HandStausCheck 100 //ST100手闸状态检测 #define SoftPowerCheck 101 //ST101软上电检测 #define MainPowerCheck 102 //ST102主回路上电检测 #define LoadCheck 103 //ST103负载检测 #define RotatingCheck 104 //ST103旋转阳极回路检测 #define SmallFocusCheck 105 //ST105小焦点灯丝回路检测 #define BigFocusCheck 106 //ST106大焦点灯丝回路检测 #define Standby 200 //待机 #define HandOne 201 #define Perspective 205 //进入耐压测试 #define ManualCalibration 301 #define Exping 500 //曝光中 #define MACOUNT_R10 21 #define MSCOUNT_R10 41 #define MXCOUNT_R10 41 #define MACOUNT_R20 41 #define MSCOUNT_R20 81 #define MXCOUNT_R20 81 static int MATABLE_R10[]={100, 125, 160, 200, 250, 320, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6300, /*7000,*/8000, 10000}; //MA10倍 //static int FLMTABLE[]={50, 63, 80, 100, 125 ,160 ,200 ,250 , 320, 400, 500, 630, 800, 1000}; //透视MA100倍 static int FLMTABLE[]={5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120, 121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140, 141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160, 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180, 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200, 210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360,370,380,390,400}; //透视MA10倍 static int MSTABLE_R10[]={100, 125, 160, 200, 250, 320, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000, 25000, 32000, 40000, 50000, 63000, 80000, 100000,125000,160000,200000,250000,320000, 400000,500000,630000,800000,1000000}; //MS100倍 static int MXTABLE_R10[]={100, 125, 160, 200, 250, 320, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000, 25000, 32000, 40000, 50000, 63000, 80000, 100000,125000,160000,200000,250000, 320000,400000,500000,630000,/*700000,*/800000,1000000};//MX1000倍 static int MATABLE_R20[]={ 100, 110, 125, 140, 160, 180, 200, 220, 250, 280, 320, 360, 400, 450, 500, 560, 630, 710, 800, 900, 1000,1100,1250,1400,1600,1800,2000, 2200,2500,2800, 3200,3600,4000,4500,5000,5600,6300,7100,8000,9000, 10000}; //MA10倍 static int MSTABLE_R20[]={ 100, 110, 120, 140, 160, 180, 200, 220, 250, 280, 320, 360, 400, 450, 500, 560, 630, 710, 800, 900, 1000, 1100, 1200, 1400, 1600, 1800, 2000, 2200, 2500, 2800, 3200, 3600, 4000, 4500, 5000, 5600, 6300, 7100, 8000, 9000, 10000,11000,12500,14000,16000,18000,20000,22000,25000, 28000,32000,36000,40000,45000,50000,56000,63000,71000,80000, 90000,100000,110000,120000,140000,160000,180000,200000,220000,250000, 280000,320000,360000,400000,450000,500000,560000,630000,710000, 800000,900000,1000000}; //MS100倍 static int MXTABLE_R20[]={ 100, 110, 120, 140, 160, 180, 200, 220, 250, 280, 320, 360, 400, 450, 500, 560, 630, 710, 800, 900, 1000, 1100, 1200, 1400, 1600, 1800, 2000, 2200, 2500, 2800, 3200, 3600, 4000, 4500, 5000, 5600, 6300, 7100, 8000, 9000, 10000, 11000, 12000, 14000, 16000, 18000, 20000, 22000, 25000, 28000, 32000, 36000, 40000, 45000, 50000, 56000, 63000, 71000, 80000, 90000, 100000, 110000, 125000, 140000, 160000, 180000, 200000, 220000, 250000, 280000, 320000, 360000, 400000, 450000, 500000, 560000, 630000, 710000, 800000, 900000, 1000000};//MX1000倍 static int FNTABLE[]={-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8}; typedef struct _HVDATA { int iCanData; }HVDATA; typedef struct _CANDATA { int iCanConnect; //设备是否连接成功 int iDeviceType; //设备类型 int iDeviceIndex; //设备索引 int iBaudRate; //设备波特率 VCI_INIT_CONFIG stInitConfig; //初始化配置参数结构 用于接收 包含每个Can的一些初始化信息 VCI_CAN_OBJ frameinfo; // 包含can的一些 错误信息 // VCI_INIT_CONFIG stInitConfigTx; //初始化配置参数结构 用于发送 int iCANIndex ; //第几个can通道 VCI_CAN_STATUS vcs; //can状态 int iRXCanIDNum; //接收节点ID的数目; int iTXCanIDNum; //发送节点ID的数目; }CANDATA; typedef struct _COMCANFLAG { BOOL blReBagFlag[100]; //发送时清,收到应答时置FLASE 数据包接收成功标示 unsigned char ucReBagIdGroup[100]; //组别标示 unsigned char ucAnswerFlag[100]; //0无异常 1超大 2 过小 int iHvConnect; }COMCANFLAG; //通信标示 typedef struct _RXPROCESS //帧接收状态标号 { BYTE byCommandRxFlag; //是否已经有命令被收到 BYTE byDataRxFlag; //是否已经有数据被收到 BYTE ucDataBagRxOK; //帧接收完毕 }RXPROCESS; typedef struct _CAN_ID { UINT uiRID; //节点收 UINT uiTID; //节点发 BYTE ucIDGroupNumber; unsigned char ucRXbuf[DATABUFFSIZE]; // 本节点所收到的帧的缓冲区 unsigned char ucTXbuf[DATABUFFSIZE]; //本节点需要发送的数据的缓冲区 //UINT uiTxHead; UINT uiRxHead; //接收缓冲区 环形结构的 填充位置 UINT uiRxTail; //接收缓冲区 环形结构的 读取位置 //UINT uiTxTail; BYTE byRxCommandTemp[5]; //帧解析之 命令缓存 BYTE byRxDataTemp[20]; //帧解析之 数据缓存 RXPROCESS stProcessRx; //帧接收状态标号 }CAN_ID; typedef struct { uint8_t id; uint16_t len; uint16_t Point; uint8_t crc; uint8_t status; uint8_t ask; }stPacketBuf; class _declspec(dllexport) CProtocolParser : public CObject { public: CProtocolParser(); ~CProtocolParser(); public: int iWorkStatus; CString strERTmp; //只记录一次错误 CString strELTmp; bool bIsR20; //是否R20 ,默认R10(false) VCI_CAN_OBJ stCanTxIformation[100], stCanRxIformation[100]; //CAN数据帧接收,发送的缓冲结构 //can端口相关信息 HVDATA stHvData[100]; int KVValueArray[220]; int MAValueArray[220]; int KViii; int MAjjj; int MACOUNT; int MSCOUNT; int MXCOUNT; int MATABLE[MACOUNT_R20]; //默认用最大值来做tmp数组 int MSTABLE[MSCOUNT_R20]; int MXTABLE[MXCOUNT_R20]; COMCANFLAG stComCanFlag;//成功标示 BOOL bSendCmding; //是否正在发送RR或者RF HWND m_hWnd; CWinThread* m_ReadThread; int iDataNumber; static BYTE bDataLen[CMDCOUNT]; //命令对应的数据长度 static BYTE CmdChar[CMDCOUNT][5]; CAN_ID stCanID[MAX_IDNUM]; //节点通信相关的结构 目前默认最高可以有十个收发节点可以定义 CANDATA stCaninfoData; //can总线的一些初始数据 bool LogEnable,ErrLogEnable; //是否启用日志,默认不启用 VCI_CAN_OBJ tCanTxIfo; unsigned char RxBufData[8]; stPacketBuf tPacketBuf; stPacketBuf tPacketRxBuf; uint8_t ucPacketRecvBuf[8]; uint8_t ucPackBuf[512]; uint8_t ucPackAckFlg; public: int GetMA(int index); int GetMAIndex(int nMA); int GetFLM(int index); int GetFLMIndex(int nMA); int GetMS(int index); int GetMSIndex(int nMS); int GetMX(int index); int GetMXIndex(int nMX); int GetFN(int index); int GetFNIndex(int nFN); int GetFOValue(); BOOL CanBusInit(void); unsigned char GetByteToRxBuf( CAN_ID *stP) ;//从buf中获取一个字节 void ProcessComunicationGen(CAN_ID *stP); //帧处理 void ClearKVMAArray(int iValue); UINT CharToInt(BYTE *byP,BYTE len); char* UintToChar(UINT IntValue,int iLen,char *cDataValue); void WriteSendLog(unsigned long ulLEN, BYTE cCMD1,int iZHENSISE,LOG_LEVEL LogLevel=NORMAL_LOG); //写发送日志 void WriteReceiveLog(BYTE byDATALEN,BYTE byRXDATA[8], BYTE byRXDATA1[6]); //写接收日志 // SendCommand函数中的iCmdFlag是为写日志 BOOL SendCommand(BYTE cCmd1,char *cCmd2,int Cmd2Size,char *CmdData,int nDataSize,BYTE ucIDGroup); //发送命令和数据给别的节点 //发送命令并返回数据 命令1 命令2 命令2长度 数据字符串 数据长度 节点ID组号 int GetCpuCommandData(BYTE cCmd1,char *cCmd2,int Cmd2Size,char *CmdData,int nDataSize,BYTE ucIDGroup); //发送命令不返回数据 命令1 命令2 命令2长度 数据字符串 数据长度 节点ID组号 void GetCpuCommandDataA(BYTE cCmd1,char *cCmd2,int Cmd2Size,char *CmdData,int nDataSize,BYTE ucIDGroup); int GetSomeCommandData(BYTE cCmd1,BYTE ucIDGroup); void CProtocolParser :: CmdDataHandle(BYTE Cmd, BYTE *RxData, BYTE DataLen,BYTE IdGrup ); BOOL CanCommuInit(); BOOL OpenCanDriver(); BOOL CloseCanDriver(); BOOL ResetCanDriver(); BOOL ClearCanBuffer(); unsigned char GetCanStatus(); BOOL StartCanDriver(); BOOL StartReadThread(); BOOL StopReadThread(); BOOL ResumeReadThread(); void WriteLogFile(CString str,LOG_LEVEL LogLevel=NORMAL_LOG); void SetR10R20(bool R20); //false-R10 true-R20 bool bSendHeader(uint8_t ucPacketId,uint16_t usLend); bool bSendEnder(uint8_t CRC); bool bSendAsker(uint8_t id,uint8_t ok); bool bSendvalue(uint8_t *aupValue,uint8_t len); bool bSendPacket(uint8_t ucPacketId,uint8_t *aupValue,uint16_t usLen); bool bSendPacketValue(uint8_t ucPacketId,uint8_t *aupValue,uint16_t usLen); void vRecvMainBoardUncode(uint8_t ucPacketRecvBuf[8]); void vPacketUncode(); private: int n5MinPrompt; static UINT ReceiveThread(void *param); CString LogFilePath; CFile m_file; void InitCmdData(); void ClearLogs(CString logFilePath, int numberOfKeptFiles); void CloseLogFile(); void SetLogHead(CString& path); //增加错误日志 CFile m_ErrorFile; CString ErrLogFilePath; void WriteErrorLog(CString str); BOOL CreateErrorLogFile(); void CloseErrorLogFile(); void SetTimeHead(CString& date); }; #endif