#pragma once ///////////////////////////////////////////////////////////////////// //FgModBus: Library for EroElectronic Instruments with ModBus // protocol. //Softech di Germinara - Via Maestra n.2 - 10064 Pinerolo (TO) ITALY //www.germinara.it - franco@germinara.it - Tel. +390121339015 ///////////////////////////////////////////////////////////////////// //Version: 1.0.0 //Last Update: 14/07/2002 ///////////////////////////////////////////////////////////////////// //Comments: Free Use. // // // ///////////////////////////////////////////////////////////////////// #ifdef BUILD_LIBRARY #include "sicommctrl1.h" //SI_COMM ActiveX Object at // www.sinnovations.com #endif #define MAX_MODBUS_BUF_SIZE 100 #define MAX_TX_BUF_SIZE MAX_MODBUS_BUF_SIZE+8 #define MAX_RX_BUF_SIZE MAX_MODBUS_BUF_SIZE+8 #define MODBUS_FUNCT_READ_NBITS 2 #define MODBUS_FUNCT_READ_WORD 4 #define MODBUS_FUNCT_WRITE_BIT 5 #define MODBUS_FUNCT_WRITE_WORD 6 #define MODBUS_FUNCT_WRITE_NBITS 15 #define MODBUS_FUNCT_WRITE_NWORDS 16 #define MODBUS_NO_ERROR 0 #define MODBUS_TX_ERROR 1 #define MODBUS_RX_ERROR 2 #define MODBUS_CRC_ERROR 3 #define MODBUS_ILLEGAL_ADDRESS_ERROR 4 #define MODBUS_ILLEGAL_DATA_VALUE_ERROR 5 #define MODBUS_ILLEGAL_NUMBER_OF_DATA_REQUIRED_ERROR 6 #define MODBUS_BIT_CANNOT_BE_MODIFIED_ERROR 7 #define MODBUS_CONTROL_PARAMETER_ERROR 8 #define MODBUS_BUFFER_RX_ERROR 9 #define MODBUS_ILLEGAL_SETPOINT_DATA_VALUE_ERROR 10 #define MODBUS_BYTES_DONT_MATCH 11 #define MODBUS_UNKNOW_ERROR 10000 class AFX_CLASS_EXPORT CBseModBus{ private: unsigned char txbuffer[MAX_TX_BUF_SIZE]; //Trasmit Buffer unsigned char rxbuffer[MAX_TX_BUF_SIZE]; //Receive Buffer //Used for convertion BYTE to BITs and viceversa union{ struct{ unsigned char low:4; unsigned char high:4; }nibble; struct{ unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }bit; BYTE byte; }dato; //Used for convertion WORD to BYTEs and viceversa union{ struct dataword{ unsigned char lsb; unsigned char msb; }byte; WORD dw; }word; //Standard Structure User for ModBus protocol struct SendFrameHeader{ unsigned char s_addr; //Address of Slave unsigned char f_code; //ModBus Code Function unsigned short int devAddr; //Device Memory Address }; struct SendFrameData{ unsigned char data[MAX_MODBUS_BUF_SIZE]; //DataBuffer int nBytes; }; struct SendFrameFooter{ // 16 15 2 unsigned short int crc16; //Errore Check CRC-16: X + X + X + 1 }; //Standard Packet Data struct SendFramePacket{ struct SendFrameHeader SndFrmHdr; struct SendFrameData SndFrmData; struct SendFrameFooter SndFrmFtr; }SndFrmPck; int m_nDelay; //Delay Time Before Test for Receive Data long m_nBytesInRXBuffer; //Number of valid bytes in Rx Buffer CString m_strLastEECommand;//Last EE command request. private: //Base Operation unsigned short int BuildCRC16(unsigned char addr,unsigned char fcode,unsigned short int devAddr,unsigned char *data,int nBytes); //Build the CRC-16 value (Base value: 0xFFFF) unsigned short int BuildCRC16(unsigned char *data,int nBytes); //Build the CRC-16 value (Base value: 0xFFFF) void PraparePacket(unsigned char slave_addr,unsigned char functcode,unsigned short int devAddr, unsigned char *data,int nBytes); //Prepare data packet bool SendPacketToSlave(CSicommctrl1 *m_pSiCommEro); //Send packet data to Serial bool ReceivePacketToSlave(CSicommctrl1 *m_pSiCommEro); //Receive packet data from Serial void SetBit(int nBit,BOOL sts); //Set Bit void SetBit(CString strNBit,BOOL sts); //Set Bit BOOL GetBit(CString strNBit);//Get Bit BOOL GetBit(int nBit);//Get Bit int CheckPacketForError(bool stsSend,bool stsReceive); //Check replay message public: //Helper Functions void SetDelayTime(int nDelay){ m_nDelay = nDelay;}; //Set Delay Time int GetDelayTime(){ return m_nDelay; }; //Get Delay Time public: //EroElectronic Specific Command CString DecodeError(int nErrorCode); //Decode Error code int EE_SetRemote(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,bool sts=true); //Set Remote Mode int EE_SetSetPoint(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,double valSP);//Set SetPoint Value int EE_GetSetPoint(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,double *valSP);//Get the current SetPoint int EE_GetTemperature(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,double *valTEMP); //Get Current Temperature int EE_GetDeviceStatus(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,BOOL& bAlmSCA,BOOL& bAlm1,BOOL& bAlm2,BOOL& bChangedOccurred,BOOL& bTune,BOOL& bAdaptive,BOOL& bLock,BOOL& bControlMode,BOOL& bLocal,BOOL& bAuto,BOOL& bCtrlEnabled,BOOL& bSmart); //Get Bit Device Status in CONTROL MODE int EE_SetDeviceStatus(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,BOOL bLocal,BOOL bAuto,BOOL bCtrlEnabled,BOOL bSmart,BOOL bManualAlmRst,BOOL bLoadDefault,BOOL bEnableConfigMode); //Set Bit for change device status CONTROL MODE int EE_GetAlm(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,unsigned char nAlm,double *valSP);//Get the current AlmX threshold int EE_SetAlm(CSicommctrl1 *m_pSiCommEro,unsigned char slave_addr,unsigned char nAlm,double valSP);//set the current AlmX threshold public: CBseModBus(); //Standard Contructor ~CBseModBus(); //Destructor };