| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 | 
							- #ifndef C315_PROTOCOL_H
 
- #define C315_PROTOCOL_H
 
- #pragma once
 
- #include "GlobalHead.h"
 
- #include "AlarmDefine.h"
 
- #include <set>
 
- #include <vector>
 
- #pragma pack(push, 1)
 
- #define FRAME_HEADER_315		"qknet"		//帧头
 
- #define FRAME_TYPE_HEARTBEAT	0x0F		//心跳帧
 
- #define FRAME_TYPE_DATA			0x8F		//数据帧
 
- #define FRAME_TAIL_315			0xFFFFFFFF	//帧尾
 
- //与JHD系统的通信协议
 
- #define PROTOCAL_CODE			0x02			//协议码
 
- #define PROTOCAL_DATAVERSION	0x01			//数据版本
 
- //命令帧 应答帧 主动上送帧 回执帧等
 
- enum FRAME_KIND {
 
- 	CMD = 0,
 
- 	RECV,
 
- 	SEND,
 
- 	BACK,
 
- 	GENERAL
 
- };
 
- //scz 2022.11.09 新增 待补全
 
- enum class E_315_PROTOCOL_TYPE : uint8_t
 
- {
 
- 	ACTIVE_KEEP = 0,			//心跳包
 
- 	E_315_PROTOCOL_0x23 = 0x23,		//缺口配置	道岔缺口
 
- 	E_315_PROTOCOL_0x26 = 0x26,		//道岔缺口数值	 
 
- 	E_315_PROTOCOL_0x27 = 0x27,		//道岔缺口报警、预警及图像视频信息	 
 
- 	E_315_PROTOCOL_0x29 = 0x29,		//道岔缺口最新图像	 
 
- 	E_315_PROTOCOL_0x32 = 0x32,		//历史图像信息列表	 
 
- 	E_315_PROTOCOL_0x2A = 0x2A,		//历史图像信息	 
 
- 	E_315_PROTOCOL_0x2E = 0x2E,		//视频信息列表	 
 
- 	E_315_PROTOCOL_0x2F = 0x2F,		//视频文件	 
 
- 	E_315_PROTOCOL_0x22 = 0x22,		//1DQJ、区段状态信息	 
 
- 	E_315_PROTOCOL_0x25 = 0x25,		//油压曲线	 
 
- 	E_315_PROTOCOL_0x24 = 0x24,		//油位及缺口采集设备状态信息	 
 
- 	E_315_PROTOCOL_0x30 = 0x30,		//视频流信息	 
 
- 	E_315_PROTOCOL_0x31 = 0x31,		//请求命令时转辙机的定反位状态	 
 
- 	//E_315_PROTOCOL_0x40 = 0x40,		//全行程受力信息	全行程子系统占用
 
- 	//E_315_PROTOCOL_0x41 = 0x41,		//全行程最新值	 
 
- 	//E_315_PROTOCOL_0x42 = 0x42,		//服务端回执主动推送的全行程最新值.	 
 
- 	//E_315_PROTOCOL_0x43 = 0x43,		//全行程预报警信息	 
 
- 	//E_315_PROTOCOL_0x44 = 0x44,		//服务端回执主动推送预报警信息	 
 
- 	//E_315_PROTOCOL_0x45 = 0x45,		//测试历史数据	 
 
- 	//E_315_PROTOCOL_0x46 = 0x46,		//查询曲线时间信息	 
 
- 	//E_315_PROTOCOL_0x47 = 0x47,		//查询曲线数据	 
 
- 	//E_315_PROTOCOL_0x48 = 0x48,		//服务端回执主动推送曲线数据	 
 
- 	E_315_PROTOCOL_0x50 = 0x50,		//受力配置信息	受力监测子系统
 
- 	E_315_PROTOCOL_0x51 = 0x51,		//受力最新值	 
 
- 	E_315_PROTOCOL_0x52 = 0x52,		//服务端回执主动推送的受力最新值	 
 
- 	E_315_PROTOCOL_0x53 = 0x53,		//受力预报警信息	 
 
- 	E_315_PROTOCOL_0x54 = 0x54,		//服务端回执主动推送预报警信息	 
 
- 	E_315_PROTOCOL_0x55 = 0x55,		//测试历史数据	 
 
- 	E_315_PROTOCOL_0x56 = 0x56,		//查询曲线时间信息	 
 
- 	E_315_PROTOCOL_0x57 = 0x57,		//查询曲线数据	 
 
- 	E_315_PROTOCOL_0x58 = 0x58,		//服务端回执主动推送曲线数据	 
 
- 	//E_315_PROTOCOL_0x60 = 0x60,		//框架配置信息	道岔框架系统
 
- 	//E_315_PROTOCOL_0x61 = 0x61,		//框架最新值	 
 
- 	//E_315_PROTOCOL_0x62 = 0x62,		//服务端回执主动推送的框架最新值	 
 
- 	//E_315_PROTOCOL_0x63 = 0x63,		//框架预报警信息	 
 
- 	//E_315_PROTOCOL_0x64 = 0x64,		//服务端回执主动推送预报警信息	 
 
- 	//E_315_PROTOCOL_0x65 = 0x65,		//测试历史数据	 
 
- 	//E_315_PROTOCOL_0x66 = 0x66,		//查询曲线时间信息	 
 
- 	//E_315_PROTOCOL_0x67 = 0x67,		//查询曲线数据	 
 
- 	//E_315_PROTOCOL_0x68 = 0x68,		//服务端回执主动推送曲线数据	 
 
- };
 
