?? iec103_sf.h
字號:
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 + -