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

205 lines
5.4 KiB
C
Raw 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.

/*****************************************************************
*(C) Copyright H.S.J.
*
* MODULE NAME : iec103_service_srv.h
* PRODUCT(S) : IEC60870
*
* MODULE DESCRIPTION :
* 实现IEC103服务器端链路层规约
*
* GLOBAL FUNCTIONS DEFINED IN THIS MODULE :
*
*
* MODIFICATION LOG :
* Date Who Rev Comments
* -------- --- ------ ----------------------------------
* 2011-12-25 hsj 1.0 创建初版(适用_WIN32linuxVXWORKS 三种系统)
*
*****************************************************************/
#ifndef IEC103_SERVICE_SRV_123_INCLUDED
#define IEC103_SERVICE_SRV_123_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************/
//如果发布,定义这个宏
//#define IEC60870_RELEASE
#ifdef IEC60870_RELEASE
typedef enum
{
IEC103_I_ASDU_TYPE_CMD=0,
IEC103_I_ASDU_TYPE_URGENT,
IEC103_I_ASDU_TYPE_GENERAL
} IEC103_I_ASDU_TYPE;
#else
#include "glbtypes.h"
#include "iec103_link_srv.h"
#endif
//注意: 本头文件,必须与发布的头文件同步更新
typedef int (*IEC103_SRV_RECV_ASDU)(unsigned char *recvAsdu, int linkIndex);
typedef int (*IEC103_SRV_RECV_CONN)(int linkIndex);
typedef int (*IEC103_SRV_RECV_DISCON)(int linkIndex);
//如果要启动网络103配置下面参数
typedef struct
{
struct
{
IEC103_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
IEC103_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
IEC103_SRV_RECV_DISCON fun_recv_discon; //与客户端连接断开
char listen_ip[32];
int listen_port;
int max_recv_num; //每个listen端口最大接收连接数量
unsigned char *linkAddr; //链路地址
int *monitorChl; //监视数据的通道号
} link_tcp_para;
//下面几个参数,用户不要赋值或者更改. 用户可以初始为NULL
#ifdef IEC60870_RELEASE
struct
{
void *socket_listen;
void *socket_link;
void *link103_srv;
} srv_tcp_property;
#else
struct
{
SOCKET_LISN_ATTRIB *socket_listen;
SOCKET_LINK_ATTRIB *socket_link;
IEC103_LINK_SRV *link103_srv;
} srv_tcp_property;
#endif
} IEC103_SERVICE_SRV_TCP;
//如果要启动串口103配置下面参数
typedef struct
{
struct
{
IEC103_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
IEC103_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
IEC103_SRV_RECV_DISCON fun_recv_discon; //与客户端连接断开
int com_index; //串口序号
int com_baud; //波特率
int com_parity; //校验方式 N,O,E
unsigned char linkAddr; //链路地址
int monitorChl; //监视数据的通道号
} link_serial_para;
//下面几个参数,用户不要赋值或者更改. 用户可以初始为NULL
#ifdef IEC60870_RELEASE
struct
{
void *serial_link;
void *link103_srv;
} srv_serial_property;
#else
struct
{
SERIAL_ATTRIB *serial_link;
IEC103_LINK_SRV *link103_srv;
} srv_serial_property;
#endif
} IEC103_SERVICE_SRV_SERIAL;
//如果要启动CAN 103配置下面参数
typedef struct
{
struct
{
IEC103_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
IEC103_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
IEC103_SRV_RECV_DISCON fun_recv_discon; //与客户端连接断开
int can_index; //串口序号
int can_baud; //波特率 k
int localCanID; //CAN的编号ID
int max_recv_num; //一个CAN服务器端,对应多个客户端,根据CANID区分
unsigned char *linkAddr; //链路地址, 多个. 用户根据个数分配内存
int *canID; // CAN还应该有CANID, 多个
int *monitorChl; //监视数据的通道号
} link_can_para;
//下面几个参数,用户不要赋值或者更改. 用户可以初始为NULL
#ifdef IEC60870_RELEASE
struct
{
void *can_listen; //只有一个
void *can_link; //多个
void *link103_srv; //多个
} srv_can_property;
#else
struct
{
CAN_ATTRIB *can_listen; //只有一个
CAN_LINK_ATTRIB *can_link; //多个
IEC103_LINK_SRV *link103_srv; //多个
} srv_can_property;
#endif
} IEC103_SERVICE_SRV_CAN;
#ifndef IEC60870_RELEASE
int iec103_service_srv_recv_asdu( IEC103_LINK_SRV *iec103_link_srv, unsigned char *recvAsdu );
#endif
int iec103_service_srv_init_tcp( IEC103_SERVICE_SRV_TCP *iec103_srv_tcp );
int iec103_service_srv_release_tcp( IEC103_SERVICE_SRV_TCP *iec103_srv_tcp );
int iec103_service_srv_init_serial( IEC103_SERVICE_SRV_SERIAL *iec103_srv_serial );
int iec103_service_srv_release_serial( IEC103_SERVICE_SRV_SERIAL *iec103_srv_serial );
int iec103_service_srv_init_can( IEC103_SERVICE_SRV_CAN *iec103_srv_can );
int iec103_service_srv_release_can( IEC103_SERVICE_SRV_CAN *iec103_srv_can );
int iec103_service_srv_check_status_tcp( IEC103_SERVICE_SRV_TCP *iec103_srv_tcp );
int iec103_service_srv_check_status_serial( IEC103_SERVICE_SRV_SERIAL *iec103_srv_serial );
int iec103_service_srv_check_status_can( IEC103_SERVICE_SRV_CAN *iec103_srv_can );
/*** 向服务器下的指定连接发送I帧发送的时候会自动填充链路层信息(ti以前)和校验码、结束符 ***/
/*** 如果linkIndex=-1先所有连接发送 ***/
/*** asduLen是包含校验符和结束符在内的报文总长度 ***/
int iec103_service_srv_asdu_send_tcp(IEC103_SERVICE_SRV_TCP *iec103_srv_tcp, int linkIndex,
unsigned char *asdu, int asduLen, IEC103_I_ASDU_TYPE type );
int iec103_service_srv_asdu_send_serial(IEC103_SERVICE_SRV_SERIAL *iec103_srv_serial, int linkIndex,
unsigned char *asdu, int asduLen, IEC103_I_ASDU_TYPE type );
int iec103_service_srv_asdu_send_can(IEC103_SERVICE_SRV_CAN *iec103_srv_can, int linkIndex,
unsigned char *asdu, int asduLen, IEC103_I_ASDU_TYPE type );
/************************************************************************/
#ifdef __cplusplus
}
#endif
#endif