⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.h

📁 一个modbus协议的opc server
💻 H
字号:
// modbu.h: interface for the CModbus class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MODBU_H__C08841E3_BB2E_11D1_8FE9_E4CD05C10000__INCLUDED_)
#define AFX_MODBU_H__C08841E3_BB2E_11D1_8FE9_E4CD05C10000__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000


#include "ModbusMessages.h"

#include <windef.h>

//timeGetTime function 
#include <mmsystem.h>
//CArray definition 
#include <afxtempl.h>
//Critical Section 
#include <afxmt.h> 


//CRC calculation 
#include "crc16.hpp"



//used to mesure response times 
#include "PerformanceCounter.h"



class CModbus;
class CModbusException;

class CModbusException : public CException
{
	DECLARE_DYNAMIC(CModbusException)
public:
// Constructor
	CModbusException(CString& sMessage,int nError);

public:
	~CModbusException() {}
	virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
		PUINT pnHelpContext = NULL);
private:
	int m_nError;
	CString m_strMessage;
};


typedef CArray<CModbus,CModbus&> CModbusArray;
typedef CArray<short,short> CShortArray;
typedef CArray<float,float> CFloatArray;
typedef CArray<double,double> CDblArray;

class CModbus: public CObject  
{
	DECLARE_DYNAMIC(CModbus)

public:
	
	CModbus();
	virtual ~CModbus();

	//Do a loopback test 
    // return ERR_XXX Code see Modbus.cpp file 
    WORD LoopbackTest(WORD nAddr);//addrres of modbus device 
    
    //Read Output registers 
    //return ERR_XXX Code see Modbus.cpp file  
    WORD ReadOutputRegisters(WORD nAddr,  //address of modbus device
						  WORD nDataStart , //start address, first address is 0 "ZERO" Ex: 30005 -> nDaStart=4 
                          WORD nQtd , //number of reg. to read 
                          CWordArray& anRegValues); //read values if does not occur an error
    
    WORD ReadOutputRegisters(WORD nAddr,  //address of modbus device
						  WORD nDataStart , //start address, first address is 0 "ZERO" Ex: 30005 -> nDaStart=4 
                          WORD nQtd , //number of reg. to read 
                          CShortArray& anRegValues); //read values if does not occur an error
    
    WORD ReadOutputRegisters(WORD nAddr,
        WORD nDataStart , 
        WORD nQtd , 
        CDblArray& anRegValues,
        WORD wRealType = REAL_NORMAL);
    
    WORD ReadOutputRegisters(WORD nAddr,
        WORD nDataStart , 
        WORD nQtd , 
        CFloatArray& anRegValues,
        WORD wRealType = REAL_NORMAL);
    
    //Read Input registers 
    //return ERR_XXX Code see Modbus.cpp file  
    WORD ReadInputRegisters( WORD nAddr,  //address of modbus device 
						  WORD nDataStart , //start address, first address is 0 "ZERO" Ex: 40005 -> nDaStart=4 
                          WORD nQtd , //number of reg. to read 
                          CWordArray& anRegValues);//read values if does not occur an error
    
    WORD ReadInputRegisters( WORD nAddr,  //address of modbus device 
						  WORD nDataStart , //start address, first address is 0 "ZERO" Ex: 40005 -> nDaStart=4 
                          WORD nQtd , //number of reg. to read 
                          CShortArray& anRegValues);//read values if does not occur an error
    
    WORD ReadInputRegisters(WORD nAddr,  
								WORD nDataStart , 
                                WORD nQtd , 
                                CDblArray& anRegValues,
                                WORD wRealType = REAL_NORMAL);
    
    WORD ReadInputRegisters(WORD nAddr,  
								WORD nDataStart , 
                                WORD nQtd , 
                                CFloatArray& anRegValues,
                                WORD wRealType = REAL_NORMAL);
    //Read Output Status  
    //return ERR_XXX Code see Modbus.cpp file 
    WORD ReadOutputStatus(WORD nAddr, //address of modbus device
					   WORD nDataStart , //start address, first address is 0 "ZERO" 
                       WORD nQtd , //number of coils. to read
                       CByteArray& abyCoilValues); //read coils if does not occur an error
    //use TRUE and FALSE windows defines 
    
    //Read Input Status  
    //return ERR_XXX Code see Modbus.cpp file 
    WORD ReadInputStatus(WORD nAddr, //address of modbus device
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd , //number of coils. to read
        CByteArray& abCoilValues);//read coils if does not occur an error
    //use TRUE and FALSE windows defines 
    
    
    //Preset multiple Registers    
    //return ERR_XXX Code see Modbus.cpp file 
    WORD PresetMultipleRegisters(WORD nAddr, //address of modbus device 
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd , //number of reg . to write 
        CShortArray& anRegValues); //regvalues that will be written
    
    WORD PresetMultipleRegisters(WORD nAddr, //address of modbus device 
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd , //number of reg . to write 
        CWordArray& anRegValues); //regvalues that will be written
    
    WORD PresetMultipleRegisters(WORD nAddr, //address of modbus device 
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd , //number of reg . to write 
							   CDblArray& anRegValues,
							   WORD wRealType = REAL_NORMAL); //regvalues that will be written
    
