
高级工程师
  
- 积分
- 5058
- 在线时间
- 637 小时
- 精华
- 1
- 注册时间
- 2017-12-2
- 最后登录
- 2021-3-2
|
8、demo.c内容- #include "mb.h"
- #include "mbport.h"
- /* ----------------------- Defines ------------------------------------------*/
- #define REG_COILS_START 0x0001
- #define REG_COILS_SIZE 16
- unsigned char ucRegCoilsBuf[REG_COILS_SIZE / 8]={0X00,0X00};
- /* ----------------------- Static variables ---------------------------------*/
- #define REG_DISC_START 0x0001
- #define REG_DISC_SIZE 16
- unsigned char ucRegDiscBuf[REG_DISC_SIZE / 8] = { 0x0F, 0XF0 };
- /* ----------------------- Start implementation -----------------------------*/
- #define REG_INPUT_START 0x0001
- #define REG_INPUT_NREGS 8
- static USHORT usRegInputStart = REG_INPUT_START;
- static USHORT usRegInputBuf[REG_INPUT_NREGS]=
- {0x1111,0x2222,0x3333,0x4444,0x5555,0x6666,0x7777,0x8888};
- #define REG_HOLDING_START 0x0001 //保持寄存器起始地址
- #define REG_HOLDING_NREGS 8 //保持寄存器数量
- USHORT usRegHoldingStart = REG_HOLDING_START;
- USHORT usRegHoldingBuf[REG_HOLDING_NREGS]=
- {0X1100,0X2200,0X3300,0X4400,0X5500,0X6600,0X7700,0X8800};
- eMBErrorCode
- eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- if( ( usAddress >= REG_INPUT_START )
- && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
- {
- iRegIndex = ( int )( usAddress - usRegInputStart );
- while( usNRegs > 0 )
- {
- *pucRegBuffer++ =
- ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
- *pucRegBuffer++ =
- ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
- iRegIndex++;
- usNRegs--;
- }
- }
- else
- {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- eMBErrorCode
- eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
- eMBRegisterMode eMode )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- if((usAddress>=REG_HOLDING_START) && (usAddress+usNRegs<=REG_HOLDING_START+REG_HOLDING_NREGS) )
- {
- iRegIndex = ( int )( usAddress - usRegHoldingStart );
- switch ( eMode )
- {
- case MB_REG_READ:
- while( usNRegs > 0 )
- {
- *pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] >> 8 );
- *pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] & 0xFF );
- iRegIndex++;
- usNRegs--;
- }
- break;
- case MB_REG_WRITE:
- while( usNRegs > 0 )
- {
- usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
- usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
- iRegIndex++;
- usNRegs--;
- }
- break;
- }
- }
- else
- {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- eMBErrorCode
- eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,eMBRegisterMode eMode )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iNCoils = ( int )usNCoils;
- unsigned short usBitOffset;
- if( ( usAddress >= REG_COILS_START ) &&( usAddress + usNCoils <= REG_COILS_START + REG_COILS_SIZE ) )
- {
- usBitOffset = ( unsigned short )( usAddress - REG_COILS_START );
- switch ( eMode )
- {
- /* Read current values and pass to protocol stack. */
- case MB_REG_READ:
- while( iNCoils > 0 )
- {
- *pucRegBuffer++ = xMBUtilGetBits( ucRegCoilsBuf, usBitOffset, ( unsigned char )( iNCoils > 8 ? 8 :iNCoils ) );
- iNCoils -= 8;
- usBitOffset += 8;
- }
- break;
- /* Update current register values. */
- case MB_REG_WRITE:
- while( iNCoils > 0 )
- {
- xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,( unsigned char )( iNCoils >8 ? 8 : iNCoils ), *pucRegBuffer++ );
- iNCoils -= 8;
- usBitOffset += 8;
- }
- break;
- }
-
- }
- else
- {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- eMBErrorCode
- eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- short iNDiscrete = ( short )usNDiscrete;
- unsigned short usBitOffset;
-
- /* Check if we have registers mapped at this block. */
- if( (usAddress >= REG_DISC_START) &&( usAddress + usNDiscrete<= REG_DISC_START + REG_DISC_SIZE ))
- {
- usBitOffset = (unsigned short)( usAddress - REG_DISC_START );
- while( iNDiscrete > 0 )
- {
- *pucRegBuffer++ =xMBUtilGetBits(ucRegDiscBuf, usBitOffset, (unsigned char)( iNDiscrete >8?8: iNDiscrete ) );
- iNDiscrete -= 8;
- usBitOffset+=8;
- }
- }
- else
- {
- eStatus = MB_ENOREG;//illegal register address
- }
- return eStatus;
- }
复制代码
|
 共1人点赞
|