85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
|
||
|
||
|
||
#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
|
||
|