/***************************************************************** *(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