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

📄 hss.h

📁 工控PLC冗余驱动代码,用于实现双机主从之间的冗余
💻 H
字号:
#ifndef HSS_HEAD
#define HSS_HEAD

//双口ram 1024个字节组织,发送帧数据时,前6个字节为帧头,后续的1016个字节为真正的数据
//紧跟的1个自己保留,最后一个字节为链路权限控制字节

#define FRAME_LEN				1016
#define FRAME_HEAD_OFFSIDE		6	

#define TYPE_OFFSIDE			0
#define TOTAL_OFFSIDE			1
#define	THIS_OFFSIDE			2
#define	RESERVE_OFFSIDE			3
#define	LEN_OFFSIDE				4


typedef struct frame_struct
{

#define DATA0_FRAME				0x01  			//发送0号文件数据帧
#define ECHO0_FRAME				0x00			//应答1号文件数据帧

#define	DATA1_FRAME				0x10			//发送1号同步小包数据
#define	ECHO1_FRAME				0x11			//应答1号同步小包应答

#define DATA2_FRAME				0x20			//发送2号小包数据
#define ECHO2_FRAME				0x21			//应答2号小包数据

#define DATA3_FRAME				0x30			//发送3号小包数据
#define ECHO3_FRMAE				0x31			//应答3号小包数据

#define ERROR_FRAME				0xFF			//错误帧,重新复位

	unsigned char	type;						//协议类型
	unsigned char	total;						//总帧数
	unsigned char	sending_pack;				//目前帧号
	unsigned char	reserve;					//保留
	unsigned short	len;						//这一帧的长度,如果为第一帧,表示总的长度
	char		    buff[FRAME_LEN];			//应用层数据

}__attribute__((packed)) frame_struct;


typedef struct send_state_struct{
#define	SENDING_PACK				 1
#define NO_SENDING					 0
	unsigned char sending ;						//表示是否正在发送数据包
	unsigned char total_pack;					//总的帧个数。
	unsigned short total_len;					//数据包长度
	unsigned long  last_send_time;				//这帧发送时间,用于超时控制
	unsigned char sending_pack;					//上一次发送的帧号,从1开始。
	unsigned char resend_count;					//重发次数;added 2007-01-17,只能重发1次

}__attribute__((packed)) send_state_struct;

typedef struct all_send_state_struct
{
#define MAX_PRIO 8
#define NO_PREEMPTED  0							//0号没有被打断
#define HAS_PREEMPTED 1							//0号被打断
#define WAIT_SENDING 4							//有高优先级数据包等待发送
	unsigned char sending;						//当前状态,只要有任何数据包在发送,就置为发送状态
	unsigned char has_preempted;				//0号优先级发送是否被打断
	unsigned char waiting_send;					//是否有高优先级包需要抢占
	unsigned long  last_send_time;				//最近一帧发送时间,用于超时控制
	send_state_struct send_state[MAX_PRIO];		//代表0-MAX_PRIO号优先级的发送状态
}__attribute__((packed)) all_send_state_struct;


typedef struct recv_state_struct{
#define NO_PACKET						0		//接受缓冲区没有数据包
#define HAS_PACKET						1		//接受缓冲区有完整数据包
#define RECVING_PACKET					2		//正在接受数据包
	
	unsigned char has_pack;						//表示当前是否正在接受
	unsigned char recv_pack;					//上一次收到的帧号,从1开始;
	unsigned char total_pack;					//总的帧个数;
	unsigned short total_len;					//数据包长度 
	unsigned long last_time;					//这一帧接受时间,用于超时控制

}__attribute__((packed)) recv_state_struct;

typedef struct all_recv_state_struct{
#define NO_RECVING	0
	unsigned char recving;						//当前状态,只要有任何数据包在接受,就置为接受状态
	unsigned char has_int;						//0号优先级接受是否被打断
	unsigned char need_preempted;				//是否有高优先级包需要抢占
	unsigned long last_time;					//最近一帧接受时间,用于超时控制
	recv_state_struct recv_state[MAX_PRIO];		//表示0-MAX-PRIO号优先级的接受状态
}__attribute__((packed)) all_recv_state_struct;


typedef struct link_state_struct{
	unsigned char reserve;


}__attribute__((packed)) link_state_struct;


#define HSS_OK					1
#define HSS_ERROR				0

#define SNDBUFF_OVERFLOW		-1

#define SER_SENDBUF_SIZE	0					//发送缓冲区大小,可设置、获取
#define SER_RECVBUF_SIZE	1					//接收缓冲区大小,可设置、获取
#define SER_FIONBIO			2					//阻塞或者非阻塞,0阻塞,1阻塞,可设置、获取
#define SER_SEND_TIMEOUT	3					//发送超时时间,以ms为单位,设置了阻塞模式后才可有效,0表示时间无限长,默认10s,可设置、获取
#define SER_RECV_TIMEOUT	4					//接收超时时间,以ms为单位,设置了阻塞模式后才可有效,0表示时间无限长,默认10s,可设置、获取
#define SER_SENDBUF_AVAIL	5					//当前可用的发送缓冲区大小,只可获取,应用层在发送一个数据包之前判断
#define SER_ERROR_STATUS	6					//获取错误状态
#define GET_TIME			7					//获取时间
#define SEND_PRIO_DATA		8					//发送诊断数据
#define RECV_PRIO_DATA		9					//发送诊断数据
#define ADJUST_TIME			0x0A				//校时 


#define DUAL_SYN_PORT		1					//同步
#define DUAL_DIAG_PORT		2					//诊断


#define SER_ERROR_OK				0			//无错误
#define SER_ERROR_SENDBUF_OVERFLOW	1			//发送缓冲区不够
#define SER_ERROR_RECVBUF_OVERFLOW	2			//接收缓冲区不够
#define SER_ERROR_NONBLOCK			3			//当前是非阻塞模式,不能操作超时时间
#define SER_ERROR_COM				4			//通讯链路错误
#define SER_ERROR_UNKNOWN			5			//未知类型的错误

#define SER_RESET					0x11		//重新初始化各种状态


#define TIMER_INTERVAL				10			//定时器间隔

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -