139 lines
3.6 KiB
C
139 lines
3.6 KiB
C
|
||
|
||
|
||
#ifndef IEC103_LINK_SRV_123_INCLUDED
|
||
#define IEC103_LINK_SRV_123_INCLUDED
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
/************************************************************************/
|
||
|
||
#include "iec103_apdu.h"
|
||
#include "general_function.h"
|
||
#include "general_socket.h"
|
||
#include "general_serial.h"
|
||
#include "general_can.h"
|
||
|
||
|
||
//发送命令(或命令的返回)缓冲区的长度
|
||
#define IEC103_SEND_CMD_BUFFER_MAX_COUNT 96
|
||
|
||
//重要的一级数据缓冲区(录波16000点,160帧)
|
||
#define IEC103_SEND_URGENT_BUFFER_MAX_COUNT 224
|
||
|
||
//cbt modified 2021.5.17 二级数据一秒最多发3帧改为最多发5帧,这里将缓冲区加大
|
||
//次要的二级数据缓冲区(里面带时标,必须及时发送)
|
||
#define IEC103_SEND_GENERAL_BUFFER_MAX_COUNT 12//8
|
||
|
||
|
||
//最大定值数量,不修改
|
||
#define IEC103_DINGZHI_MAX_NUM 256
|
||
|
||
|
||
/*************2011.10.26增加一些常用的宏操作定义****************************/
|
||
|
||
typedef enum
|
||
{
|
||
IEC103_I_ASDU_TYPE_CMD=0,
|
||
IEC103_I_ASDU_TYPE_URGENT,
|
||
IEC103_I_ASDU_TYPE_GENERAL
|
||
} IEC103_I_ASDU_TYPE;
|
||
|
||
|
||
/*************2011.10.26增加一些表示链路连接状态的定义****************************/
|
||
typedef enum{
|
||
IEC103_LINK_STATUS_SRV_IDLE=0, //空闲,表示连接还没有建立
|
||
IEC103_LINK_STATUS_SRV_OK, //等待客户端发送复位CU帧
|
||
//下面1个仅服务器端用到
|
||
IEC103_LINK_STATUS_SRV_START_RECV //收到了一帧,连接正常
|
||
} IEC103_LINK_STATUS_SRV;
|
||
|
||
|
||
|
||
/********收到的每个客户端连接,对应下面一个结构体*******/
|
||
typedef struct
|
||
{
|
||
FLAG_LINK flagLink; //用于通知外部
|
||
|
||
IEC103_LINK_PROPER link_proper;
|
||
|
||
struct
|
||
{
|
||
//启动发送控制,需要建立发送缓冲区(根据命令等级,需要划分几个命令缓冲区)
|
||
ST_INT send_cmd_readIP;
|
||
ST_INT send_cmd_writeIP;
|
||
ST_UCHAR send_cmd_Buffer[IEC103_SEND_CMD_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
|
||
|
||
ST_INT send_urgent_readIP;
|
||
ST_INT send_urgent_writeIP;
|
||
ST_UCHAR send_urgent_Buffer[IEC103_SEND_URGENT_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
|
||
|
||
ST_INT send_general_readIP;
|
||
ST_INT send_general_writeIP;
|
||
ST_UCHAR send_general_Buffer[IEC103_SEND_GENERAL_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
|
||
|
||
} link_send_buffer;
|
||
|
||
struct
|
||
{
|
||
IEC103_LINK_STATUS_SRV linkStatus;
|
||
|
||
ST_UCHAR ctrl_FCB_recv;
|
||
|
||
ST_DOUBLE record_time_tm; //记录:收到侦记录,超时表示连接出错
|
||
ST_DOUBLE space_tm; //10000,
|
||
|
||
//仅仅服务器端需要的参数,发送二级数据间隔时间
|
||
//ST_DOUBLE record_time_sendL2;
|
||
//ST_DOUBLE space_sendL2; //1*300,
|
||
} link_records;
|
||
|
||
|
||
struct
|
||
{
|
||
IEC103_LINK_TYPE link_type;
|
||
union
|
||
{
|
||
SOCKET_LINK_ATTRIB *sock_attrib; //这里必须定义为指针,初始化的时候,为它赋一个位置
|
||
SERIAL_ATTRIB *serial_attrib; //串口连接参数
|
||
CAN_LINK_ATTRIB *can_link; //CAN连接参数
|
||
} u;
|
||
|
||
//下面的指针类型可能是TCP 串口 或 CAN
|
||
ST_VOID *iec103_service_srv; //保存本指针, 收到I的时候确认交给哪个服务器
|
||
ST_INT monitorChannel; //调试数据的通道号
|
||
} link_attrib;
|
||
|
||
|
||
} IEC103_LINK_SRV;
|
||
|
||
//收到ASDU时候的处理函数
|
||
|
||
/***发送数据的时候,调用这个函数,将数据放到指定缓冲区中***/
|
||
ST_RET iec103_link_srv_save_asdu( IEC103_LINK_SRV *iec103_link_srv, ST_UCHAR *asdu, ST_INT asduLen, IEC103_I_ASDU_TYPE type );
|
||
|
||
/***初始化连接属性值***/
|
||
ST_RET iec103_link_srv_property_init( IEC103_LINK_SRV * iec103_link );
|
||
|
||
/*** 需要设置变量,都在这个函数里面 ***/
|
||
ST_RET iec103_link_srv_property_set( IEC103_LINK_SRV * iec103_link, IEC103_LINK_TYPE link_type,
|
||
ST_VOID *link_attrib, ST_UCHAR linkAddr, ST_VOID *iec103_service_srv, ST_INT monitorChl );
|
||
|
||
/*** 释放连接 ***/
|
||
ST_RET iec103_link_srv_property_release( IEC103_LINK_SRV * iec103_link );
|
||
|
||
|
||
/** 循环检测底层连接,更新状态, 发送缓冲数据 **/
|
||
ST_RET iec103_link_srv_check_status( IEC103_LINK_SRV *iec103_link );
|
||
|
||
/************************************************************************/
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
|
||
#endif
|
||
|