2025-04-30 16:24:29 +08:00

91 lines
2.4 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_APDU_123_INCLUDED
#define IEC103_APDU_123_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************/
#include <stdio.h>
#include "glbtypes.h"
#include "iec60870_define.h"
//每个数据侦的最大长度默认不修改加8防止0XFF+6溢出
#define IEC103_APDU_MAX_LEN 264
//结束服务层数据侦缓冲区(对103一个足够不可能一帧数据有多条命令的情况4仅仅是预留)
#define IEC103_RECV_ASDU_BUFFER_MAX_COUNT 4
//传入的指针必须是无符号的 是asdu而非apdu
#define GetIEC103APDULen(databuf) ( *(databuf+1) + 6)
//设置报文长度
#define SetIEC103APDULen(databuf,bufLen) ( databuf[1]=(ST_UCHAR)(bufLen-6), databuf[2]=databuf[1] )
typedef struct
{
ST_UCHAR ctrl_PRM; //初始化的时候设置
ST_UCHAR ctrl_FCB_ACD; //客户端是下发,服务器是接收
ST_UCHAR ctrl_FCV_DFC; //客户端初始化为1服务器不要
ST_UCHAR ctrl_FUN; //
} IEC103_CTRL;
typedef enum {
IEC103_LINK_TYPE_SOCK=0,
IEC103_LINK_TYPE_SERIAL,
IEC103_LINK_TYPE_CAN
} IEC103_LINK_TYPE;
/****iec103服务器端链路层控制信息****/
typedef struct
{
ST_UCHAR linkAddr; //链路层地址
ST_UCHAR commAddr; //ASDU中的地址一般与链路地址相同
ST_INT lastFrameLen; //接收长度
ST_DOUBLE lastFrameTime; //上次收到数据的时刻,如果时间长清空
ST_UCHAR lastFrame[IEC103_APDU_MAX_LEN]; //上一次帧未接收完整,留待下次一起处理
ST_INT apdu_send_len;
ST_UCHAR apdu_send[IEC103_APDU_MAX_LEN];
//保存收到的ASDU等待服务层处理这里仅仅保存指针——不可以由于涉及lastFrame的问题
//存在 上次收到一半数据,这次补全,但又发了一半数据
ST_INT asdu_recv_num;
ST_UCHAR asdu_recv_Buffer[IEC103_RECV_ASDU_BUFFER_MAX_COUNT][IEC103_APDU_MAX_LEN];
} IEC103_LINK_PROPER;
ST_RET iec103_asdu_head_from( const IEC_ASDU_HEAD *asdu_head, ST_UCHAR *asdu );
ST_RET iec103_asdu_head_set( IEC_ASDU_HEAD *asdu_head, const ST_UCHAR *asdu );
ST_RET iec103_asdu_fixtime_send( ST_UCHAR commAddr, ST_UCHAR devAddr, ST_UCHAR *sendBuf );
ST_RET iec103_asdu_gi_send( ST_UCHAR commAddr, ST_UCHAR devAddr, ST_UCHAR *sendBuf );
ST_INT iec103_link_recv_process(IEC103_LINK_PROPER *link_proper,ST_UCHAR *recvBuf,ST_INT recvLen);
ST_RET iec103_link_ctrl_get( const ST_UCHAR ctrlByte, IEC103_CTRL *ctrl );
ST_UCHAR iec103_link_ctrl_set( const IEC103_CTRL ctrl );
/************************************************************************/
#ifdef __cplusplus
}
#endif
#endif