91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
|
||
|
||
|
||
#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
|
||
|