map/das-dn/submodbusrtu/sub_modbus_rtu.h
2024-07-08 10:27:17 +08:00

75 lines
3.1 KiB
C++

#ifndef _ZJD_SUB_MODBUS_RTU_PROCESS_H_
#define _ZJD_SUB_MODBUS_RTU_PROCESS_H_
#include "portproc.h"
#include "modbus_def.h"
#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */
#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */
#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */
#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */
#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */
class CSubModbusRtuProcessItem : public CPortProcessItem
{
public:
CSubModbusRtuProcessItem();
virtual ~CSubModbusRtuProcessItem();
void Attach(int uid, int physicsAddress = 0, int commonAddress = 0, int originatorAddress = 0);
void Release(void);
public:
short m_YCRegCount;
WORD *m_pYCRegTab;
short m_YMRegCount;
WORD *m_pYMRegTab;
short m_YXRegCount;
BYTE *m_pYXRegTab;
};
class CSubModbusRtuProcess : public CPortProcess
{
private:
DWORD usTimerT35_50us;
public:
CSubModbusRtuProcess();
virtual ~CSubModbusRtuProcess();
CPortProcessItem *CreateItem(int ord);
void DestroyItem(int ord, BOOLEAN bDeleted = FALSE);
virtual BOOLEAN OnPreCreate(int id);
virtual BOOLEAN Run(void);
virtual BOOLEAN OnTimer(void);
BOOLEAN OnReceiveData(BYTE* pData, int count);
private:
BYTE m_YC_Type;
BYTE ucRTUBuf[MB_SER_PDU_SIZE_MAX];
enum
{
M_ME_NA,
M_ME_NC
};
BOOLEAN SerialPortTimeout(void);
eMBErrorCode eMBRTUSend(BYTE ucSlaveAddress, const BYTE *pucFrame, WORD usLength);
eMBException prveMBError2Exception(eMBErrorCode eErrorCode);
eMBException eMBFuncReadInputRegister(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncReadHoldingRegister(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncWriteHoldingRegister(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncWriteMultipleHoldingRegister(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncReadCoils(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncWriteCoil(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncWriteMultipleCoils(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBException eMBFuncReadDiscreteInputs(CSubModbusRtuProcessItem *pItem, BYTE* pucFrame, WORD* usLen);
eMBErrorCode eMBRegInputCB(CSubModbusRtuProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNRegs);
eMBErrorCode eMBRegHoldingCB(CSubModbusRtuProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNRegs, eMBRegisterMode eMode);
eMBErrorCode eMBRegCoilsCB(CSubModbusRtuProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNCoils, eMBRegisterMode eMode);
eMBErrorCode eMBRegDiscreteCB(CSubModbusRtuProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNDiscrete);
};
#endif //_ZJD_SUB_MODBUS_RTU_PROCESS_H_