202 lines
5.5 KiB
C
202 lines
5.5 KiB
C
/*****************************************************************
|
||
*(C) Copyright H.S.J.
|
||
*
|
||
* MODULE NAME : iec104_service_srv.h
|
||
* PRODUCT(S) : IEC60870
|
||
*
|
||
* MODULE DESCRIPTION :
|
||
* 实现IEC104服务器端链路层规约
|
||
*
|
||
* GLOBAL FUNCTIONS DEFINED IN THIS MODULE :
|
||
*
|
||
*
|
||
* MODIFICATION LOG :
|
||
* Date Who Rev Comments
|
||
* -------- --- ------ ----------------------------------
|
||
* 2011-12-25 hsj 1.0 创建初版(适用:_WIN32,linux,VXWORKS 三种系统)
|
||
*
|
||
*****************************************************************/
|
||
|
||
|
||
#ifndef IEC104_SERVICE_SRV_123_INCLUDED
|
||
#define IEC104_SERVICE_SRV_123_INCLUDED
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
/************************************************************************/
|
||
|
||
//如果发布,定义这个宏
|
||
//#define IEC60870_RELEASE
|
||
|
||
#ifdef IEC60870_RELEASE
|
||
typedef enum
|
||
{
|
||
IEC104_I_ASDU_TYPE_CMD=0,
|
||
IEC104_I_ASDU_TYPE_URGENT,
|
||
IEC104_I_ASDU_TYPE_GENERAL
|
||
} IEC104_I_ASDU_TYPE;
|
||
|
||
#else
|
||
#include "glbtypes.h"
|
||
#include "iec104_link_srv.h"
|
||
#endif
|
||
|
||
//注意: 本头文件,必须与发布的头文件同步更新
|
||
|
||
typedef int (*IEC104_SRV_RECV_ASDU)(unsigned char *recvAsdu, int linkIndex);
|
||
//串口和CAN, 将ipaddress赋值为NULL, CAN根据预先分配的CANID,决定是那个客户端
|
||
typedef int (*IEC104_SRV_RECV_CONN)(int linkIndex, const char * recvIpAddress);
|
||
typedef int (*IEC104_SRV_RECV_DISCON)(int linkIndex);
|
||
|
||
//如果要启动网络104,配置下面参数
|
||
typedef struct
|
||
{
|
||
struct
|
||
{
|
||
IEC104_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
|
||
IEC104_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
|
||
IEC104_SRV_RECV_DISCON fun_recv_discon; //与客户端连接断开
|
||
|
||
char listen_ip[32];
|
||
int listen_port;
|
||
int max_recv_num; //每个listen端口,最大接收连接数量
|
||
int *monitorChl; //监视数据的通道号
|
||
} link_tcp_para;
|
||
|
||
|
||
//下面几个参数,用户不要赋值或者更改. 用户可以初始为NULL
|
||
#ifdef IEC60870_RELEASE
|
||
struct
|
||
{
|
||
void *socket_listen;
|
||
void *socket_link;
|
||
void *link104_srv;
|
||
} srv_tcp_property;
|
||
#else
|
||
struct
|
||
{
|
||
SOCKET_LISN_ATTRIB *socket_listen;
|
||
SOCKET_LINK_ATTRIB *socket_link;
|
||
IEC104_LINK_SRV *link104_srv;
|
||
} srv_tcp_property;
|
||
#endif
|
||
|
||
|
||
} IEC104_SERVICE_SRV_TCP;
|
||
|
||
|
||
//如果要启动串口104,配置下面参数
|
||
typedef struct
|
||
{
|
||
struct
|
||
{
|
||
IEC104_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
|
||
IEC104_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
|
||
IEC104_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 *link104_srv;
|
||
} srv_serial_property;
|
||
#else
|
||
struct
|
||
{
|
||
SERIAL_ATTRIB *serial_link;
|
||
IEC104_LINK_SRV *link104_srv;
|
||
} srv_serial_property;
|
||
#endif
|
||
|
||
} IEC104_SERVICE_SRV_SERIAL;
|
||
|
||
//如果要启动CAN 104,配置下面参数
|
||
typedef struct
|
||
{
|
||
struct
|
||
{
|
||
IEC104_SRV_RECV_ASDU fun_recv_asdu; //函数指针,收到I帧的时候调用本函数
|
||
IEC104_SRV_RECV_CONN fun_recv_conn; //收到客户端连接
|
||
IEC104_SRV_RECV_DISCON fun_recv_discon; //与客户端连接断开
|
||
|
||
int can_index; //串口序号
|
||
int can_baud; //波特率 k
|
||
|
||
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 *link104_srv; //多个
|
||
} srv_can_property;
|
||
#else
|
||
struct
|
||
{
|
||
CAN_ATTRIB *can_listen; //只有一个
|
||
CAN_LINK_ATTRIB *can_link; //多个
|
||
IEC104_LINK_SRV *link104_srv; //多个
|
||
} srv_can_property;
|
||
#endif
|
||
|
||
} IEC104_SERVICE_SRV_CAN;
|
||
|
||
|
||
|
||
#ifndef IEC60870_RELEASE
|
||
int iec104_service_srv_recv_asdu( IEC104_LINK_SRV *iec104_link_srv, unsigned char *recvAsdu );
|
||
#endif
|
||
|
||
int iec104_service_srv_init_tcp( IEC104_SERVICE_SRV_TCP *iec104_srv_tcp );
|
||
int iec104_service_srv_release_tcp( IEC104_SERVICE_SRV_TCP *iec104_srv_tcp );
|
||
|
||
// int iec104_service_srv_init_serial( IEC104_SERVICE_SRV_SERIAL *iec104_srv_serial );
|
||
// int iec104_service_srv_release_serial( IEC104_SERVICE_SRV_SERIAL *iec104_srv_serial );
|
||
//
|
||
// int iec104_service_srv_init_can( IEC104_SERVICE_SRV_CAN *iec104_srv_can );
|
||
// int iec104_service_srv_release_can( IEC104_SERVICE_SRV_CAN *iec104_srv_can );
|
||
|
||
|
||
int iec104_service_srv_check_status_tcp( IEC104_SERVICE_SRV_TCP *iec104_srv_tcp );
|
||
// int iec104_service_srv_check_status_serial( IEC104_SERVICE_SRV_SERIAL *iec104_srv_serial );
|
||
// int iec104_service_srv_check_status_can( IEC104_SERVICE_SRV_CAN *iec104_srv_can );
|
||
|
||
|
||
/*** 向服务器下的指定连接发送I帧,发送的时候会自动填充链路层信息(ti以前)和校验码、结束符 ***/
|
||
/*** 如果linkIndex=-1,先所有连接发送 ***/
|
||
/*** asduLen是包含校验符和结束符在内的报文总长度 ***/
|
||
int iec104_service_srv_asdu_send_tcp(IEC104_SERVICE_SRV_TCP *iec104_srv_tcp, int linkIndex,
|
||
unsigned char *asdu, int asduLen, IEC104_I_ASDU_TYPE type );
|
||
// int iec104_service_srv_asdu_send_serial(IEC104_SERVICE_SRV_SERIAL *iec104_srv_serial, int linkIndex,
|
||
// unsigned char *asdu, int asduLen, IEC104_I_ASDU_TYPE type );
|
||
// int iec104_service_srv_asdu_send_can(IEC104_SERVICE_SRV_CAN *iec104_srv_can, int linkIndex,
|
||
// unsigned char *asdu, int asduLen, IEC104_I_ASDU_TYPE type );
|
||
|
||
/************************************************************************/
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
|
||
#endif
|
||
|