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

📄 mib.h

📁 包括EPA协议栈
💻 H
📖 第 1 页 / 共 3 页
字号:
#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 + -