- //协议头
 
- typedef struct CPTL_Head
 
- {
 
- 	BYTE sHead[5];										//帧头5B
 
- 	BYTE byProtocolCode;								//协议码1B
 
- 	BYTE byDataVersion;									//数据版本1B
 
- 	BYTE byFrameType;									//帧类型1B
 
- 	DWORD dwFrameLen;								//帧内容长度4B
 
- }CPTL_HEAD, * PCPTL_HEAD;
 
- enum class TIEDA_VAL_STATE : uint8_t
 
- {
 
- 	TVS_POLL = 0x00,//为轮询值,日常采集
 
- 	TVS_MOVEING = 0x01,//扳动过程采集值
 
- 	TVS_AFTER_MOVE = 0x02,  //为扳动后采集值
 
- 	TVS_PASSING = 0x03, //过车过程中采集值
 
- 	TVS_AFTER_PASS = 0x04, //过车后采集值
 
- };
 
- enum class TIEDA_VAL_SYMBOL : uint8_t
 
- {
 
- 	TVS_POSITIVE_NUMBER = 0x00,
 
- 	TVS_MINUS_NUMBER = 0x01,
 
- };
 
- //铁大采集值
 
- /*
 
- 采用3字节定义一个采集值,D0~D15:采集数值,D16~D19:采集精度,D20~D22:值状态,D23:值正负。
 
- 采集精度:1=表示精度为1,即采集数值为实际的采集值.
 
- 		  2=表示精度为10,表示采集数值为实际采集值*10.
 
- 		  3=表示精度为100,表示表示采集数值为实际采集值*100.
 
- 		  4=表示精度为1000,表示表示采集数值为实际采集值*1000.
 
- 		  5=表示精度为0.1,表示表示采集数值为实际采集值/10.
 
- 		  6=表示精度为0.01,表示表示采集数值为实际采集值/100.
 
- 		  7=表示精度为0.001,表示表示采集数值为实际采集值/1000.
 
- 值状态:0=表示为轮询值,日常采集
 
- 		1=表示扳动过程采集值
 
- 		2=表示为扳动后采集值
 
- 		3=表示过车过程中采集值
 
- 		4=表示过车后采集值
 
- 值正负:0=正值
 
- 		1=负值.
 
- 0xFFFFFF表示无效值,采集传感器故障、超量程异常、通讯丢失等;
 
- 当处于某状态时(例如扳动中,此时缺口值无效),状态值为1,精度不变,采集值填0xFFFF,表示在该状态下,采集值无意义;
 
- 例如: 采集值 byte val[3]={ 0x81,0x00,0x23}; 表示采集值为0x0081, 精度为3(100),状态为2(扳动后),正负为0(正值),实际值为(1.29f);
 
- 采集值 byte val[3]={ 0x81,0x00,0xA5}; 表示值为0x0081, 精度为5(0.1),状态为2(扳动后),正负为1(负值),实际值为-1290;*/
 
- union TIEDA_ACQ_VALUE
 
- {
 
- 	//uint8_t value[3];
 
- 	struct {
 
- 		uint16_t v;					//值  默认 实际采集值/10
 
- 		uint8_t precision : 4;   //精度  默认5
 
- 		TIEDA_VAL_STATE state : 3;    //状态
 
- 		TIEDA_VAL_SYMBOL symbol : 1;   //符号
 
- 	};
 
- 	TIEDA_ACQ_VALUE(int32_t a, TIEDA_VAL_STATE b, uint8_t d = 5)
 
- 	{
 
- 		symbol = TIEDA_VAL_SYMBOL::TVS_POSITIVE_NUMBER;
 
- 		if (a <= -INVLID_VAL || a >= INVLID_VAL)
 
- 		{
 
- 			v = USHORT_MAX;
 
- 		}
 
- 		else if (a < 0)
 
- 		{
 
- 			a = -a;
 
- 			symbol = TIEDA_VAL_SYMBOL::TVS_MINUS_NUMBER;
 
- 		}
 
- 		precision = d;
 
- 		if (d == 5)
 
- 			v = a / 10;
 
- 		else
 
- 			v = a;
 
- 		state = b;
 
- 	}
 
- 	TIEDA_ACQ_VALUE(int a)
 
- 	{
 
- 		if (a == INT_MIN)
 
- 			memset(this, 0xff, 3);
 
- 	}
 
- 	TIEDA_ACQ_VALUE()
 
- 	{
 
- 		v = 0;
 
- 		precision = 5;
 
- 		state = TIEDA_VAL_STATE::TVS_POLL;
 
- 		symbol = TIEDA_VAL_SYMBOL::TVS_POSITIVE_NUMBER;
 
- 	}
 
- 	float tovalue()
 
- 	{
 
- 		BYTE* val = (BYTE*)this;
 
- 		if (val[0] == 0xFF && val[1] == 0xFF && val[2] == 0xFF)
 
- 			return INT_MIN;
 
- 		float n = v;
 
- 		if (symbol == TIEDA_VAL_SYMBOL::TVS_MINUS_NUMBER) n *= -1;
 
- 		switch (precision)
 
- 		{
 
- 		case 2:
 
- 			n /= 10.0;
 
- 			break;
 
- 		case 3:
 
- 			n /= 100.0;
 
- 			break;
 
- 		case 4:
 
- 			n /= 1000.0;
 
- 			break;
 
- 		case 5:
 
- 			n *= 10.0;
 
- 			break;
 
- 		case 6:
 
- 			n *= 100.0;
 
- 			break;
 
- 		case 7:
 
- 			n *= 1000.0;
 
- 			break;
 
- 		default:
 
- 			break;
 
- 		}
 
- 		return n;
 
- 	}
 
- 	string tostring()
 
- 	{
 
- 		float n = tovalue();
 
- 		if (n == INT_MIN)
 
- 			return "无效值";
 
- 		string msg;
 
- 		switch (state)
 
- 		{
 
- 		case TIEDA_VAL_STATE::TVS_POLL:
 
- 			msg = "日常采集:";
 
- 			break;
 
- 		case TIEDA_VAL_STATE::TVS_MOVEING:
 
- 			msg = "扳动过程采集:";
 
- 			break;
 
- 		case TIEDA_VAL_STATE::TVS_AFTER_MOVE:
 
- 			msg = "扳动后采集:";
 
- 			break;
 
- 		case TIEDA_VAL_STATE::TVS_PASSING:
 
- 			msg = "过车中采集:";
 
- 			break;
 
- 		case TIEDA_VAL_STATE::TVS_AFTER_PASS:
 
- 			msg = "过车后采集:";
 
- 			break;
 
- 		default:
 
- 			break;
 
- 		}
 
- 		msg += to_string(n);
 
- 		return msg;
 
- 	}
 
- };
 
- //道岔缺口配置信息(315) 命令码:0x23
 
- typedef struct
 
- {
 
- 	BYTE cmdid;			//命令码:0x23
 
- 	WORD cfgcnt;		//配置数
 
- 	LPVOID lpcfg;		//转辙机配置i
 
- }StGapCfgRes;
 
- //转辙机配置
 
- typedef struct
 
- {
 
- 	BYTE nlen;		//转辙机名称长度
 
- 	LPSTR lpname;	//转辙机名称
 
- 	BYTE stype;		//转辙机类型
 
- 	WORD sid;		//转辙机ID
 
- 	WORD cnt;		//采集信息个数
 
- 	LPWORD lpinfo;	//采集信息类型
 
- }StSwitchCfg;
 
- //道岔缺口配置信息 end
 
- //曲线信息
 
- typedef struct
 
- {
 
- 	BYTE cmdid;			//命令码:0x46/0x56/0x66
 
- 	DWORD starttime;	//开始时间
 
- 	DWORD endtime;		//结束时间
 
- 	WORD  cnt;			//牵引点数目
 
- 	LPVOID lpcfg;		//牵引点配置
 
- }StCurveCfgRes;
 
