157 lines
4.1 KiB
C
157 lines
4.1 KiB
C
|
||
|
||
|
||
#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
|
||
|