#ifndef IEC104_APDU_123_INCLUDED #define IEC104_APDU_123_INCLUDED #ifdef __cplusplus extern "C" { #endif /************************************************************************/ #include #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