- //配置
 
- typedef struct
 
- {
 
- 	WORD sid;		//转辙机ID
 
- }StTractionCfg;
 
- //配置
 
- typedef struct
 
- {
 
- 	WORD sid;		//转辙机ID
 
- 	WORD  cnt;		//记录数目
 
- 	LPVOID lpcrecord;//记录
 
- }StTractionCfg1;
 
- //配置
 
- typedef struct
 
- {
 
- 	DWORD time;		//结束时间
 
- }StTractionCfg11;
 
- //配置信息 end
 
- //配置信息
 
- typedef struct
 
- {
 
- 	BYTE cmdid;			//命令码:0x40/0x50/0x60
 
- 	WORD  cnt;			//配置个数
 
- 	LPVOID lpcfg;		//配置信息
 
- }StNodeCfgRes;
 
- typedef struct 
 
- {
 
- 	BYTE namelen;		//牵引点名称长度
 
- 	LPSTR lpname;		//牵引点名称
 
- 	WORD sid;			//牵引点ID
 
- 	BYTE cnt;			//采集信息个数
 
- 	WORD lpinfo[0];		//采集信息类型
 
- }StNodeInfo;
 
- //配置
 
- typedef struct
 
- {
 
- 	WORD acqTypeID;		//采集信息类型码
 
- }StNodeAcqCfg;
 
- struct NodeConfig
 
- {
 
- 	CString strNodeName;
 
- 	WORD	wNodeID;
 
- 	std::vector<WORD> vecAcqTypeID;
 
- };
 
- struct NodeRealData
 
- {
 
- 	DWORD	dwAcqTime;
 
- 	WORD	wNodeID;
 
- 	BYTE	byFixInvert;	//定反位
 
- 	std::vector<WORD> vecAcqTypeID;
 
- 	std::vector<BYTE> vecStatus;
 
- 	std::vector<int>  vecAcqData;
 
- };
 
- struct stQueryAlarm
 
- {
 
- 	BYTE cmdid;			//命令码:0x43/0x53/0x63
 
- 	DWORD starttime;	//开始时间
 
- 	DWORD endtime;		//结束时间
 
- 	WORD	wNodeID;	//牵引点ID =0xffff时表示查询所有设备
 
- 	WORD	wAlarmType;	//报警类型 =0xffff时表示查询所有报警
 
- };
 
- struct stAlarmItem
 
- {
 
- 	WORD	wNodeID;
 
- 	BYTE	byAlarmType;	//报警状态
 
- 	DWORD	time;			//报警时间
 
- 	DWORD	dwRestoreTime;	//恢复时间
 
- 	WORD	wAlarmType;		//报警类型
 
- 	//BYTE	cbAlarmValue[3];//报警值
 
- 	TIEDA_ACQ_VALUE sAlarmValue; //报警值
 
- 	//BYTE	cbRefValue[3];	//参考值
 
- 	TIEDA_ACQ_VALUE sRefValue; //参考值
 
- 	WORD	wSuggestID;		//维护建议ID
 
- };
 
- //配置
 
- struct stQueryHisDataItem
 
- {
 
- 	WORD	wNodeID;	//牵引点ID
 
- 	WORD acqTypeID;		//采集信息类型码
 
- };
 
- struct stQueryHisData
 
- {
 
- 	BYTE cmdid;			//命令码:0x45/0x55/0x65
 
- 	DWORD starttime;	//开始时间
 
- 	DWORD endtime;		//结束时间
 
- 	WORD  cnt;			//数量
 
- 	WORD lpinfo[0];		//采集信息类型
 
- };
 
- struct stQueryHisCurveList
 
- {
 
- 	BYTE cmdid;			//命令码:0x46/0x56/0x66
 
- 	DWORD starttime;	//开始时间
 
- 	DWORD endtime;		//结束时间
 
- 	WORD  cnt;			//数量
 
- 	WORD lpinfo[0];		//采集信息类型
 
- };
 
- struct stQueryHisCurve
 
- {
 
- 	BYTE cmdid;			//命令码:0x46/0x56/0x66
 
- 	WORD	wNodeID;	//牵引点ID
 
- 	DWORD	time;	//时间
 
- };
 
- struct stHisStaticValue
 
- {
 
- 	DWORD dwStartTime;				  //起始时间
 
- 	std::vector<std::pair<WORD, int>> vctAcqData;
 
- };
 
