commCPU_SUPV/code/link60870/inc/iec104_link_cln.h
2025-04-30 16:24:29 +08:00

157 lines
4.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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