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

85 lines
2.3 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.

#ifndef IEC104_APDU_123_INCLUDED
#define IEC104_APDU_123_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************/
#include <stdio.h>
#include "glbtypes.h"
#include "iec60870_define.h"
//每个数据侦的最大长度默认不修改加4防止0XFF+2溢出
#define IEC104_APDU_MAX_LEN 260
//结束服务层数据侦缓冲区(一个select,多条报文)
#define IEC104_RECV_ASDU_BUFFER_MAX_COUNT 16
//传入的指针必须是无符号的
#define GetIEC104APDULen(databuf) (*(databuf+1) + 2)
//获取发送序号
#define GetIEC104SendCount(databuf) (databuf[2] + databuf[3]*0x100)
//获取接收序号
#define GetIEC104RecvCount(databuf) (databuf[4] + databuf[5]*0x100)
//设置报文长度
#define SetIEC104APDULen(databuf,bufLen) (databuf[1]=(ST_UCHAR)(bufLen-2) )
//设置发送序号
#define SetIEC104SendCount(dataBuf,sCnt) (dataBuf[2]=(ST_UCHAR)(sCnt&0xFF),dataBuf[3]=(ST_UCHAR)(sCnt/0x100) )
//设置接收序号
#define SetIEC104RecvCount(dataBuf,sCnt) (dataBuf[4]=(ST_UCHAR)(sCnt&0xFF),dataBuf[5]=(ST_UCHAR)(sCnt/0x100) )
typedef enum {
IEC104_LINK_TYPE_SOCK=0, //104只有网络,其它作为预留, 先不删除
IEC104_LINK_TYPE_SERIAL,
IEC104_LINK_TYPE_CAN
} IEC104_LINK_TYPE;
/****iec104服务器端链路层控制信息****/
typedef struct
{
ST_INT lastFrameLen; //接收长度
ST_INT lastFramExpectLen;
ST_DOUBLE lastFrameTime; //上次收到数据的时刻,如果时间长清空
ST_UCHAR lastFrame[IEC104_APDU_MAX_LEN]; //上一次帧未接收完整,留待下次一起处理
//保存收到的ASDU等待服务层处理这里仅仅保存指针——不可以由于涉及lastFrame的问题
//存在 上次收到一半数据,这次补全,但又发了一半数据
ST_INT asdu_recv_num;
ST_UCHAR asdu_recv_Buffer[IEC104_RECV_ASDU_BUFFER_MAX_COUNT][IEC104_APDU_MAX_LEN];
} IEC104_LINK_PROPER;
ST_RET iec104_asdu_head_from( const IEC_ASDU_HEAD *asdu_head, ST_UCHAR *asdu );
ST_RET iec104_asdu_head_set( IEC_ASDU_HEAD *asdu_head, const ST_UCHAR *asdu );
ST_RET iec104_asdu_fixtime_send( ST_UCHAR commAddr, ST_UCHAR devAddr, ST_UCHAR *sendBuf );
ST_RET iec104_asdu_gi_send( ST_UCHAR commAddr, ST_UCHAR devAddr, ST_UCHAR *sendBuf );
ST_INT iec104_link_recv_process(IEC104_LINK_PROPER *link_proper,ST_UCHAR *recvBuf,ST_INT recvLen);
/************************************************************************/
#ifdef __cplusplus
}
#endif
#endif