📄 mib.h
字号:
#ifndef _MIB_H
#define _MIB_H
#include "epa.h"
#include "cs.h"
#ifdef MIB_GLOBALS
#define MIB_EXTERN
#else
#define MIB_EXTERN extern
#endif // MIB_GLOBALS
/*------------------------------------------------------------------------------*
*- EPA Mib const definition
*------------------------------------------------------------------------------*/
#define MIB_NUM_FBAPP (5)
#define MIB_NUM_DOMAINAPP (5)
#define MIB_NUM_LINKOBJ (5)
#define MIB_BASE_OBJID_MIBHDR (1)
#define MIB_BASE_OBJID_DEVDES (2)
#define MIB_BASE_OBJID_CLKSYNC (3)
#define MIB_BASE_OBJID_MAXRSPTIME (4)
#define MIB_BASE_OBJID_COMSCHEDULE (5)
#define MIB_BASE_OBJID_DEVAPP (6)
#define MIB_BASE_OBJID_FBAPPHDR (7)
#define MIB_BASE_OBJID_FBAPP (2000)
#define MIB_BASE_OBJID_DOMAINHDR (9)
#define MIB_BASE_OBJID_DOMAINAPP (4000)
#define MIB_BASE_OBJID_LINKOBJHDR (8)
#define MIB_BASE_OBJID_LINKOBJ (5000)
/*------------------------------------------------------------------------------*
*- EPA Mib Data-type definition
*------------------------------------------------------------------------------*/
typedef struct {
uint16 obj_id;
uint16 ver;
} MIBHdr, *PMIBHdr;
// EPA设备描述对象
typedef struct {
uint16 obj_id;
Octet res[2];
VisualString dev_id; // 设备标识
VisualString pd_tag; // 设备位号
uint32 act_ip; // 当前可操作IP地址
uint8 dev_type; // 设备类型
uint8 status; // 设备所处状态
uint16 dev_ver; // 设备版本号
uint16 ann_interval; // 设备声明发送的时间间隔
uint16 ann_ver; // 所发送声明的版本号
uint8 dev_r_state; // 设备冗余状态
uint8 dev_r_num; // 设备冗余号
uint16 lan_r_port; // 设备冗余消息处理端口
uint16 max_r_num; // 设备最大冗余个数
boolean dup_tag_detected; // 设备的物理位号是否与网络中其他设备重复
} DevDes, *PDevDes;
// 同步对象
typedef struct {
uint16 obj_id;
uint16 clk_syn_protocol; // 时间同步协议类型字
Octet res[2];
uint32 pri_time_srver; // 主时钟服务器的IP地址
uint32 sec_time_srver; // 从时钟服务器的IP地址
uint32 req_time_out; // 时间客户等待时间服务器应答的时间
uint32 req_time_interval; // 时间客户发送时间请求的时间间隔
uint32 cap_time_sync; // 时间客户支持的时间同步精度
uint32 tar_time_sync; // 要求时间客户支持的时间同步精度
BinaryDate cur_time; // 设备当前时间
TIMEDIFF std_time_diff; // 标准时间差
} ClkSync, *PClkSync;
// 最大响应时间对象
typedef struct {
uint16 obj_id;
Octet res[2];
TimeDiff max_rsp_time; // 证实服务的最大响应时间,单位:毫秒
} MaxRsp, *PMaxRsp;
// 通信调度管理对象
typedef struct {
uint16 obj_id;
Octet res[2];
TimeDiff com_macro_cyc; // 设备所在的微网段通信宏周期
TimeDiff non_prd_offset; // 一个通信宏周期内,非周期报文传输开始时间相对于通信宏周期开始时间的时间偏离量.
uint16 macro_cyc_ver; // 通信宏周期版本号
} ComSch, *PComSch;
// 设备应用信息对象
typedef struct {
uint16 obj_id;
uint16 xddl_ver; // 设备描述语言版本号
} DevApp, *PDevApp;
// 功能块应用信息对象首部
typedef struct {
uint16 obj_id;
uint16 num_fb_obj; // 功能块应用信息对象的数目
uint16 first_fb_obj; // 功能块应用信息对象的起始标识
} FBAppHdr, *PFBAppHdr;
// 功能快应用信息对象
typedef struct {
uint16 obj_id;
Octet res[2];
VisualString name; // 名称
uint16 type; // 功能块的类型
uint16 max_instantion; // 功能块的最大实例化个数
uint32 exec_time; // 功能块执行时间,单位为毫秒
uint16 first_instantion; // 功能块实例化时可分配的第一个实例标识
} FBApp, *PFBApp;
// 域应用信息对象首部
typedef struct {
uint16 obj_id;
uint16 num_domain_obj; // 设备中域应用信息对象类的个数
uint16 first_domain_obj; // 第一个域应用信息对象在系统管理信息库中的索引
uint16 cfged_domain_obj; // 已组态的域对象的个数
uint16 uncfged_domain_obj; // 未组态的域对象的个数
} DomainAppHdr, *PDomainAppHdr;
// 域应用信息对象
typedef struct {
uint16 obj_id;
uint16 domain_obj_id; // 域应用对象对应的域对象的索引号
boolean cfg_status; // 域对象的组态状态,booleanen类型,其值为TRUE时表示该域对象已未组态
Octet res[3];
VisualString name; // 名称
} DomainApp, *PDomainApp;
//EPA链接对象首部
typedef struct {
uint16 obj_id;
uint16 num_link_obj; // 链接对象个数
uint16 first_link_obj; // 第一个组态的链接对象ID
uint16 cfged_link_obj; // 第一个未组态的链接对象ID
uint16 uncfged_link_obj; // 已组态的链接对象个数
} LinkObjHdr, *PLinkObjHdr;
//EPA链接对象
typedef struct {
uint16 obj_id;
uint16 local_app; // 本地功能块实例标识。
uint16 local_obj; // 本地变量对象索引号。
uint16 rmt_app; // 远程功能块实例标识。
uint16 rmt_obj; // 远程元素对象标识。
uint8 srv_op; // 链接对象所应用的EPA服务标识:
uint8 srv_role; // 本地对象在通信过程中的角色:
uint32 rmt_ip; // 远程设备的IP地址;如本地和目标功能块实例对象同处于一个EPA设备,则该属性可以忽略;如EPA服务操作使用广播或群播方式,该属性应为广播或群播组地址
TimeDiff send_time_offset; // 报文发送时间相对于通信宏周期起始时间的偏离量。当ServiceID为DISTRIBUTE,并且ServiceRole为0时,该参数有效。
} LinkObj, *PLinkObj;
/*------------------------------------------------------------------------------*
*- EPA Mib global variable definition
*------------------------------------------------------------------------------*/
MIB_EXTERN MIBHdr gmib_hdr;
MIB_EXTERN DevDes gdev_des;
MIB_EXTERN ClkSync gclk_sync;
MIB_EXTERN MaxRsp gmax_rsp;
MIB_EXTERN ComSch gcom_sch;
MIB_EXTERN DevApp gdev_app;
MIB_EXTERN FBAppHdr gfb_app_hdr;
#if MIB_NUM_FBAPP > 0
MIB_EXTERN FBApp gfb_app[MIB_NUM_FBAPP];
#endif // MIB_NUM_FBAPPOBJ
MIB_EXTERN DomainAppHdr gdomain_app_hdr;
#if MIB_NUM_DOMAINAPP > 0
MIB_EXTERN DomainApp gdomain_app[MIB_NUM_DOMAINAPP];
#endif // MIB_NUM_DOMAINAPPOBJ
MIB_EXTERN LinkObjHdr glink_obj_hdr;
#if MIB_NUM_LINKOBJ > 0
MIB_EXTERN LinkObj glink_obj[MIB_NUM_LINKOBJ];
#endif // MIB_NUM_LINKOBJ
/*----------------------------------------------------------------------------------*
*- Get & Set Interface of Device description object
*----------------------------------------------------------------------------------*/
__inline void GetDevID(VisualString devid) {
memcpy(devid, gdev_des.dev_id, VISUAL_STRING_LEN);
}
__inline void GetPDTag(VisualString pdtag) {
memcpy(pdtag, gdev_des.pd_tag, VISUAL_STRING_LEN);
}
__inline uint32 GetActIP(void) {
return (gdev_des.act_ip);
}
__inline uint8 GetDevType(void) {
return (gdev_des.dev_type);
}
__inline uint8 GetDevStatus(void) {
return (gdev_des.status);
}
__inline void SetDevID(VisualString devid) {
memcpy(gdev_des.dev_id, devid, VISUAL_STRING_LEN);
}
__inline void SetPDTag(VisualString pdtag) {
memcpy(gdev_des.pd_tag, pdtag, VISUAL_STRING_LEN);
}
__inline uint32 SetActIP(uint32 actip) {
gdev_des.act_ip = actip;
}
__inline void SetDevType(uint8 type) {
gdev_des.dev_type = type;
}
__inline void SetDevStatus(uint8 status) {
gdev_des.status = status;
}
__inline void SetAnnVer(uint16 ver) {
gdev_des.ann_ver = ver;
}
__inline void SetDevVer(uint16 ver) {
gdev_des.dev_ver = ver;
}
/*----------------------------------------------------------------------------------*
*- Get & Set Interface of max response time object
*----------------------------------------------------------------------------------*/
__inline uint32 GetMaxRspTime(void) {
return (gmax_rsp.max_rsp_time);
}
__inline void SetMaxRspTime(uint32 time) {
gmax_rsp.max_rsp_time = time;
}
/*----------------------------------------------------------------------------------*
*- Get & Set Interface of clock sync object
*----------------------------------------------------------------------------------*/
__inline uint32 GetReqTimeInterval(void) {
return (gclk_sync.req_time_interval);
}
__inline void SetReqTimeInterval(uint32 interval) {
gclk_sync.req_time_interval = interval;
}
/*----------------------------------------------------------------------------------*
*- Get & Set Interface of communication schedule object
*----------------------------------------------------------------------------------*/
__inline uint32 GetMacroCyc(void) {
return (gcom_sch.com_macro_cyc);
}
__inline uint32 GetNonPeriodOffset(void) {
return (gcom_sch.non_prd_offset);
}
__inline void SetMacroCyc(uint32 cycle) {
gcom_sch.com_macro_cyc = cycle;
}
__inline void SetNonPeriodOffset(uint32 offset) {
gcom_sch.non_prd_offset = offset;
}
__inline void GetMacroCycVer(uint16 ver) {
gcom_sch.macro_cyc_ver = ver;
}
/*----------------------------------------------------------------------------------*
*- Get & Set Interface of link object
*----------------------------------------------------------------------------------*/
__inline PLinkObj GetLinkObj(uint16 objid) {
return (&glink_obj[objid - MIB_BASE_OBJID_LINKOBJ]);
}
__inline PLinkObj GetLocalLinkObj(uint16 appid, uint16 objid, uint8 role) {
uint16 idx;
for(idx = 0; idx < MIB_NUM_LINKOBJ; ++idx) {
if((glink_obj[idx].local_app == appid) && (glink_obj[idx].local_obj == objid) && (glink_obj[idx].srv_role == role)) {
return (&glink_obj[idx]);
}
}
return ((PLinkObj)0);
}
__inline PLinkObj GetRmtLinkObj(uint16 appid, uint16 objid, uint8 role, uint32 ip) {
uint16 idx;
for(idx = 0; idx < MIB_NUM_LINKOBJ; ++idx) {
if((glink_obj[idx].rmt_app == appid) && (glink_obj[idx].rmt_obj == objid) && (glink_obj[idx].srv_role == role) && (glink_obj[idx].rmt_ip == ip)) {
return (&glink_obj[idx]);
}
}
return ((PLinkObj)0);
}
/*----------------------------------------------------------------------------------*
*- Read & Write Interface of objects
*----------------------------------------------------------------------------------*/
void MIBHdr_Init(void);
__inline uint8 MIBHdr_Read(uint16 idx, uint16 msg_id, uint16 src_app, uint16 src_port, uint32 src_ip) {
OctetString payload;
switch (idx) {
case 0:
h2n16(gmib_hdr.obj_id, payload);
h2n16(gmib_hdr.ver, payload + 2);
Read_Pos_Output(src_app, payload, 4, msg_id, src_port, src_ip);
break;
case 2:
h2n16(gmib_hdr.ver, payload);
Read_Pos_Output(src_app, payload, 2, msg_id, src_port, src_ip);
break;
default:
Read_Neg_Output(src_app, 1, 2, 0, msg_id, src_port, src_ip);
return EPA_SUBINDEX_ILLEGAL;
}
return EPA_NO_ERR;
}
__inline uint8 MIBHdr_Write(uint16 idx, OctetString payload, uint16 msg_id, uint16 src_app, uint16 src_port, uint32 src_ip) {
if(idx > 2) {
Write_Neg_Output(0, 1, 2, 0, msg_id, src_port, src_ip);
return EPA_SUBINDEX_ILLEGAL;
}
Write_Neg_Output(0, 1, 3, 0, msg_id, src_port, src_ip);
return EPA_OBJ_UNWRITABLE;
}
void DevDes_Init(void);
__inline uint8 DevDes_Read(uint16 idx, uint16 msg_id, uint16 src_app, uint16 src_port, uint32 src_ip) {
OctetString payload;
switch (idx) {
case 0:
h2n16(gdev_des.obj_id, payload);
payload[2] = EPA_RESERVED_VALUE;
payload[3] = EPA_RESERVED_VALUE;
memcpy(payload + 4, gdev_des.dev_id, VISUAL_STRING_LEN);
memcpy(payload + 36, gdev_des.pd_tag, VISUAL_STRING_LEN);
h2n32(gdev_des.act_ip, payload + 4 + (2 * VISUAL_STRING_LEN));
payload[8 + (2 * VISUAL_STRING_LEN)] = gdev_des.dev_type;
payload[9 + (2 * VISUAL_STRING_LEN)] = gdev_des.status;
h2n16(gdev_des.dev_ver, payload + 10 + (2 * VISUAL_STRING_LEN));
h2n16(gdev_des.ann_interval, payload + 12 + (2 * VISUAL_STRING_LEN));
h2n16(gdev_des.ann_ver, payload + 14 + (2 * VISUAL_STRING_LEN));
payload[16 + (2 * VISUAL_STRING_LEN)] = gdev_des.dev_r_state;
payload[17 + (2 * VISUAL_STRING_LEN)] = gdev_des.dev_r_num;
h2n16(gdev_des.lan_r_port, payload + 18 + (2 * VISUAL_STRING_LEN));
h2n16(gdev_des.max_r_num, payload + 19 + (2 * VISUAL_STRING_LEN));
payload[20 + (2 * VISUAL_STRING_LEN)] = gdev_des.dup_tag_detected;
Read_Pos_Output(src_app, payload, (20 + 2 * VISUAL_STRING_LEN), msg_id, src_port, src_ip);
break;
case 3:
memcpy(payload, gdev_des.dev_id, 32);
Read_Pos_Output(src_app, payload, VISUAL_STRING_LEN, msg_id, src_port, src_ip);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -