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

139 lines
3.6 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_SRV_123_INCLUDED
#define IEC103_LINK_SRV_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_CMD_BUFFER_MAX_COUNT 96
//重要的一级数据缓冲区(录波16000点160帧)
#define IEC103_SEND_URGENT_BUFFER_MAX_COUNT 224
//cbt modified 2021.5.17 二级数据一秒最多发3帧改为最多发5帧这里将缓冲区加大
//次要的二级数据缓冲区(里面带时标,必须及时发送)
#define IEC103_SEND_GENERAL_BUFFER_MAX_COUNT 12//8
//最大定值数量,不修改
#define IEC103_DINGZHI_MAX_NUM 256
/*************2011.10.26增加一些常用的宏操作定义****************************/
typedef enum
{
IEC103_I_ASDU_TYPE_CMD=0,
IEC103_I_ASDU_TYPE_URGENT,
IEC103_I_ASDU_TYPE_GENERAL
} IEC103_I_ASDU_TYPE;
/*************2011.10.26增加一些表示链路连接状态的定义****************************/
typedef enum{
IEC103_LINK_STATUS_SRV_IDLE=0, //空闲,表示连接还没有建立
IEC103_LINK_STATUS_SRV_OK, //等待客户端发送复位CU帧
//下面1个仅服务器端用到
IEC103_LINK_STATUS_SRV_START_RECV //收到了一帧,连接正常
} IEC103_LINK_STATUS_SRV;
/********收到的每个客户端连接,对应下面一个结构体*******/
typedef struct
{
FLAG_LINK flagLink; //用于通知外部
IEC103_LINK_PROPER link_proper;
struct
{
//启动发送控制,需要建立发送缓冲区(根据命令等级,需要划分几个命令缓冲区)
ST_INT send_cmd_readIP;
ST_INT send_cmd_writeIP;
ST_UCHAR send_cmd_Buffer[IEC103_SEND_CMD_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
ST_INT send_urgent_readIP;
ST_INT send_urgent_writeIP;
ST_UCHAR send_urgent_Buffer[IEC103_SEND_URGENT_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
ST_INT send_general_readIP;
ST_INT send_general_writeIP;
ST_UCHAR send_general_Buffer[IEC103_SEND_GENERAL_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
} link_send_buffer;
struct
{
IEC103_LINK_STATUS_SRV linkStatus;
ST_UCHAR ctrl_FCB_recv;
ST_DOUBLE record_time_tm; //记录:收到侦记录,超时表示连接出错
ST_DOUBLE space_tm; //10000,
//仅仅服务器端需要的参数,发送二级数据间隔时间
//ST_DOUBLE record_time_sendL2;
//ST_DOUBLE space_sendL2; //1*300,
} 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_srv; //保存本指针, 收到I的时候确认交给哪个服务器
ST_INT monitorChannel; //调试数据的通道号
} link_attrib;
} IEC103_LINK_SRV;
//收到ASDU时候的处理函数
/***发送数据的时候,调用这个函数,将数据放到指定缓冲区中***/
ST_RET iec103_link_srv_save_asdu( IEC103_LINK_SRV *iec103_link_srv, ST_UCHAR *asdu, ST_INT asduLen, IEC103_I_ASDU_TYPE type );
/***初始化连接属性值***/
ST_RET iec103_link_srv_property_init( IEC103_LINK_SRV * iec103_link );
/*** 需要设置变量,都在这个函数里面 ***/
ST_RET iec103_link_srv_property_set( IEC103_LINK_SRV * iec103_link, IEC103_LINK_TYPE link_type,
ST_VOID *link_attrib, ST_UCHAR linkAddr, ST_VOID *iec103_service_srv, ST_INT monitorChl );
/*** 释放连接 ***/
ST_RET iec103_link_srv_property_release( IEC103_LINK_SRV * iec103_link );
/** 循环检测底层连接,更新状态, 发送缓冲数据 **/
ST_RET iec103_link_srv_check_status( IEC103_LINK_SRV *iec103_link );
/************************************************************************/
#ifdef __cplusplus
}
#endif
#endif