354 lines
9.8 KiB
C
354 lines
9.8 KiB
C
/*
|
||
* 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_ */
|