#ifndef IEC103_LINK_CLN_123_INCLUDED #define IEC103_LINK_CLN_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_HIGHCMD_BUFFER_MAX_COUNT 32 //一般命令,召唤命令等 #define IEC103_SEND_LOWCMD_BUFFER_MAX_COUNT 128 //动态调整103的发送间隔T1,有数据快,无数据时放慢 #define IEC103_CLN_SEND_SPACE_T1_NORAML 300 /*************2011.10.26增加一些常用的宏操作定义****************************/ typedef enum { IEC103_I_CMD_TYPE_HIGH=0, IEC103_I_CMD_TYPE_LOW } IEC103_I_CMD_TYPE; /*************2011.10.26增加一些表示链路连接状态的定义****************************/ typedef enum{ IEC103_LINK_STATUS_CLN_IDLE=0, //空闲,表示连接还没有建立 IEC103_LINK_STATUS_CLN_OK, //连接正常,客户端发送复位CU侦。设置帧计数无效 //下面3个仅客户端用到 IEC103_LINK_STATUS_CLN_START_SEND, //收到CU应答帧,发送复位FCB, IEC103_LINK_STATUS_CLN_START_CONFIRM, //复位FCB成功,设置帧计数有效 IEC103_LINK_STATUS_CLN_ERROR //错误,表示要连接的服务器端不存在,经过一个长时间超时再重试 } IEC103_LINK_STATUS_CLN; /********收到的每个客户端连接,对应下面一个结构体*******/ typedef struct { FLAG_LINK flagLink; //用于通知外部 IEC103_LINK_PROPER link_proper; struct { //启动发送控制,需要建立发送缓冲区(根据命令等级,需要划分几个命令缓冲区) ST_INT send_highcmd_readIP; ST_INT send_highcmd_writeIP; ST_UCHAR send_highcmd_Buffer[IEC103_SEND_HIGHCMD_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN]; ST_INT send_lowcmd_readIP; ST_INT send_lowcmd_writeIP; ST_UCHAR send_lowcmd_Buffer[IEC103_SEND_LOWCMD_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN]; } link_send_buffer; struct { IEC103_LINK_STATUS_CLN linkStatus; IEC103_CTRL ctrl; //链路控制部分 ST_UCHAR ctrl_ACD_recv; //服务器要求数据访问位 ST_INT reTransNum; //发送加1,正确收到=0 ST_INT reTransMaxNum; //3 ST_DOUBLE record_time_t0; //等待服务器端响应命令的时间 ST_DOUBLE space_time_t0; //1*1000, ST_DOUBLE record_time_t1; //正确响应命令后,下次发送间隔 ST_DOUBLE space_time_t1; //300, ST_DOUBLE record_time_error; //记录:出错启动,超时后转为IDLE状态 ST_DOUBLE space_time_error; //120*1000, ST_DOUBLE record_time_gi; //总召唤,链路正常后设置时间 ST_DOUBLE space_time_gi; //120*1000, ST_DOUBLE record_time_fixtime; //校时 ST_DOUBLE space_time_fixtime; //130*1000, ST_DOUBLE space_time_t1_noraml; //正常召唤间隔 ST_DOUBLE space_time_t1_l1; //服务器有1级数据时的召唤间隔 ST_DOUBLE space_time_t1_cmd; //有命令需要发送时的间隔 ST_UINT32 sendL2count; //已经发送的2级数据个数 } 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_cln; //保存本指针, 收到I的时候确认交给哪个服务器 //总线状态 LINK_BUS_STATUS bus_status; ST_INT monitorChannel; //通道号 } link_attrib; } IEC103_LINK_CLN; //收到ASDU时候的处理函数 /***发送数据的时候,调用这个函数,将数据放到指定缓冲区中***/ ST_RET iec103_link_cln_save_asdu( IEC103_LINK_CLN *iec103_link_cln, ST_UCHAR *asdu, ST_INT asduLen, IEC103_I_CMD_TYPE type ); /***初始化连接属性值***/ ST_RET iec103_link_cln_property_init( IEC103_LINK_CLN * iec103_link ); /*** 需要设置变量,都在这个函数里面 ***/ ST_RET iec103_link_cln_property_set( IEC103_LINK_CLN * iec103_link, IEC103_LINK_TYPE link_type, ST_VOID *link_attrib, ST_UCHAR linkAddr, ST_VOID *iec103_service_cln, ST_INT monitorChl, ST_UCHAR commAddr, ST_INT t1Noraml, ST_INT t1L1, ST_INT t1Cmd ); /*** 释放连接 ***/ ST_RET iec103_link_cln_property_release( IEC103_LINK_CLN * iec103_link ); /** 循环检测底层连接,更新状态, 发送缓冲数据。返回成功表示正在处理 **/ ST_RET iec103_link_cln_check_status( IEC103_LINK_CLN *iec103_link ); /************************************************************************/ #ifdef __cplusplus } #endif #endif