📄 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 + -