- //心跳数据
 
- typedef struct
 
- {
 
- 	DWORD hbtime;		//时间: 4B的unix时间用于时钟同步
 
- 	BYTE filldata[3];	//填充3个字节的0xFF
 
- }StHeartBeat315;
 
- #pragma pack(pop)
 
- typedef std::map<time_t, int> MapTimeInt;
 
- typedef MapTimeInt::iterator MapTimeIntItor;
 
- class CCSM315Protocol
 
- {
 
- public:
 
- 	CCSM315Protocol(int nDataVersion/*CLinkAdmin* pLinkAdmin, const char* strLogName*/);
 
- 	virtual ~CCSM315Protocol();
 
- 	static void InitFrmHead12B(BYTE* pBuf, BYTE frmtype, BYTE datVer);
 
- 	static void InitFrmHead12B(CPTL_HEAD* pHead, BYTE frmtype, BYTE datVer);
 
- 	static void InitFrmHead12B(C315CommData& CommData, BYTE frmtype, BYTE datVer);
 
- 	//buf:缓冲区   size:缓冲区大小   len:取出的数据长度
 
- 	static BOOL GetFrameData(LPBYTE& buf, int& size, int& len);
 
- 	static std::string GetStrFromData(const BYTE* buf, int dwLen);
 
- public:
 
- 	static E_315_PROTOCOL_TYPE  GetProtocolType(BYTE* pBuf, WORD wDataSize);
 
- 	static BOOL IsReceiptProtocol(E_315_PROTOCOL_TYPE e);
 
- 	static BOOL GetResendProtocol(E_315_PROTOCOL_TYPE e, int& nReSendCount, int& nReSendInterval);
 
- public:
 
- 	static BOOL Parse(StHeartBeat315&, LPVOID, int);
 
- 	//接收解析
 
- public:
 
- 	static BOOL RecvParse(StGapCfgRes& data, LPVOID buf, int len);
 
- 	static BOOL RecvParse(StCurveCfgRes& data, LPVOID buf, int len, FRAME_KIND&e);
 
- 	//组装数据
 
- public:
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, const std::vector<NodeConfig>& vecConfig, C315CommData& CommData);
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, const std::vector<NodeRealData>& vecConfig, C315CommData& CommData);
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, bool bPush, 
 
- 		WORD wEqpNO, BYTE byFixOrNot, const std::vector<WORD>& vctAcqType,
 
- 		const std::vector<TIEDA_ACQ_VALUE>& vctData, const std::vector<BYTE>& vctStatus,
 
- 		const CTime& atime, C315CommData& CommData);
 
- 	//static BOOL DataSerialize(BYTE byProtocalCMD, bool bPush, int no,
 
- 	//	WORD wIdx, int num, const std::vector<int>& vctData0,
 
- 	//	const std::vector<int>& vctData1, const std::vector<int>& vctData2,
 
- 	//	DWORD atime, C315CommData& CommData);
 
- 	//static BOOL DataSerialize(BYTE byProtocalCMD, BYTE byFixOrNot, bool bPush, int no, WORD wEqpNO, int num,
 
- 	//	const MapTimeIntItor& map00, const MapTimeIntItor& map01,
 
- 	//	const MapTimeIntItor& map10, const MapTimeIntItor& map11,
 
- 	//	const MapTimeIntItor& map20, const MapTimeIntItor& map21,
 
- 	//	time_t time, C315CommData& CommData);
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, BYTE byFixOrNot, bool bPush, int no, WORD wEqpNO, int num,
 
- 		std::map<time_t, int>* mapData[], time_t tmStartSecond, time_t tmEndSecond, C315CommData& CommData);
 
- 	
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, bool bPush, int no, const std::vector<stAlarmItem>& vctAlarm, C315CommData& CommData);
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, const std::map<WORD, std::vector<DWORD>>& mapData, C315CommData& CommData);
 
- 	////first:makelong(牵引点, 采集码) second.first:采集时间 vector:采集数据列表 pair:偏移时间和采集值
 
- 	static BOOL DataSerialize(BYTE byProtocalCMD, const std::map<DWORD, stHisStaticValue>& mapData, C315CommData& CommData);
 
- public:
 
- 	static BOOL Release(StGapCfgRes&);
 
- 	static BOOL Release(StCurveCfgRes&, FRAME_KIND& e);
 
- private:
 
- 	static int	m_CSMCmdRegion_DataVersion;
 
- };
 
- #endif // !C315_PROTOCOL_H
 
 
  |