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

155 lines
4.2 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 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