350 lines
14 KiB
C
350 lines
14 KiB
C
|
#include "user_mb_app.h"
|
|||
|
/*------------------------Slave mode use these variables----------------------*/
|
|||
|
//Slave mode:DiscreteInputs variables
|
|||
|
USHORT usSDiscInStart = S_DISCRETE_INPUT_START;
|
|||
|
#if S_DISCRETE_INPUT_NDISCRETES%8
|
|||
|
UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1];
|
|||
|
#else
|
|||
|
UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ;
|
|||
|
#endif
|
|||
|
//Slave mode:Coils variables
|
|||
|
USHORT usSCoilStart = S_COIL_START;
|
|||
|
#if S_COIL_NCOILS%8
|
|||
|
UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ;
|
|||
|
#else
|
|||
|
UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ;
|
|||
|
#endif
|
|||
|
//Slave mode:InputRegister variables
|
|||
|
USHORT usSRegInStart = S_REG_INPUT_START;
|
|||
|
USHORT usSRegInBuf[S_REG_INPUT_NREGS] ;
|
|||
|
//Slave mode:HoldingRegister variables
|
|||
|
USHORT usSRegHoldStart = S_REG_HOLDING_START;
|
|||
|
USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ;
|
|||
|
/*-----------------------Master mode use these variables----------------------*/
|
|||
|
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
|
|||
|
//Master mode:DiscreteInputs variables
|
|||
|
USHORT usMDiscInStart = M_DISCRETE_INPUT_START;
|
|||
|
#if M_DISCRETE_INPUT_NDISCRETES%8
|
|||
|
UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
|
|||
|
#else
|
|||
|
UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8];
|
|||
|
#endif
|
|||
|
//Master mode:Coils variables
|
|||
|
USHORT usMCoilStart = M_COIL_START;
|
|||
|
#if M_COIL_NCOILS%8
|
|||
|
UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];
|
|||
|
#else
|
|||
|
UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];
|
|||
|
#endif
|
|||
|
//Master mode:InputRegister variables
|
|||
|
USHORT usMRegInStart = M_REG_INPUT_START;
|
|||
|
USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];
|
|||
|
//Master mode:HoldingRegister variables
|
|||
|
USHORT usMRegHoldStart = M_REG_HOLDING_START;
|
|||
|
USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];
|
|||
|
#endif
|
|||
|
//******************************<2A><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>**********************************
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
|
|||
|
//<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>pucRegBuffer : <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modbus<75>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰֵд<D6B5><D0B4><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// usAddress : <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD><CEA7>1-65535<33><35>
|
|||
|
// usNRegs : <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>eMBErrorCode : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><> ע<><D7A2>Editor<6F><72>Armink 2010-10-31 Company: BXXJS
|
|||
|
//**********************************************************************************
|
|||
|
eMBErrorCode
|
|||
|
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
|
|||
|
{
|
|||
|
eMBErrorCode eStatus = MB_ENOERR;
|
|||
|
int iRegIndex;
|
|||
|
USHORT * pusRegInputBuf;
|
|||
|
UCHAR REG_INPUT_START;
|
|||
|
UCHAR REG_INPUT_NREGS;
|
|||
|
UCHAR usRegInStart;
|
|||
|
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress()];
|
|||
|
REG_INPUT_START = M_REG_INPUT_START;
|
|||
|
REG_INPUT_NREGS = M_REG_INPUT_NREGS;
|
|||
|
usRegInStart = usMRegInStart;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pusRegInputBuf = usSRegInBuf;
|
|||
|
REG_INPUT_START = S_REG_INPUT_START;
|
|||
|
REG_INPUT_NREGS = S_REG_INPUT_NREGS;
|
|||
|
usRegInStart = usSRegInStart;
|
|||
|
}
|
|||
|
|
|||
|
if( ( usAddress >= REG_INPUT_START )
|
|||
|
&& ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
|
|||
|
{
|
|||
|
iRegIndex = ( int )( usAddress - usRegInStart );
|
|||
|
while( usNRegs > 0 )
|
|||
|
{
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8;
|
|||
|
pusRegInputBuf[iRegIndex] |= *pucRegBuffer++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
*pucRegBuffer++ = ( unsigned char )( pusRegInputBuf[iRegIndex] >> 8 );
|
|||
|
*pucRegBuffer++ = ( unsigned char )( pusRegInputBuf[iRegIndex] & 0xFF );
|
|||
|
}
|
|||
|
iRegIndex++;
|
|||
|
usNRegs--;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
eStatus = MB_ENOREG;
|
|||
|
}
|
|||
|
|
|||
|
return eStatus;
|
|||
|
}
|
|||
|
//******************************<2A><><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>**********************************
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
|
|||
|
//<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>pucRegBuffer : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>µļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
|||
|
// <20><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ջ<EFBFBD><D5BB>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뽫<EFBFBD><EBBDAB>ǰֵд<D6B5><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// usAddress : <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7>
|
|||
|
// usNRegs : <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// eMode : <20><><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ΪeMBRegisterMode::MB_REG_WRITE<54><45><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>pucRegBuffer<65>еõ<D0B5><C3B5><EFBFBD><EFBFBD>¡<EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ΪeMBRegisterMode::MB_REG_READ<41><44><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>pucRegBuffer<65><72>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>eMBErrorCode : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><> ע<><D7A2>Editor<6F><72>Armink 2010-10-31 Company: BXXJS
|
|||
|
//**********************************************************************************
|
|||
|
eMBErrorCode
|
|||
|
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
|
|||
|
{
|
|||
|
eMBErrorCode eStatus = MB_ENOERR;
|
|||
|
int iRegIndex;
|
|||
|
USHORT * pusRegHoldingBuf;
|
|||
|
UCHAR REG_HOLDING_START;
|
|||
|
UCHAR REG_HOLDING_NREGS;
|
|||
|
UCHAR usRegHoldStart;
|
|||
|
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress()];
|
|||
|
REG_HOLDING_START = M_REG_HOLDING_START;
|
|||
|
REG_HOLDING_NREGS = M_REG_HOLDING_NREGS;
|
|||
|
usRegHoldStart = usMRegHoldStart;
|
|||
|
//If mode is read,the master will wirte the received date to bufffer.
|
|||
|
eMode = MB_REG_WRITE;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pusRegHoldingBuf = usSRegHoldBuf;
|
|||
|
REG_HOLDING_START = S_REG_HOLDING_START;
|
|||
|
REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;
|
|||
|
usRegHoldStart = usSRegHoldStart;
|
|||
|
}
|
|||
|
|
|||
|
if( ( usAddress >= REG_HOLDING_START ) &&
|
|||
|
( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
|
|||
|
{
|
|||
|
iRegIndex = ( int )( usAddress - usRegHoldStart );
|
|||
|
switch ( eMode )
|
|||
|
{
|
|||
|
/* Pass current register values to the protocol stack. */
|
|||
|
case MB_REG_READ:
|
|||
|
while( usNRegs > 0 )
|
|||
|
{
|
|||
|
*pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] >> 8 );
|
|||
|
*pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] & 0xFF );
|
|||
|
iRegIndex++;
|
|||
|
usNRegs--;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
/* Update current register values with new values from the
|
|||
|
* protocol stack. */
|
|||
|
case MB_REG_WRITE:
|
|||
|
while( usNRegs > 0 )
|
|||
|
{
|
|||
|
pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
|
|||
|
pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
|
|||
|
iRegIndex++;
|
|||
|
usNRegs--;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
eStatus = MB_ENOREG;
|
|||
|
}
|
|||
|
return eStatus;
|
|||
|
}
|
|||
|
//****************************<2A><>Ȧ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>********************************
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
|
|||
|
//<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>pucRegBuffer : λ<><CEBB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>λ<EFBFBD><CEBB><EFBFBD>ڸ<EFBFBD><DAB8>ֽ<EFBFBD>pucRegBuffer<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λLSB<53><42>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD><EFBFBD>粻<EFBFBD><E7B2BB>8<EFBFBD><38>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ0<CEBB><30>
|
|||
|
// usAddress : <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6>ַ<EFBFBD><D6B7>
|
|||
|
// usNCoils : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD>
|
|||
|
// eMode <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ΪeMBRegisterMode::MB_REG_WRITE<54><45><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>pucRegBuffer<65>еõ<D0B5><C3B5><EFBFBD><EFBFBD>¡<EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ΪeMBRegisterMode::MB_REG_READ<41><44><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>pucRegBuffer<65><72>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>eMBErrorCode : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><> ע<><D7A2>Editor<6F><72>Armink 2010-10-31 Company: BXXJS
|
|||
|
//**********************************************************************************
|
|||
|
eMBErrorCode
|
|||
|
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
|
|||
|
{
|
|||
|
eMBErrorCode eStatus = MB_ENOERR;
|
|||
|
int iRegIndex , iRegBitIndex , iNReg;
|
|||
|
UCHAR * pucCoilBuf;
|
|||
|
UCHAR COIL_START;
|
|||
|
UCHAR COIL_NCOILS;
|
|||
|
UCHAR usCoilStart;
|
|||
|
iNReg = usNCoils / 8 + 1; //ռ<>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress()];
|
|||
|
COIL_START = M_COIL_START;
|
|||
|
COIL_NCOILS = M_COIL_NCOILS;
|
|||
|
usCoilStart = usMCoilStart;
|
|||
|
//If mode is read,the master will wirte the received date to bufffer.
|
|||
|
eMode = MB_REG_WRITE;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pucCoilBuf = ucSCoilBuf;
|
|||
|
COIL_START = S_COIL_START;
|
|||
|
COIL_NCOILS = S_COIL_NCOILS;
|
|||
|
usCoilStart = usSCoilStart;
|
|||
|
}
|
|||
|
|
|||
|
if( ( usAddress >= COIL_START ) &&
|
|||
|
( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) )
|
|||
|
{
|
|||
|
iRegIndex = ( int )( usAddress - usCoilStart ) / 8 ; //ÿ<><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><38>
|
|||
|
iRegBitIndex = ( int )( usAddress - usCoilStart ) % 8 ; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڼĴ<DABC><C4B4><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>λ<EFBFBD><CEBB>ַ
|
|||
|
switch ( eMode )
|
|||
|
{
|
|||
|
/* Pass current coil values to the protocol stack. */
|
|||
|
case MB_REG_READ:
|
|||
|
while( iNReg > 0 )
|
|||
|
{
|
|||
|
*pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8);
|
|||
|
iNReg --;
|
|||
|
}
|
|||
|
pucRegBuffer --;
|
|||
|
usNCoils = usNCoils % 8; //<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ȧ<EFBFBD><C8A6>
|
|||
|
*pucRegBuffer = *pucRegBuffer <<(8 - usNCoils); //<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
*pucRegBuffer = *pucRegBuffer >>(8 - usNCoils);
|
|||
|
break;
|
|||
|
|
|||
|
/* Update current coil values with new values from the
|
|||
|
* protocol stack. */
|
|||
|
case MB_REG_WRITE:
|
|||
|
while(iNReg > 1) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
xMBUtilSetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++);
|
|||
|
iNReg--;
|
|||
|
}
|
|||
|
usNCoils = usNCoils % 8; //<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ȧ<EFBFBD><C8A6>
|
|||
|
if (usNCoils != 0) //xMBUtilSetBits<74><73><EFBFBD><EFBFBD> <20>ڲ<EFBFBD><DAB2><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD>bug
|
|||
|
{
|
|||
|
xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils,
|
|||
|
*pucRegBuffer++);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
eStatus = MB_ENOREG;
|
|||
|
}
|
|||
|
return eStatus;
|
|||
|
}
|
|||
|
//****************************<2A><>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>********************************
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
|
|||
|
//<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>pucRegBuffer : <20>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>λ<EFBFBD><CEBB><EFBFBD>ڸ<EFBFBD><DAB8>ֽ<EFBFBD>pucRegBuffer<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λLSB<53><42>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD><EFBFBD>粻<EFBFBD><E7B2BB>8<EFBFBD><38>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>
|
|||
|
// usAddress : <20><>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
|||
|
// usNDiscrete : <20><>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>eMBErrorCode : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><> ע<><D7A2>Editor<6F><72>Armink 2010-10-31 Company: BXXJS
|
|||
|
//**********************************************************************************
|
|||
|
eMBErrorCode
|
|||
|
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
|
|||
|
{
|
|||
|
eMBErrorCode eStatus = MB_ENOERR;
|
|||
|
int iRegIndex , iRegBitIndex , iNReg;
|
|||
|
UCHAR * pucDiscreteInputBuf;
|
|||
|
UCHAR DISCRETE_INPUT_START;
|
|||
|
UCHAR DISCRETE_INPUT_NDISCRETES;
|
|||
|
UCHAR usDiscreteInputStart;
|
|||
|
iNReg = usNDiscrete / 8 + 1; //ռ<>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress()];
|
|||
|
DISCRETE_INPUT_START = M_DISCRETE_INPUT_START;
|
|||
|
DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES;
|
|||
|
usDiscreteInputStart = usMDiscInStart;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pucDiscreteInputBuf = ucSDiscInBuf;
|
|||
|
DISCRETE_INPUT_START = S_DISCRETE_INPUT_START;
|
|||
|
DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES;
|
|||
|
usDiscreteInputStart = usSDiscInStart;
|
|||
|
}
|
|||
|
|
|||
|
if( ( usAddress >= DISCRETE_INPUT_START )
|
|||
|
&& ( usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES ) )
|
|||
|
{
|
|||
|
iRegIndex = ( int )( usAddress - usDiscreteInputStart ) / 8 ; //ÿ<><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><38>
|
|||
|
iRegBitIndex = ( int )( usAddress - usDiscreteInputStart ) % 8 ; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڼĴ<DABC><C4B4><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>λ<EFBFBD><CEBB>ַ
|
|||
|
|
|||
|
//Determine the master or slave
|
|||
|
if (xMBMasterGetCBRunInMasterMode())
|
|||
|
{
|
|||
|
/* Update current coil values with new values from the
|
|||
|
* protocol stack. */
|
|||
|
while(iNReg > 1) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++);
|
|||
|
iNReg--;
|
|||
|
}
|
|||
|
usNDiscrete = usNDiscrete % 8; //<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ȧ<EFBFBD><C8A6>
|
|||
|
if (usNDiscrete != 0) //xMBUtilSetBits<74><73><EFBFBD><EFBFBD> <20>ڲ<EFBFBD><DAB2><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD>bug
|
|||
|
{
|
|||
|
xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex,
|
|||
|
usNDiscrete, *pucRegBuffer++);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
while( iNReg > 0 )
|
|||
|
{
|
|||
|
*pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++] , iRegBitIndex , 8);
|
|||
|
iNReg --;
|
|||
|
}
|
|||
|
pucRegBuffer --;
|
|||
|
usNDiscrete = usNDiscrete % 8; //<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ȧ<EFBFBD><C8A6>
|
|||
|
*pucRegBuffer = *pucRegBuffer <<(8 - usNDiscrete); //<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
*pucRegBuffer = *pucRegBuffer >>(8 - usNDiscrete);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
eStatus = MB_ENOREG;
|
|||
|
}
|
|||
|
|
|||
|
return eStatus;
|
|||
|
}
|