123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- * File : mbmaster.c
- * This file is part of freemodbus in RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2010-04-04 yi.qiu first version
- */
-
- /* ----------------------- Platform includes --------------------------------*/
- #include "rtthread.h"
- #include "port.h"
- /* ----------------------- Modbus includes ----------------------------------*/
- #include "mb.h"
- #include "mbconfig.h"
- #include "mbframe.h"
- #include "mbproto.h"
- #include "mbfunc.h"
- eMBErrorCode eMBMReadHoldingRegisters (UCHAR ucSlaveAddress, USHORT usRegStartAddress,
- UBYTE ubNRegs, UBYTE arusBufferOut[])
- {
- static UCHAR ucMBFrame[5];
- eMBErrorCode eStatus = MB_ENOERR;
- eMBEventType eEvent;
- static UCHAR ucRcvAddress;
- static USHORT usLength;
- UCHAR *ucRcvFrame;
- /* make up request frame */
- ucMBFrame[0] = MB_FUNC_READ_HOLDING_REGISTER;
- ucMBFrame[1] = (UCHAR)(usRegStartAddress >> 8);
- ucMBFrame[2] = (UCHAR)(usRegStartAddress);
- ucMBFrame[3] = (UCHAR)(ubNRegs >> 8);
- ucMBFrame[4] = (UCHAR)(ubNRegs);
-
- /* send request frame to slave device */
- eStatus = eMBRTUSend( ucSlaveAddress, ucMBFrame, 5 );
- /* wait on receive event */
- if( xMBPortEventGet( &eEvent ) == TRUE )
- {
- eStatus = eMBRTUReceive( &ucRcvAddress, &ucRcvFrame, &usLength );
- if( eStatus == MB_ENOERR )
- {
- /* Check if the frame is for us. If not ignore the frame. */
- if( ( ucRcvAddress == ucSlaveAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) )
- {
- RT_ASSERT(ucRcvFrame[0] == MB_FUNC_READ_HOLDING_REGISTER);
- RT_ASSERT(ucRcvFrame[1] == 2*ubNRegs)
- rt_memcpy((UCHAR *)arusBufferOut, &ucRcvFrame[2], 2*ubNRegs);
- }
- }
- }
- else eStatus = MB_ETIMEDOUT;
- return eStatus;
- }
- /*! @fn eMBErrorCode eMBMReadCoils (UCHAR ucSlaveAddress, USHORT usCoilStartAddress,
- UBYTE ubNCoils, USHORT arusBufferOut[])
- ** @brief request coils
- ** @details
- ** @param ucSlaveAddress slave station address :from 1 to 247(max)
- ** @param usCoilStartAddress coils address
- ** @param ubNCoils request coils number
- ** @param arusBufferOut response packet buf
- ** @return eMBErrorCode
- ** @author LiJin
- ** @date 2010-04-07
- ** @note
- */
- eMBErrorCode eMBMReadCoils (UCHAR ucSlaveAddress, USHORT usCoilStartAddress,
- UBYTE ubNCoils, UBYTE arusBufferOut[])
- {
- static UCHAR ucMBFrame[5];
- eMBErrorCode eStatus = MB_ENOERR;
- eMBEventType eEvent;
- static UCHAR ucRcvAddress;
- static USHORT usLength;
- UCHAR *ucRcvFrame;
- /* make up request frame */
- ucMBFrame[0] = MB_FUNC_READ_COILS;
- ucMBFrame[1] = (UCHAR)(usCoilStartAddress >> 8);
- ucMBFrame[2] = (UCHAR)(usCoilStartAddress);
- ucMBFrame[3] = (UCHAR)(ubNCoils >> 8);
- ucMBFrame[4] = (UCHAR)(ubNCoils);
- /* send request frame to slave device */
- eStatus = eMBRTUSend( ucSlaveAddress, ucMBFrame, 5 );
- /* wait on receive event */
- if( xMBPortEventGet( &eEvent ) == TRUE )
- {
- eStatus = eMBRTUReceive( &ucRcvAddress, &ucRcvFrame, &usLength );
- if( eStatus == MB_ENOERR )
- {
- /* Check if the frame is for us. If not ignore the frame. */
- if( ucRcvAddress == ucSlaveAddress )
- {
- RT_ASSERT(ucRcvFrame[0] == MB_FUNC_READ_COILS);
- rt_memcpy((UCHAR *)arusBufferOut, &ucRcvFrame[2], ucRcvFrame[1]);
- }
- }
- }
- else eStatus = MB_ETIMEDOUT;
- return eStatus;
- }
|