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

📄 iec103_xuji.h

📁 许继公司103规约源码
💻 H
📖 第 1 页 / 共 2 页
字号:
// 通用分类服务 (功能码+信息序号)
enum GenerFunInf {	
	GEN_FUN = 254,			// 通用分类服务功能码

	ReadTitle = 240,		// 所有标题
	ReadGroupAttrVal = 241,	// 组属性或值
	ReadEntryDir = 243,		// 条目目录
	ReadEntryAttrVal = 244,	// 条目属性或值
	GenericQuery = 245,		// 通用分类数据总查询
	WriteEntry = 248,		// 写条目
	WriteEntryAfm = 249,	// 写条目确认
	WriteEntryExec = 250,	// 写条目执行
	WriteEntryCancel = 251,	// 写条目停止
};

// 通用分类命令结构
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,
	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;
}; // 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    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公共地址
//	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

class CIEC103_XUJIPtl : public CChPtl
{
public:
	CIEC103_XUJIPtl(void)
	{
		int i;
		for(i=0; i<CH_MAX_IED_NUM; i++)
			m_IEC103Data.m_RunIed[i] = NULL;
	};
	virtual ~CIEC103_XUJIPtl(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;
	}
	//初始化节点运行参数
	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 &bycpuaddr);
	//存储相应任务数据帧
	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);
	// 被测量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);
	//通道任务 - 校时
	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 + -