#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