RTU/release/inc/lib60870_inc/gb103.h

354 lines
9.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* IEC103Type.h
*/
#ifndef IEC103TYPE_H_
#define IEC103TYPE_H_
//#include "ostype.h"
#include "lib60870_common.h"
typedef enum
{
CS103_TYPE_S = 0, /*CS103 从*/
CS103_TYPE_M, /*CS103 主*/
}CS103_Type;
enum ASDU_TYPE
{
ASDU_1 = 0x01,
ASDU_2 = 0x02,
ASDU_10 = 0x0A,
ASDU_40 = 0x28,
ASDU_41 = 0x29,
ASDU_42 = 0x2A,
ASDU_43 = 0x2B,
ASDU_44 = 0x2C,
ASDU_45 = 0x2D,
ASDU_46 = 0x2E,
ASDU_50 = 0x32,
};
enum CMD_SEND
{
CMD_RESET_CON = 1,
CMD_RESET_NUM,
CMD_RESET_TIMESTAMP, //对时
CMD_RESET_EVENT, //复归命令
CMD_SETTING_DOWNLOAD, //定值下载
CMD_SETTING_MODIFY, //定值修改
CMD_YK, //遥控功能
CMD_GET_ALL,
CMD_GET_DATA_LV1, //获取一级数据
CMD_GET_DATA_LV2, //获取二级数据
CMD_GET_SINGLE_SETTING_VALUE, //获取单个条目值
CMD_GENERAL_READ_YX_GROUP_VALUE,
CMD_GENERAL_READ_YC_GROUP_VALUE,
};
//标志位在报文中的位置
#define CODE_POSI 4 //控制域
#define TYP_POSI 6 //类型标识
#define VSQ_POSI 7 //可变结构限定词
#define COT_POSI 8 //传送原因
#define ADDR_POSI 9 //设备地址
#define FUN_POSI 10 //功能类型
#define INF_POSI 11 //信息序号
#define RII_POSI 12 //返回信息标识符
#define DPI_POSI 12 //双点信息
#define RET_POSI 13 //相对时间 表示装置启动到该元件动作的相对时间,毫秒
#define FAN_POSI 15 //故障序号
#define ASDU_1_TIMESTAMP 13 //ASDU1中四字节时间起始位置
#define ASDU_2_TIMESTAMP 17 //ASDU2中四字节时间起始位置
#define GROUP_POSI 14 //组号
#define TNTRY_POSI 15 //条目号
#define KOD_POSI 16 //描述的类别
#define GDD_POSI 17 //通用分类数据描述
#define GID_POSI 20 //通用分类标识数据
#define NGD_POSI 13 //通用分类数据集数目
#define START_10H 0x10 //固定长度报文启动字符
#define START_68H 0x68 //可变长度报文启动字符
#define END_16H 0x16 //结束字符
#define FCB_1 0x20 //帧计数位
#define FCV_1 0x10 //帧计数有效位
#define ACD_1 0x20 //有一级数据上送
#define PRA_1 0x40 //启动报文位 主到从
#define KOD_1 0x01 //描述类别 1为实际值
//功能码定义
#define FNA_S2C_RESET_CON 0 //复位通信功能码
#define FNA_S2C_RESET_NUM 7 //复位帧计数位功能码
#define FNA_S2C_POSTDATA_3 3 //传送数据(发送/确认帧)
#define FNA_S2C_POSTDATA_4 4 //传送数据(发送/无回答帧)
#define FNA_S2C_GETDATA_LV1 10 //召唤一级数据功能码
#define FNA_S2C_GETDATA_LV2 11 //召唤二级数据功能码
//ASDU号定义
#define ASDU6_TIMESTAMP 6 // 对时
#define ASDU7_GETALL 7 // 总召唤,遥信
#define ASDU20_RESET 20 // 复归
#define ASDU21_GETGROUP 21 // 总召唤,要测
#define ASDU10_SETTING 10 // 定值
#define ASDU20_RESET 20 // 复归
#define ASDU21_GETGROUP 21 // 总召唤,遥测
#define ASDU60 60 // 遥控
//COT传送原因定义
//控制方向
#define COT_S2C_TIMESTAMP 8 //时间同步
#define COT_S2C_GETALL_START 9 //总查询(总召唤)的启动
#define COT_S2C_REMOTE 0x0c //远方操作
#define COT_S2C_COMMON_ORDER 0x14 //一般命令
#define COT_S2C_GENERAL_WRITE 0x28 //通用分类写命令
#define COT_S2C_GENERAL_READ 0x2A //通用分类读命令
//FUN定义
#define FUN_GLB 0xFF //全局功能类型
#define FUN_GEN 0xFE //通用分类服务功能类型
//INF定义
#define INF_RESET_ORDER 0x13 //复归命令,所有装置相同
#define INF_READ_GROUP 0xF1 //读一个组的全部条目的值或者属性
#define INF_READ_EBTRY 0xF4 //读一个条目的值或者属性
#define INF_CONFIRM_WRITE 0xF9 //带确认的写条目
#define INF_EXEC_WRITE 0xFA //带执行的写条目
#define MAX_SIZE 1024
typedef struct {
uint8_t fcb; // 桢记数位
uint8_t fcv; // 桢记数有效位
} IEC103CodeS2C;
typedef union
{
uint32_t uValue;
float fValue;
uint8_t buf[4];
}UnionConvert4Byte;
typedef union
{
int16_t value;
uint16_t uValue;
uint8_t buf[2];
}UnionConvert2Byte;
typedef struct
{
//通用分类标识序号GIN
uint8_t groupNo; //组号
uint8_t entryNo; //条目号
//描述的类别KOD
uint8_t kod; //1为实际值
//通用分类数据描述GDD
uint8_t datatype; //数据类型
uint8_t datasize; //数据宽度
uint8_t number:7, //数目
cont:1; //后续状态位
}stDataUnit; //通用分类数据单元
typedef struct
{
uint16_t msec; //毫秒
uint8_t min:6, //分钟
res1:1, //备用
iv:1; //IV=0为有效 =1为无效
uint8_t hour:7, //小时
su:1; //su夏时制标志
uint8_t day:5, //日
dayofweek:3; //未采用
uint8_t month:4, //月
res2:4; //备用
uint8_t year:7, //年
res3:1; //备用
}stTime7Byte;
// 带品质描述词的被测量(MEA)
typedef struct {
union {
int16_t mval:13, // 带符号规一化定点数最高位符合位数据位占12位
res:1, // 备用位:未用(常为0)
er:1, // 差错位:0-有效1-无效
ov:1; // 溢出位:0-无溢出1-溢出
int16_t wVal;
}mea;
}MEA;
/**
* \brief GetLayerSt 获取链路层状态,检测是否满足发送条件
* \param
*
* \return
*/
typedef int32_t (*CS103_SendCb) (uint8_t *buf, uint16_t usLen, void *arg);
/**
* \brief SetValue 规约更新应用数据
* \param
*
* \return
*/
typedef int32_t (*CS103_SetValue) (uint8_t ucFun, uint8_t ucInf, float fVal, void *pParam);
/**
* \brief SetStatus 规约更新应用状态
* \param
*
* \return
*/
typedef int32_t (*CS103_SetStatus) (uint8_t ucFun, uint8_t ucInf, uint8_t ucSt, void *pParam);
/**
* \brief AddSOE 规约添加SOE信息
* \param
*
* \return
*/
typedef int32_t (*CS103_AddSOE) (uint8_t ucFun, uint8_t ucInf, uint8_t ucSt, stTime7Byte *pTime, void *pParam);
typedef struct {
void *pUsrData; /*用户自定义数据接口*/
uint16_t usFirstNum;
uint16_t usTaskID;
VFLAGS stTaskFlags;
IEC103CodeS2C stIEC103CodeS2C; /*103控制域主到从*/
uint8_t ucAddr; /*从站地址*/
uint8_t ucReSend_Num; /*重发次数*/
uint16_t usReSend_Gap; /*重发间隔*/
uint32_t ulSummon_Gap; /*总召间隔*/ //参数关联
uint32_t ulSyn_Gap; /*同步间隔*/ //参数关联
//uint32_t ulHeart_Gap; /*心跳间隔*/ //参数关联
uint32_t ulSend_Gap; /*数据发送间隔参数*/
//uint32_t ulHeart_Tcn; /* 心跳累计时间计数 */
uint32_t ulSummon_Tcn; /* 定时总招时间计数 */
uint32_t ulTimeSyn_Tcn; /* 定时对时时间计数 */
uint8_t usResend_Ncn; /* 重发次数计数 */
uint16_t usResend_Tcn; /* 重发间隔时间计数 */
bool bIsResetConEnd; /*复位通信*/
bool bIsResetNumEnd; //复位帧计数位
bool bIsGetAllEnd; //总召唤
uint8_t ucIDCount;
uint8_t ucYcGroupNum;
uint8_t ucYxGroupNum;
uint8_t ucGroupNo;
uint8_t ucEntryNo;
uint8_t ucYkFun;
uint8_t ucYkInf;
uint8_t ucYkSE;
uint8_t ucYkACT;
uint8_t ucYkDCS;
uint8_t ucYkQU;
CS10x_Send_Cb SendCb; /*数据发送接口*/
CS10x_GetTime GetTime; /*获取事件*/
/*对外提供数据*/
CS103_SetValue SetValue; /*规约更新应用数据*/
CS103_SetStatus SetStatus; /*规约更新应用状态*/
CS103_AddSOE AddSOE; /*添加SOE信息*/
struct VCommBuf stRecvBuf; /*接收数据缓冲区*/
struct VCommBuf stSendBuf; /*发送数据缓冲区*/
}CS103;
/**
* @brief 设置设备地址
*
* @param self
* @param pstParam
*/
void CS103_SetAddr(CS103 *self, uint8_t ucAddr);
/**
* @brief 设置总召定时间隔关联
*
* @param self
* @param pstParam
*/
void CS103_SetSummonGap(CS103 *self, uint32_t ulGap);
/**
* @brief 设置对时同步间隔关联
*
* @param self
* @param pstParam
*/
void CS103_SetSynTimeGap(CS103 *self, uint32_t ulGap);
/**
* @brief 101规约重发间隔时间参数输入
* @param self
* @param pstParam
*/
void CS103_ResendGap(CS103 *self, uint16_t usGap);
/**
* @brief 101规约重发次数参数输入
* @param self
* @param pstParam
*/
void CS103_ResendCnt(CS103 *self, uint8_t ucCnt);
/**
* @brief 获取时间接口
*
* @param self
* @param cb
*/
void CS103_GetTimeHandler(CS103 *self, CS10x_GetTime cb);
/**
* @brief 设置接收遥测接口
*
* @param self
* @param cb
*/
void CS103_SetValueHandler(CS103 *self, CS103_SetValue cb);
/**
* @brief 设置接收遥信接口
*
* @param self
* @param cb
*/
void CS103_SetStatusHandler(CS103 *self, CS103_SetStatus cb);
/**
* @brief 设置接收SOE处理函数
*
* @param self
* @param cb
*/
void CS103_AddSOEHandler(CS103 *self, CS103_AddSOE cb);
CS103 *CS103_Init(CS103_SendCb cb, void *arg, CS103_Type type);
void CS103_Destory(CS103 *self);
bool CS103_DoRecv(CS103 *self, uint8_t *pBuf, uint16_t usLen);
void CS103_TimerHandle(CS103 *self, uint16_t usGap);
#endif /* IEC103TYPE_H_ */