155 lines
4.2 KiB
C
155 lines
4.2 KiB
C
|
||
|
||
|
||
#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
|
||
|