E5_Commu_PtlProfibus.h
资源名称:Profibus.rar [点击查看]
上传用户:hualang
上传日期:2022-04-11
资源大小:104k
文件大小:8k
源码类别:
能源行业(电力石油煤炭)
开发平台:
C/C++
- ///////////////////////////////////////////////////////////////
- // 文 件 名 : E5_Commu_PtlProfibus.h
- // 文件功能 : Profibus通讯规约处理类
- // 作 者 : 530
- // 创建时间 :
- // 项目名称 : LPC3
- // 操作系统 :
- // 备 注 :
- // 历史记录 :
- ///////////////////////////////////////////////////////////////
- #ifndef _E5_COMMU_PTL_PROFIBUS_H
- #define _E5_COMMU_PTL_PROFIBUS_H
- #include ".dp_incplatform.h"
- #include ".dp_incdp_inc.h"
- #include ".5200DPdp_user.h"
- #include "E5_CommuHdVPC3.h"
- #define NEW_MFC5908MODE //500兼容方式, 500装置每个小模件均分开独立处理
- #define EEPROM_SAVE ExramSOESave
- typedef struct
- {
- uint8 nModuleID; //模件ID
- uint8 nModuleInputBytes; //模件输入字节数
- uint8 nModuleOutputBytes;//模件输出字节数
- }TModuleDef;
- #define MaxModule 32
- #define MAX_DIAG_DATA_LEN 11 //V0诊断数据长度(和外部系统通讯使用)
- typedef struct
- {
- /************************************************************************/
- /* 芯片缓冲区 */
- /************************************************************************/
- //子站 -> 主站
- uint8 nInputLen;
- uint8 InputBuffer[64];
- //主站 -> 从站
- uint8 nOutputLen;
- uint8 OutputBuffer[32];
- //子站工作参数
- uint8 nPrmLen;
- uint8 PrmBuffer[32];
- //子站组态数据
- uint8 nCfgLen;
- uint8 CfgBuffer[64];
- /************************************************************************/
- /* 芯片工作状态 */
- /************************************************************************/
- uint8 bInitSuccess;//正常初始化
- /************************************************************************/
- /* 参数化数据解析 */
- /************************************************************************/
- uint8 bBigEdin;
- uint8 bProcessCyclicOutput;
- uint8 bDPV1Enable;
- uint8 bOutputFilter;
- uint8 bEnableDiag;
- uint8 bSiemensCompatiable;
- uint8 bClockSyncEnabled;
- /************************************************************************/
- /* 组态数据解析 */
- /************************************************************************/
- TModuleDef CfgModules[MaxModule];
- uint8 nModuleCount;
- int16 nRealDIByteCount; //实际输入字节数
- int16 nRealDOByteCount; //实际输出字节数
- /************************************************************************/
- /* 周期性数据解析 */
- /************************************************************************/
- //主站 -> 子站
- uint8 bCtrolLimitRemote;
- uint8 bCtrlLimitAuxBit;
- /************************************************************************/
- /* 报警处理 */
- /************************************************************************/
- uint8 bSOEWaitConfirm;//是否等待SOE确认
- uint8 nSoeSendType; //等确认的SOE类型
- uint32 nWaitSOEConfirm;//等确认的超时计数器
- //V0 诊断方式,与其他系统连接时使用
- uint8 V0_DiagData[MAX_DIAG_DATA_LEN];
- uint8 V0_DiagDataBackup[MAX_DIAG_DATA_LEN];
- /************************************************************************/
- /* 通讯监视 */
- /************************************************************************/
- uint8 bInDataExchange; //在数据交互状态
- uint32 nDisConnTimer;//不在数据交换状态时间监视
- /************************************************************************/
- /* V0事件队列 */
- /************************************************************************/
- //周期性传输SOE事件队列相关变量
- uint8 m_nAbnlSigPos;
- uint8 m_nActSigPos;
- uint8 m_nEvTxBlockNum; //发送的事件块编号, 上电初始化时为0
- uint8 m_nEvRxBlockNum; //接收的事件确认块编号
- uint8 m_nEvEntryCurPack;//本次传输的事件块含有多少个事件,最多3个
- uint8 m_bEvWaitConfirm; //有SOE等待确认
- #define NUM_EVENT_BUFFER_LEN 32//三条SOE缓冲区
- #define NUM_EVENT_BUFFER_LEN_SINGLE 12//单条SOE缓冲区
- #define SOE_CONFIRM_DOOFFSET 2//输出缓冲区事件确认块偏移
- uint8 m_nEvBuffer[NUM_EVENT_BUFFER_LEN]; //用于事件队列的缓存区
- uint8 m_bSingleSOE;//只上送一条SOE
- uint8 m_bHaveSOEModule;//是否含有SOE模件
- }TProfibusRam;
- extern TProfibusRam g_ProfibusRam;
- //模件ID号
- enum
- {
- ID_MODULE_BUDIDO = 1,
- ID_MODULE_RESERVED,
- ID_MODULE_IA,
- ID_MODULE_IB,
- ID_MODULE_IC,
- ID_MODULE_IAV,
- ID_MODULE_IMAX,
- ID_MODULE_UAB,
- ID_MODULE_UBC,
- ID_MODULE_UCA,
- ID_MODULE_P,
- ID_MODULE_Q,
- ID_MODULE_FACT,
- ID_MODULE_PE,
- ID_MODULE_QE,
- ID_MODULE_STARTS,
- ID_MODULE_CLOSES_A,
- ID_MODULE_TRIPS_A,
- ID_MODULE_CLOSES_B,
- ID_MODULE_TRIPS_B,
- ID_MODULE_PROT_TRIPS,
- ID_MODULE_TOTAL_RUNTIME,
- //add
- ID_MODULE_UA,
- ID_MODULE_UB,
- ID_MODULE_UC,
- ID_MODULE_S, //系统视在功率
- ID_MODULE_PA, //A相有功功率
- ID_MODULE_QA, //A相无功功率
- ID_MODULE_SA, //A相视在功率
- ID_MODULE_FACTA, //A相功率因数
- ID_MODULE_PB, //B相有功功率
- ID_MODULE_QB, //B相无功功率
- ID_MODULE_SB, //B相视在功率
- ID_MODULE_FACTB, //B相功率因数
- ID_MODULE_PC, //C相有功功率
- ID_MODULE_QC, //C相无功功率
- ID_MODULE_SC, //C相视在功率
- ID_MODULE_FACTC, //C相功率因数
- ID_MODULE_PEA, //A相有功电能
- ID_MODULE_QEA, //A相无功电能
- ID_MODULE_PEB, //B相有功电能
- ID_MODULE_QEB, //B相无功电能
- ID_MODULE_PEC, //C相有功电能
- ID_MODULE_QEC, //C相无功电能
- ID_MODULE_SOE = 200, //SOE模件
- ID_MODULE_VIRTUALPT_EXT = 201, //扩展虚拟点模块
- ID_MODULE_ABNORMAL = 202, //异常量模件
- ID_MODULE_ACTIONSIGNAL = 203 //动作信号模件
- };
- void InitProfibusRam(uint8 nDevID);
- void SignalReset_ProfibusDiag(void);
- #define GetRealDigiIn(uDigiInID) ((Ram.udigital_in & (((uint64)1)<<(uDigiInID)))>>(uDigiInID))
- #define GetRealDigiOut(uDigiInID) ((Ram.udigital_out & (((uint64)1)<<(uDigiInID)))>>(uDigiInID))
- #define CheckBit(btValue, nBitID) ((btValue & (1<<(nBitID)))>>(nBitID))
- #define IsAbnormal(nAbnormalID) (( Ram.abnormal.i >>((uint16)(nAbnormalID))) & 1)
- #define GetProtActionSignal(nID) ( (nID<16) ? ((Ram.CurrentMeasure.Stu.uProt>>nID)&0x01) : ((Ram.CurrentMeasure.Stu.uProt_ex>>(nID-16))&0x01) )
- #define NUM_REAL_DI_COUNT DI_MAXCOUNT
- #define NUM_REAL_DO_COUNT DO_MAXCOUNT
- #define NUM_VIRTUAL_PT_COUNT 3 //只有事故总,告警总,自检总信号
- #define NUM_PROT_ACTION_COUNT (ID_SET_ELSE - ID_SET_PROTTYPE) //NUM_PROTTYPES
- #define NUM_ABNORMAL_COUNT (ABNORMAL_LAST-ABNORMAL_FIRST)
- //每个模件至少要有一个开关量,如果没有则也要预留一个字节
- #define _NEXT_DI_MODULE_(nPtCount)
- nDICount = (nPtCount==0)?1:nPtCount;
- nDICount = ((nDICount % 8) == 0)?(nDICount / 8):(nDICount / 8 + 1);
- g_ProfibusRam.nInputLen += nDICount;
- nTmpBitPos = 0;//重新从0开始填充位
- //组装DWORD测量量
- #define ASSEMB_DWORD_MEAS(uVal) if(g_ProfibusRam.bBigEdin) g_ProfibusRam.nInputLen += AssembDWordBigEdin(&g_ProfibusRam.InputBuffer[g_ProfibusRam.nInputLen], uVal );
- else g_ProfibusRam.nInputLen += AssembDWordLittleEdin(&g_ProfibusRam.InputBuffer[g_ProfibusRam.nInputLen], uVal );
- //组装WORD测量量
- #define ASSEMB_WORD_MEAS(uVal) if(g_ProfibusRam.bBigEdin) g_ProfibusRam.nInputLen += AssembWordBigEdin(&g_ProfibusRam.InputBuffer[g_ProfibusRam.nInputLen], uVal );
- else g_ProfibusRam.nInputLen += AssembWordLittleEdin(&g_ProfibusRam.InputBuffer[g_ProfibusRam.nInputLen], uVal );
- uint8 AssembByte(uint8* pDest, uint8 nBtVal);
- uint8 AssembNBytes(uint8* pDest, const uint8 * p, uint32 count);
- void AssembBit(uint8* pDest, uint8 nBitPos, uint8 nBitVal);
- uint8 AssembWordLittleEdin(uint8* pDest, uint16 nWordVal);
- uint8 AssembWordBigEdin(uint8* pDest, uint16 nWordVal);
- uint8 AssembDWordBigEdin(uint8* pDest, uint32 nDWordVal);
- uint8 AssembDWordLittleEdin(uint8* pDest, uint32 nDWordVal);
- uint8 DissembWordLittleEdin(uint8* pDest, uint16* nWordVal);
- uint8 DissembWordBigEdin(uint8* pDest, uint16* nWordVal);
- void ProcessEventListSend(void);
- void ProcessEventListRcv(void);
- void AssembInputBuff_MFC5208(void);
- #endif