    WORD PresetMultipleRegisters(WORD nAddr, //address of modbus device 
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd , //number of reg . to write 
        CFloatArray& afRegValues,
        WORD wRealType = REAL_NORMAL); //regvalues that will be written
    
    
    //Preset single Register    
    //return ERR_XXX Code see Modbus.cpp file
    WORD PresetSingleRegister(WORD nAddr, //address of modbus device
        WORD nRegister , //register start at 0 
        WORD nRegValue); //register value 
    
    WORD PresetSingleRegister(WORD nAddr,
        WORD nRegister , 
        short int nRegValue);
    
    WORD PresetSingleRegister(WORD nAddr,
        WORD nRegister , 
        float fRegValue,
        WORD wRealType = REAL_NORMAL);
    
    WORD PresetSingleRegister(WORD nAddr,
        WORD nRegister , 
        double dRegValue,
        WORD wRealType = REAL_NORMAL);
    
    
    //Force Single Coil 
    //return ERR_XXX Code see Modbus.cpp file
    WORD ForceSingleCoil(WORD nAddr,//address of modbus device
        WORD nRegister,  //register start at 0 
        BOOL bCoilValue); //register value 
    
    //Force multiple Coils 
    //return ERR_XXX Code see Modbus.cpp file
    WORD ForceMultipleCoils(WORD nAddr, //address of modbus device
        WORD nDataStart , //start address, first address is 0 "ZERO" 
        WORD nQtd ,  //number of reg . to write
        CByteArray& abCoilValues); //coils values 
    
   
   
   //transmit a query to a modbus device and wait for a response
   //return ERR_XXX Code see Modbus.cpp file  
   virtual WORD TxRxMessage(CByteArray& abyQuery, //modbus query without CRC
       WORD wLengthQuery, //QueryLength without CRC
       CByteArray& abyResponse, //modbus Response without CRC
       WORD wLengthResponse, //wLengthResponse Response without CRC
       WORD* pwNumOfBytesRead=NULL)=0;
   
	//return string error message 
	//in:wErrorCode constant errro code 
	//out:string with error 
    virtual CString ErrorMessage(WORD wErrorCode); 

	BOOL Lock(); //lock modbus object "External Critical Section"

	BOOL Unlock();

	//response time of last comunication
	float ResponseTime();

	//Retries
	WORD Retries() const ;
	void Retries(WORD wRetries);

	DWORD Delay();
	void  Delay(DWORD dwDelay);


	BOOL ThrowException() const;
	void ThrowException(BOOL bThrow);

	virtual BOOL IsActive()=0; //return  if the connection is open


	enum _general_constants_ {
		REAL_NORMAL=0,
        REAL_REVERSE=1
	};


	//error codes 
	enum _error_codes_ {
		ERR_OK =    0,   // OK
		ERR_TIMEOUT=1,   // TIMEOUT
		ERR_INV_RESP=2,   // Invalid Response 
		ERR_CRC=    3,   // CRC Error
		ERR_WR_PORT= 8,   // Write Comm Error
		ERR_RD_PORT= 9,   // Read Comm Error
		ERR_NOT_INT=10,  // Open Comm error
		ERR_LOCK_TIME_OUT=11,  // Open Comm error
		ERR_EXCPTION_CODE=0x8000   //8001->Exp. code 1 8002->excep. code 2 
	};

	//used for seralization the object to file 
	void Serialize( CArchive& archive );

protected:
    void ThrowModbusException(WORD wErrorcode);
    void DoEvents();
    void ErrorDelay(WORD nError);

	CPerformanceCounter m_PerfCounter;
	CCriticalSection m_csComm; //Critical Section when sending message to modbus device 

    
private:
    
    //C++ boolean to modbus boolean 
    WORD CmodBool(BOOL bCoil);
    
    //copy short 2 word array 
    void Short2WordArray(CShortArray& aiArray ,CWordArray& anArray);
    
    void Word2ShortArray(CWordArray& anArray ,CShortArray& aiArray);
    
    void Dbl2Word(const double* padSrc, int iSrcSize,WORD* pawDest, int iDestSize,WORD wRealType = REAL_NORMAL);  
    
    void Word2Dbl(const WORD* pawSrc, int iSrcSize,double* padDest, int iDestSize,WORD wRealType = REAL_NORMAL);  
    
    void Word2Float(const WORD* pawSrc, int iSrcSize,float* padDest, int iDestSize,WORD wRealType= REAL_NORMAL);
    
    void Float2Word(const float* padSrc, int iSrcSize,WORD* pawDest, int iDestSize,WORD wRealType);
    
    WORD  m_wRetries;
    DWORD m_dwLockTimeout;
    DWORD m_dwDelay;
    
    BOOL m_bThrowModbusException;
    
    //modbus functions 
    static const BYTE READ_OUTPUT_REGISTERS; 
    static const BYTE READ_INPUT_REGISTERS;
    static const BYTE READ_INPUT_STATUS; 
    static const BYTE READ_OUTPUT_STATUS; 
    static const BYTE PRESET_MULTIPLE_REGISTERS;
    static const BYTE PRESET_SINGLE_REGISTER;
    static const BYTE LOOP_BACK_TEST;
    static const BYTE FORCE_SINGLE_COIL;
    static const BYTE FORCE_MULTIPLE_COILS;
    

};

#endif // !defined(AFX_MODBU_H__C08841E3_BB2E_11D1_8FE9_E4CD05C10000__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -