📄 dnpsec.h
字号:
#ifndef _DNP_H
#define _DNP_H
/*------------------------------------------------------------------------
[常数说明]
------------------------------------------------------------------------*/
/*-------------------------------物理层--------------------------------*/
#define PL_DATA 0 /*物理层服务类型*/
#define PL_INIT_DCE 1
#define PL_LINK_PSN 2
#define PL_DISLINK_PSN 3
#define PL_STATUS 4
#define PL_CF_SUCCESS 0 /*物理层返回给链路层的Confirm值*/
#define PL_CF_FAIL 1
#define PL_CF_NODONE 2
#define PL_CF_BUSY 3
/*------------------------------ 链路层 -------------------------------*/
/*FT3帧控制字节*/
#define DIR_OUT 0x0 /*发向子站*/
#define PRM_YES 0x40 /*源发站*/
#define PRM_NO 0x0 /*回应站*/
#define FCV_YES 0x10 /*FCB有效*/
#define FCV_NO 0x0 /*FCB无效*/
#define DFC_BUSY 0x10 /*回应站忙*/
#define DFC_IDLE 0x0 /*回应站闲*/
/*原方站功能码*/
#define FUNC_RESET 0x0 /*使远方链路复位*/
#define FUNC_RESET_USER 0x1 /*使用户过程复位*/
#define FUNC_TEST 0x2 /*链路测试*/
#define FUNC_DATA_ACK 0x3 /*需确认用户数据*/
#define FUNC_DATA_NACK 0x4 /*非确认用户数据*/
#define FUNC_POLL 0x9 /*链路查询*/
/*副方站功能码*/
#define FUNC_ACK 0x0 /*肯定的确认*/
#define FUNC_NACK 0x1 /*报文未收到, 链路忙*/
#define FUNC_STATUS 0x11 /*回应链路状态*/
/*链路层服务类型*/
#define DL_SEND_CF 0
#define DL_SEND_NOCF 1
#define DL_FAST_CF 2
#define DL_FAST_NOCF 3
/*链路层返回给应用层的Confirm值*/
#define DL_CF_SUCCESS 0
#define DL_CF_FAIL 1
#define DL_CF_TERM 2
#define DL_CF_NODONE 3
#define DL_CF_BUSY 4
/*------------------------------应用层---------------------------------*/
/*应用控制[Applicaiotn Control(AC)]*/
#define AL_AC_FIR 0x80 /*应用层第一段*/
#define AL_AC_FIN 0x40 /*应用层最后一段*/
#define AL_AC_CON 0x20 /*应用层确认*/
/*功能码[Function Code(FC)]*/
#define AL_FC_CONFIRM 0x00 /*确认*/
#define AL_FC_READ 0x01 /*读*/
#define AL_FC_WRITE 0x02 /*写*/
#define AL_FC_SELECT 0x03 /*遥控预置*/
#define AL_FC_OPERATE 0x04 /*遥控执行*/
#define AL_FC_COLD_RESTART 0x0D /*冷复位*/
#define AL_FC_WARM_RESTART 0x0E /*热复位*/
#define AL_FC_MEASURE 0x17 /*延时测量*/
#define AL_FC_REPLY 0x81 /*回答*/
/*内部状态[Internal Indications(IIN)]*/
#define AL_IIN_ZERO 0x0000
#define AL_IIN_ALL 0x0001 /*广播确认*/
#define AL_IIN_CLASS1 0x0002 /*1类数据(SOE),YX*/
#define AL_IIN_CLASS2 0x0004 /*2类数据(变化遥测),SOE*/
#define AL_IIN_CLASS3 0x0008 /*3类数据(故障上报),变化遥测*/
#define AL_IIN_TIME 0x0010 /*请求对钟*/
#define AL_IIN_LOCAL 0x0020 /*远动无效*/
#define AL_IIN_ERROR 0x0040 /*设备异常*/
#define AL_IIN_RESTART 0x0080 /*设备复位*/
#define AL_IIN_UNFUN 0x0100 /*未实现功能码*/
#define AL_IIN_UNOBJ 0x0200 /*未实现对象类*/
#define AL_IIN_UNIND 0x0400 /*无效索引*/
#define AL_IIN_FLOW 0x0800 /*缓冲区溢出(COS/SOE)*/
#define AL_IIN_DONE 0x1000 /*已经操作*/
#define AL_IIN_PARA 0x2000 /*配置参数失效*/
#define AL_IIN_RESVD 0xC000 /*保留*/
/*对象组[Object Group(OG)]*/
#define AL_OG_YX 0x01 /*遥信对象*/
#define AL_OG_SOE 0x02 /*遥信变化事件对象*/
#define AL_OG_YK 0x0C /*遥控对象*/
#define AL_OG_CON 0x14 /*记数对象*/
#define AL_OG_ANALOG 0x1E /*16位模拟量(30)*/
#define AL_OG_VAR1 0x20 /*变化遥测(32)*/
#define AL_OG_TIME 0x32 /*时间对象(50)*/
#define AL_OG_DELAY 0x34 /*延时对象(52)*/
#define AL_OG_CLASS 0x3C /*类对象(60)*/
#define AL_OG_FILE 0x46 /*文件对象(70)*/
#define AL_OG_STATUS 0x50 /*状态回答(80)*/
#define AL_OG_ROUT 0x5F /*路由对象(扩充)*/
/*对象变化[Object Variation(OV)]*/
#define AL_OV_YX_2 0x02 /*带状态的二进制输入*/
#define AL_OV_SOE_N_TIME 0x01 /*不带时间*/
#define AL_OV_SOE_A_TIME 0x02 /*带绝对时间*/
#define AL_OV_SOE_R_TIME 0x03 /*带相对时间*/
#define AL_OV_YK_1 0x01 /*遥控RELAY输出块*/
#define AL_OV_A_16BIT 0x04 /*无标志16位模拟量输入*/
#define AL_OV_A_32BIT 0x05 /*无标志32位计数器*/
#define AL_OV_CLASS_1 0x01 /*一类数据*/
#define AL_OV_CLASS_2 0x02 /*二类数据*/
#define AL_OV_T_48BIT 0x01 /*48位毫秒绝对时间*/
#define AL_OV_D_FINE 0x02 /*16位毫秒相对时间*/
#define AL_OV_R_1 0x01 /*路由对象(扩充)*/
/*文件对象*/
#define AL_FILE_WRITE 3 /*文件功能码-写*/
#define AL_FILE_READ 20 /*文件功能码-读*/
#define AL_FILE_REPLY 0xFF /*文件功能码-回答*/
#define DNP_AL_YK_DEL 0x20 /*遥控撤销*/
#define DNP_AL_YK_H 0x40 /*遥控合(CLOSE)*/
#define DNP_AL_YK_F 0x80 /*遥控分(TRIP)*/
#define DNP_AL_YX_H 0x81 /*遥信合*/
#define DNP_AL_YX_F 0x01 /*遥信分*/
/*------------------------------------------------------------------------
[类型说明]
------------------------------------------------------------------------*/
/*-------------------- 应用层提供给链路层的数据包 ---------------------*/
typedef __packed struct {
INT8U service; /*服务类型*/
INT16U dest; /*目的地址*/
INT8U buf[2048]; /*数据包2048*/
INT16U count; /*包长度249*N+M*/
BOOL ready; /*表示该数据包是否准备好*/
INT16U send_time; /*发送时间*/
INT8U time_service; /*完成服务的保证时间*/
} stOPacket;
/*-------------------- 链路层提供给应用层的数据包 ---------------------*/
typedef __packed struct {
INT16U source; /*源地址*/
INT8U buf[2048]; /*包缓存*/
INT16U count; /*包长度 249*N+M*/
BOOL ready; /*表示该数据包是否准备好*/
INT16U rec_time; /*接收时间*/
} stIPacket;
/*--------------------- 链路层给次物理层的数据帧 ----------------------*/
typedef __packed struct {
INT8U service; /*服务类型*/
INT8U buf[292]; /*FT3帧*/
INT16U count; /*帧长度*/
BOOL ready; /*表示该数据块是否准备好*/
INT16U send_time; /*传送时间*/
} stOFrame;
/*--------------------- 次物理层给链路层的数据帧 ----------------------*/
typedef __packed struct {
INT8U buf[292]; /*FT3帧*/
INT16U count; /*帧长度*/
BOOL ready; /*表示该数据块传输是否完成*/
INT16U rec_time; /*接收时间*/
} stIFrame;
typedef __packed struct {
INT16U soep;
INT16U soep_tmp;
INT16U SoeRp;
} SoeReadPoint;
typedef __packed struct {
INT16U NameSize;
INT8U FileType;
INT8U Attributes;
INT16U StartRecord;
INT16U EndRecord;
INT32U FileSize;
INT8U TimeCreation[6];
INT16U Permission;
INT32U FileID;
INT32U OwnerID;
INT32U GroupID;
INT8U FileFunction;
INT8U Status;
INT8U FileName[256];
INT16U RecordSize;
} stFileHead;
typedef __packed struct {
INT16S YcValue;
BOOL YcNo;
INT8U Reserve;
} VarYcValue;
#define DnpSecEnableYk 0x0001
#define DnpSecEnableClock 0x0002
#define DnpSecEnableAllData 0x0004
#define DnpSecEnableDD 0x0008
#define DnpSecEnableBroadcastCloak 0x0010
//////////////////////////////////////////////////////////////////////////
// 规约面板的默认参数
//////////////////////////////////////////////////////////////////////////
#define DnpYkEn TRUE
#define DnpClockEn TRUE
#define DnpAllDataEn FALSE
#define DnpDdEn FALSE
#define DnpAIDeadValue 5
#define DnpAllData 0
#define DnpDdTime 30
#define DnpDlDelay 0
#define DnpScanData2 5
#define DnpAlDelay 0
#define DnpClass1Data 9
#define DnpClass2Data 7
#define DnpClass3Data 0
struct DnpPadPara
{
BOOL EnYk;
BOOL EnClock;
BOOL EnAllData;
BOOL EnDD;
INT16U AIDeadValue;
INT16U AllData; //发送全数据间隔 (从站方),单位:分(minute)
INT16U DdTime; //发送电度间隔(从站方),单位:分(minute)
INT16U DlDelay; //链路层通讯延时
INT16U ScanData2; //上传变化遥测遥信时间间隔(从站方),单位:秒(Second)
INT16U AlDelay; //应用层通讯延时
INT32U Class1Data;
INT32U Class2Data;
INT32U Class3Data;
} ;
#define Dnp_Dl_Ready 0x01
#define Dnp_Al_Ready 0x02
#define Time1s 0x04
#define RxdFrame 0x08
BOOL InitDnpSecLink(INT8U Port, struct PortAppInfo* PortCfg);
void DnpSecTask(struct SysPort *info, struct PortAppInfo* PortCfg);
int DnpOnRx(INT8U port);
int ComFrame(INT8U port);
int Send(INT8U port);
void SplitPacket(INT8U port);
void FillBuffer(INT16U code,INT8U port);
void DL_Master(INT8U port);
void Request(INT8U func,INT8U port);
void HandleACK(INT8U port);
void DL_Slave(INT8U port);
void Reply(INT8U func,INT8U port);
int DlCheckSum(INT8U port);
int DnpFrame(INT8U port);
void OnApp(INT8U port);
void OnTick1s(INT8U port);
void RecConfirm(INT8U port);
void AppRes(INT8U port);
void SendStatus(INT16U iin,INT8U port);
void ResConfirm(INT8U port);
void SendYX(INT8U port);
void SendYC(INT8U port);
void SendDD(INT8U port);
void SendSOE(INT8U port);
void SendCOS(INT8U port);
void SelectYK(INT8U port);
void OperateYK(INT8U port);
void AppSend(INT16U iin, INT8U obj, INT16U count,INT8U port);
int CheckAddr(INT16U addr,INT16U DesAddr,INT8U port);
INT16U AppYcVar(INT8U port);
void SendAllData(INT8U port);
void SendVarYC(INT8U port);
void YkRespond(struct SysPort *info, struct DBBOOPInfo *msg, INT8U port);
void AppFuntion(INT32U Class,INT8U port);
#endif /* _DNP_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -