#ifndef IEC104_LINK_CLN_123_INCLUDED #define IEC104_LINK_CLN_123_INCLUDED #ifdef __cplusplus extern "C" { #endif /************************************************************************/ #include "iec104_apdu.h" #include "general_function.h" #include "general_socket.h" #include "general_serial.h" #include "general_can.h" //高优先级命令,遥控等 #define IEC104_SEND_HIGHCMD_BUFFER_MAX_COUNT 32 //一般命令,召唤命令等 #define IEC104_SEND_LOWCMD_BUFFER_MAX_COUNT 128 /*************2011.10.26增加一些常用的宏操作定义****************************/ typedef enum { IEC104_I_CMD_TYPE_HIGH=0, IEC104_I_CMD_TYPE_LOW } IEC104_I_CMD_TYPE; /*************2011.10.26增加一些表示链路连接状态的定义****************************/ typedef enum{ IEC104_LINK_STATUS_CLN_IDLE=0, //空闲,表示连接还没有建立 IEC104_LINK_STATUS_CLN_OK, //连接正常 //下面2个仅客户端用到 IEC104_LINK_STATUS_CLN_START_SEND, //发送O7启动帧 IEC104_LINK_STATUS_CLN_START_CONFIRM //收到启动确认 } IEC104_LINK_STATUS_CLN; /********收到的每个客户端连接,对应下面一个结构体*******/ typedef struct { FLAG_LINK flagLink; //用于通知外部 IEC104_LINK_PROPER link_proper; struct { //启动发送控制,需要建立发送缓冲区(根据命令等级,需要划分几个命令缓冲区) ST_INT send_highcmd_readIP; ST_INT send_highcmd_writeIP; ST_UCHAR send_highcmd_Buffer[IEC104_SEND_HIGHCMD_BUFFER_MAX_COUNT][IEC104_APDU_MAX_LEN]; ST_INT send_lowcmd_readIP; ST_INT send_lowcmd_writeIP; ST_UCHAR send_lowcmd_Buffer[IEC104_SEND_LOWCMD_BUFFER_MAX_COUNT][IEC104_APDU_MAX_LEN]; } link_send_buffer; struct { IEC104_LINK_STATUS_CLN linkStatus; ST_UCHAR commAddr; //公共地址,只有发送GI和校时的时候才用到 ST_UCHAR devAddr; ST_UINT16 IcountRecv; ST_UINT16 IcountSend; ST_UINT16 IcountLocalUnConfirm; //收到但未确认的I数量 ST_UINT16 IcountRemoteConfirm; //本变量使用,启动了发送传输控制 ST_UINT16 IcountmaxSend; //未确认的情况下,最大发送的I帧数量 12*2 ST_UINT16 IcountmaxToConfirm; //收到I帧,超时或本次数已到,发送确认帧 8*2 ST_DOUBLE record_time_t0; //104中从站不判断T0(建立连接超时) ST_DOUBLE space_t0; //30 ST_DOUBLE record_time_t1_test; //发送测试帧启动, 停止:收到测试确认 ST_DOUBLE record_time_t1_I; //记录:发I启动,停止:收到I确认 ST_DOUBLE space_t1; //15 ST_DOUBLE record_time_t2; //记录:收到I启动,停止:发送I,发送确认 ST_DOUBLE space_t2; //10 ST_DOUBLE record_time_t3; //记录:发送,收到帧, 到时间后发送测试帧 ST_DOUBLE space_t3; //20 ST_DOUBLE record_time_gi; //总召唤,链路正常后设置时间 ST_DOUBLE space_time_gi; //120*1000, ST_DOUBLE record_time_fixtime; //校时 ST_DOUBLE space_time_fixtime; //130*1000, } link_records; struct { IEC104_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 *iec104_service_cln; //保存本指针, 收到I的时候确认交给哪个服务器 ST_INT monitorChannel; //通道号 } link_attrib; } IEC104_LINK_CLN; //收到ASDU时候的处理函数 /***发送数据的时候,调用这个函数,将数据放到指定缓冲区中***/ ST_RET iec104_link_cln_save_asdu( IEC104_LINK_CLN *iec104_link_cln, ST_UCHAR *asdu, ST_INT asduLen, IEC104_I_CMD_TYPE type ); /***初始化连接属性值***/ ST_RET iec104_link_cln_property_init( IEC104_LINK_CLN * iec104_link ); /*** 需要设置变量,都在这个函数里面 ***/ ST_RET iec104_link_cln_property_set( IEC104_LINK_CLN * iec104_link, IEC104_LINK_TYPE link_type, ST_VOID *link_attrib, ST_UCHAR commAddr, ST_UCHAR devAddr, ST_VOID *iec104_service_cln, ST_INT monitorChl ); /*** 释放连接 ***/ ST_RET iec104_link_cln_property_release( IEC104_LINK_CLN * iec104_link ); /** 循环检测底层连接,更新状态, 发送缓冲数据。返回成功表示正在处理 **/ ST_RET iec104_link_cln_check_status( IEC104_LINK_CLN *iec104_link ); /** 主动关闭连接 **/ ST_RET iec104_link_cln_closeLink( IEC104_LINK_CLN *iec104_link ); /************************************************************************/ #ifdef __cplusplus } #endif #endif