⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iec103_sf.h

📁 四方公司103规约
💻 H
📖 第 1 页 / 共 2 页
字号:
		eOther,
		eEnd,
	};
	//
	struct GinGrouptoType
	{
		eGinGroupType	gintype;		//类型
		BYTE			gingroup;		//组号
	};

	// 通用分类命令结构
	struct C_GC_CMD 
	{
		BYTE	byAdd;
		BYTE	inf;
		RII		rii;
		GIN		gin;
		KOD		kod;
	};
	// 一般命令数据描述
	struct GRC_CMD 
	{
		BYTE fun;
		BYTE inf;
		DCO dco;
		RII	rii;
	};
	// 故障录波数据描述
	struct FaultData
	{
		TOO too;
		TOV tov;
		FAN fan;
		ACC acc;
	};
	// 控制命令信息
	union ReserveCmd
	{
		DCC		dcc;  
		RCC		rcc;
		CCC		ccc;
	};

	/***
	*Task103 - 规约任务描述
	*
	* 根据不同的 (任务类型+设备类型) 调用不同的组帧和解帧函数
	*****/
	// 通用分类服务读命令
	struct GenerReadDesc 
	{					
		BYTE				readGrp[256];		// 读分类命令组号
		BYTE				grpNum;				// 组数
		BYTE				grpCnt;				// 组计数
	};

	// 通用分类服务写命令 
	struct GenerWriteDesc
	{
		WORD				wSendPos;		// 发送位置计数	
		WORD				wSendFmtCnt;	// 发送帧计数
		WORD				wSendNum;		// 发送数
		BYTE				rii;			// 设置返回码 
	}; // end GenerWriteDesc

	// 控制命令
	struct ControlTask 
	{
		ReserveCmd	oldCmd;
		FunInf		funInf;
	};
	// 通道任务
	struct ChanTaskCmd 
	{
		BYTE	byAdd;	// 通道任务节点号	
	};

	// 103任务描述
	struct Task103 
	{		
		TASK		task;		// 任务区指针
		WORD		wStep;		// 任务步骤计数器
		union 
		{
			GenerReadDesc	genRead;		// 通用分类读命令
			GenerWriteDesc	genWrite;		// 通用分类写命令

			ChanTaskCmd		chanTask;
			BYTE			byTask[128];	// 任务存储缓冲区
		};
	}; // end Task103

	enum eInitStep
	{
		eInitStart,
		eInitTime,
		eInitGenAsk,			//总召唤
		eInitGenGroupAsk,		//通用分类服务总召唤
		eInitEnd,
	};

	// 运行状态描述
	struct RealRunIED
	{
		BYTE		byNodeId;		// 单元节点号
		CIED		*pDevData;		// 测控数据区

		WORD		query:1,		// 总查询: 0-定时未到 1-定时已到
					queryFull:1,	// 总召唤/召唤脉冲计数量
					linkRes:1,		// 复位链路
					linkQuery:1,	// 流量控制
					acd:1,			// 请求1级数据
					fcb:1,			// 帧计数位
					recvCode:4,		// 接收功能码
					sendCode:4,		// 发送功能码
					mode:2;			// 状态:   0-正常 1-测试模式 2-监测闭锁 3-初始化状态

		WORD		lnkNoRecvCnt;	// 通讯故障计数

		SIN			sin;			// 返回信息标识

		BOOL		bCommInitFlag;	// 通讯初始化标志false:初始化已经结束true:初始化还没有完成
		INT			nASDU5Cnt;		// 收到的asdu5帧计数
		eInitStep	step;			//初始化步骤

		BOOL		bQuryEnd;			//正常状态    普通总召唤结束标志位
		BOOL		bGenGroupQury;		//初始化状态  通用分类服务总召唤标志位
		BOOL		bDdQury;			//电度量召唤标志位
		GinGrouptoType Grouptotype[IED_USER_SIZE];//存放组号与组号类型

	}; // end DevRun

	// Flash参数
	struct FlashPara103
	{
		// 通用参数	
		WORD	byInitNum;		// 初始化重传次数
		WORD	dwFrameOver;	// 帧超时间隔
		WORD	dwQuery;		// 总查询间隔
		WORD    wTimeOver;		// 校时间隔
		// 保护遥信复归
		WORD	bOrdAfmReset;	// 确认复归(复归命令肯定确认时,保护信号复归)
		WORD	bOrderReset;	// 命令复归(复归命令毋须确认,保护信号即可复归)
		WORD	bEventVirtualYX;// 故障事项虚遥信
		WORD    bCommAddr;		// 使用单元地址还是cpu地址标志0:单元地址1:cpu地址
		WORD    byBHCPUAddr;    // 保护cpu公共地址
		WORD    byCKCPUAddr;	// 测控cpu公共地址
		WORD	bGenSelect;		// 电度量召唤与通用分类服务选择标志位
		//	WORD    byBhResetFun;   // 保护复归fun
		//	WORD    byBhResetInf;   // 保护复归inf
	};

	// 规约参数
	struct PtlPara103 
	{
		// 通用参数	
		BYTE	byInitNum;		// 初始化重传次数
		WORD	dwFrameOver;	// 帧超时间隔
		WORD	dwQuery;		// 总查询间隔
		WORD    wTimeOver;		// 校时间隔
		// 保护遥信复归
		BOOL	bOrdAfmReset;	// 确认复归(复归命令肯定确认时,保护信号复归)
		BOOL	bOrderReset;	// 命令复归(复归命令毋须确认,保护信号即可复归)
		BOOL	bEventVirtualYX;// 故障事项虚遥信
		BOOL    bCommAddr;		// 使用单元地址还是cpu地址标志0:单元地址 1:cpu地址
		BYTE    byBHCPUAddr;    // 保护cpu公共地址
		BYTE    byCKCPUAddr;	// 测控cpu公共地址
		BOOL	bGenSel;
		//	BYTE    byBhResetFun;   // 保护复归fun
		//	BYTE    byBhResetInf;   // 保护复归inf
	};	// end PtlPara103

	// 规约运行处理步骤
	enum PtlRunStep
	{
		PtlRun_PackASDU = 1,	// 应用层组帧	
		PtlRun_SendLPDU,		// 链路层发送
		PtlRun_RecvLPDU,		// 链路层接收
		PtlRun_UnpackASDU,		// 应用层解帧

		PtlRun_NoLPDU,			// 链路无接收数据
	};

	// 规约数据
	struct PtlData103 
	{	
		// 系统资源
		RealRunIED*	m_RunIed[CH_MAX_IED_NUM];	// 设备运行期描述
		BYTE        m_addrtoID[255];			// 通过设备地址查设备ID
		BYTE		m_byCycCnt;					// 循环查询ID

		PtlRunStep	m_runStep;					// 运行步骤

		// 服务原语
		CommPrim	m_prmSend;					// 发送(应用层=>链路层)
		CommPrim	m_prmRecv;					// 接收(链路层=>应用层)

		LinkSvrCls	m_lnkSvrCls;				// 链路服务类型

		// 通道任务描述
		Task103		m_task103;
		ReserveCmd	m_OldCmd;					// 遥控命令备用区

		// 链路层数据区
		WORD		m_wLinkLen;					// 链路数据帧长

		BYTE		m_bySend[300];
		WORD		m_wSendNum;

		BYTE		m_bySendCnt;				// 链路数据发送计数
		BYTE		m_bySin;					// 公用bySin

		// 计数器
		CTickCnt	m_frmOver;					// 帧等待超时
		CTickCnt	m_frmDly33;					// 帧延迟发送33位
		CTickCnt	m_queryCnt;					// 总召唤/脉冲计数计时时钟
		CTickCnt    m_timeover;                 // 校时

		WORD		m_lnkSerialError;			// 链路连续出错

	};	// end PtlData103

	/************************************************************************/
	/*    CIEC103_SFPtl                                                                      */
	/************************************************************************/
	class CIEC103_SFPtl : public CChPtl
	{
	public:
		CIEC103_SFPtl(void)
		{
			int i;
			for(i=0; i<CH_MAX_IED_NUM; i++)
				m_IEC103Data.m_RunIed[i] = NULL;
		};
		virtual ~CIEC103_SFPtl(void){PtlMemFree();};
	public:
		eCHPtlType		m_ePtlType;
		PtlData103		m_IEC103Data;
		PtlPara103		m_IEC103PtlPara;
		INT				m_nCnt;
	private:
		bool			m_bAdjustTime;//校时标志
	public:
		void InitPtl(void);
		INT  Frame(BYTE* pSendBuf, INT nLen);
		void UnFrame(BYTE* pRecvBuf, INT nLen);
		void OnTimer(void);
		void PtlMemFree();	//规约内存释放函数(在InitPtl()中申请的内存,要在此释放)
	public:
		//*SumMod - 求模和校验码
		inline BYTE SumMod(BYTE *pbyBuf, int nLen)
		{
			BYTE byRtn = 0;
			for (int i = 0; i < nLen; i++)
			{
				byRtn += *(pbyBuf+i);
			}

			return byRtn;
		}
		inline void QueryRecvLPDU(void)
		{
			m_IEC103Data.m_wLinkLen = 0;
		}
		inline INT UnpackGenData(BYTE* pbyData,GIN &gin,KOD &kod,GDD &gdd,PGID &pgid)//用引用传递函数参数
		{
			if (!pbyData)
				return 0;
			INT iCnt=0;
			gin = *(GIN*)pbyData;
			iCnt = sizeof(GIN);
			kod	= *(KOD*)(pbyData + iCnt);
			iCnt += sizeof(KOD);

			gdd.byDataTyp = *(pbyData + iCnt);
			gdd.byDataSize = *(pbyData + iCnt +	1);
			BYTE byTemp = *(pbyData + iCnt + 2);
			gdd.num = byTemp && 0x7F;
			gdd.cont = byTemp>>7;
			iCnt += sizeof(GDD);

			pgid = pbyData + iCnt;
			INT nDataLen = gdd.byDataSize * gdd.num;
			if (gdd.byDataTyp == BS_gdd)				//成组位串类型
				nDataLen = ((gdd.byDataSize + 7)/8) * gdd.num;
			iCnt += nDataLen;
			
			return iCnt;
		}
		//通用分类服务数据--遥测数据
		void M_GD_NTA_YcVal(RealRunIED* pRunIED,ASDU_10_Item &Item,BYTE* pgid);
		//
		int GetIndexbyGin(CIED* pIED,eDataSort datatype,GIN &gin);
		//
		float GetGenVal(GDD &gdd,BYTE* pgid);
		//通用分类服务数据--电度数据
		void M_GD_NTA_DdVal(RealRunIED* pRunIED,ASDU_10_Item &Item,BYTE* pgid);
		//通用分类服务数据--遥控
		void M_GD_NTA_YkVal(RealRunIED* pRunIED,ASDU_10_Item &Item,BYTE* pgid,ASDU_10_Head* pHead);

		//初始化节点运行参数
		BOOL CreateRealRunIED(CIED *pIED);
		//得到 fun+inf=>nIndex 的映射关系
		int	 GetnIndexbyFuninf(CIED *pIED,eDataSort datatype, FunInf &funInf);
		//根据IED、数据类型和数据点号得到fun+inf
		BOOL GetFunInf(CIED *pIED, eDataSort datatype, INT nDataID, FunInf &funinf);
		//得到通用分类服务组个数和各个通用分类服务组号
		void GetGininf(CIED *pIED, TASK* pTask, eDataSort datatype, BYTE &byGrpnum, BYTE* pbyGrpID); 
		//得到定值组个数
		BYTE GetSettingGrpNum(CIED *pIED, TASK* pTask);
		//得到保护定值组号gin
		void GetProtSetGrpGin(TASK* pTask, GIN &gin);
		//得到保护复归fun+inf
		void GetProtResetFuninf(TASK* pTask, FunInf &funinf);
		//从参数中得到保护复归fun+inf
		BOOL GetProtResetFuninfFromPara(RealRunIED *pDevRun,FunInf &funinf,BYTE &addr);
		//存储相应任务数据帧
		BOOL SaveTaskRespFmt(BYTE* buf, WORD wLen, TASK* pTask);
		//存储测控遥信
		void SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit, TIME_4 tm);
		void SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit);
		//得到通道波特率
		DWORD GetChRatio(void);

		//参数转换函数,从flash参数转换为规约参数
		void	FlashParaToPtlPara(FlashPara103 * pPara);
		void    DafaultPtlPara(void);							//规约默认参数设置
	public:
		//通道任务监视函数
		BOOL WatchTask(TASK* &ptask, eTaskTyp tasktyp, BYTE byNodeID);						
	public:
		//规约数据搜索函数
		void PtlSearch(BYTE *pRecvBuf, INT nLen);			
		// 链路层无数据接收
		void NoLPDU(void);
		//链路层解帧
		void UnpackLPDU(BYTE *pRecvBuf);					
		//应用层解帧函数
		void UnpackASDU_Ied(BYTE *pRecvBuf, RealRunIED *pRunIed);				
		// 带时标的报文(事项)
		void Unpack_Asdu_1(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 带相对时间的时标报文
		void Unpack_Asdu_2(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 被测值I格式
		void Unpack_Asdu_3(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 带相对时间的有时标的被测值报文
		void Unpack_Asdu_4(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 标识报文
		void Unpack_Asdu_5(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 时间同步
		void Unpack_Asdu_6(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 总查询(召唤)结束
		void Unpack_Asdu_8(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		//通用分类总召唤结束
		void Unpack_ASDU_10(BYTE* buf, BYTE len, RealRunIED* pRunIED);
		// 被测量II格式
		void Unpack_Asdu_9(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		// 通用分类数据
		void Unpack_Asdu_10(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_11(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_23(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_26(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_27(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_28(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_29(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_30(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_31(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_32(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_33(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_34(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_35(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_36(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_37(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_38(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_39(BYTE* buf, BYTE len, RealRunIED *pRunIed);

		void Unpack_Asdu_4042(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_4143(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_4446(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_4547(BYTE* buf, BYTE len, RealRunIED *pRunIed);

		void Unpack_Asdu_48(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_50(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_64(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_65(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_66(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_67(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_70(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_88(BYTE* buf, BYTE len, RealRunIED *pRunIed);
		void Unpack_Asdu_49(BYTE* buf, BYTE len, RealRunIED *pRunIed);//VQC装置上送保护事项的桢格式

		//链路层传输服务
		//1. 站初始化
		//2. 链路状态控制	
		BOOL PackLinkCmm(BYTE byNodeID);
		//固定帧长链路数据组帧
		void PackLPDU_Fix(BYTE byNodeID, BYTE byCode);
		void PackLPDU(BYTE byNodeID, BYTE code);
		//任务组帧
		BOOL PackTask(void);
		//循环查询组帧
		void PackCyc(void);
		//asdu88
		void Pack_Asdu_88(BYTE byNodeID);
		//asdu7
		void Pack_Asdu_7(BYTE byNodeID);
		//通用分类服务总查询
		void Pack_ASDU_21(BYTE byNodeID);			//lxp
		//通用分类服务--遥控
		BOOL Pack_GenYK(TASK *pTask, RealRunIED *pDevRun);
		//由通用分类组号--得到真正的组号类型
		void GetGroupType(eGinGroupType &grouptype,BYTE byGroup,RealRunIED* pIED);

		//通道任务 - 校时
		BOOL SendAdjustTime103(TASK *pTask);
		BOOL SendAdjustTime103(BYTE byaddr);
		//遥控命令组帧
		BOOL PackYaoKong(TASK *pTask, RealRunIED *pDevRun);
		//召唤保护模拟量
		BOOL PackCallProtMea(TASK *pTask, RealRunIED *pDevRun);
		//召唤保护定值
		BOOL PackCallProtSetting(TASK *pTask, RealRunIED *pDevRun);
		//修改保护定值
		BOOL PackModifyProtSetting(TASK *pTask, RealRunIED *pDevRun);
		//确认保护定值
		BOOL PackEnableProtSetting(TASK *pTask, RealRunIED *pDevRun);
		//取消修改保护定值
		BOOL PackCancelProtSetting(TASK *pTask, RealRunIED *pDevRun);
		//设置保护定值组
		BOOL PackModifyProtSettingGroup(TASK *pTask, RealRunIED *pDevRun);
		//确认设置的保护定值组
		BOOL PackEnableProtSettingGroup(TASK *pTask, RealRunIED *pDevRun);
		//取消修改保护定值组
		BOOL PackCancelProtSettingGroup(TASK *pTask, RealRunIED *pDevRun);
		// 保护复归
		BOOL PackProtRes(TASK *pTask, RealRunIED *pDevRun);
		//对保护装置虚摇信信号进行复归
		void ResetBhYx(TASK *pTask, RealRunIED *pDevRun);
		// 通道任务
		BOOL ChanTask(TASK *pTask, RealRunIED *pDevRun);

		//通用分类服务读命令
		BOOL PackGenerReadCmd(TASK* pTask, RealRunIED *pDevRun);
		//组通用分类服务写命令
		BOOL PackGenerExec(TASK* pTask, RealRunIED *pDevRun, BOOL bExec = TRUE); 
		//链路发送数据
		INT PtlSendLPDU(void);
	};

}//end namespace
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -