123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- ///*
- // * FreeModbus Libary: user callback functions and buffer define in slave mode
- // * Copyright (C) 2013 Armink <armink.ztl@gmail.com>
- // *
- // * This library is free software; you can redistribute it and/or
- // * modify it under the terms of the GNU Lesser General Public
- // * License as published by the Free Software Foundation; either
- // * version 2.1 of the License, or (at your option) any later version.
- // *
- // * This library is distributed in the hope that it will be useful,
- // * but WITHOUT ANY WARRANTY; without even the implied warranty of
- // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- // * Lesser General Public License for more details.
- // *
- // * You should have received a copy of the GNU Lesser General Public
- // * License along with this library; if not, write to the Free Software
- // * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- // *
- // * File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $
- // */
- //#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] ;
- //
- ///**
- // * Modbus slave input register callback function.
- // *
- // * @param pucRegBuffer input register buffer
- // * @param usAddress input register address
- // * @param usNRegs input register number
- // *
- // * @return result
- // */
- //eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
- //{
- // eMBErrorCode eStatus = MB_ENOERR;
- //// USHORT iRegIndex;
- //// USHORT * pusRegInputBuf;
- //// USHORT REG_INPUT_START;
- //// USHORT REG_INPUT_NREGS;
- //// USHORT usRegInStart;
- ////
- //// pusRegInputBuf = usSRegInBuf;
- //// REG_INPUT_START = S_REG_INPUT_START;
- //// REG_INPUT_NREGS = S_REG_INPUT_NREGS;
- //// usRegInStart = usSRegInStart;
- ////
- //// /* it already plus one in modbus function method. */
- //// usAddress--;
- ////
- //// if ((usAddress >= REG_INPUT_START)
- //// && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS))
- //// {
- //// iRegIndex = usAddress - usRegInStart;
- //// while (usNRegs > 0)
- //// {
- //// *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8);
- //// *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF);
- //// iRegIndex++;
- //// usNRegs--;
- //// }
- //// }
- //// else
- //// {
- //// eStatus = MB_ENOREG;
- //// }
- //
- // return eStatus;
- //}
- //
- ///**
- // * Modbus slave holding register callback function.
- // *
- // * @param pucRegBuffer holding register buffer
- // * @param usAddress holding register address
- // * @param usNRegs holding register number
- // * @param eMode read or write
- // *
- // * @return result
- // */
- //eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
- // USHORT usNRegs, eMBRegisterMode eMode)
- //{
- // eMBErrorCode eStatus = MB_ENOERR;
- // USHORT iRegIndex;
- // USHORT * pusRegHoldingBuf;
- // USHORT REG_HOLDING_START;
- // USHORT REG_HOLDING_NREGS;
- // USHORT usRegHoldStart;
- // pusRegHoldingBuf = usSRegHoldBuf;
- // REG_HOLDING_START = S_REG_HOLDING_START;
- // REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;
- // usRegHoldStart = usSRegHoldStart;
- //
- // /* it already plus one in modbus function method. */
- // usAddress--;
- //
- // if ((usAddress >= REG_HOLDING_START)
- // && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS))
- // {
- // iRegIndex = usAddress - usRegHoldStart;
- // switch (eMode)
- // {
- // /* read current register values from the protocol stack. */
- // case MB_REG_READ:
- // while (usNRegs > 0)
- // {
- // *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8);
- // *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF);
- // iRegIndex++;
- // usNRegs--;
- // }
- // break;
- //
- // /* write 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;
- //}
- //
- ///**
- // * Modbus slave coils callback function.
- // *
- // * @param pucRegBuffer coils buffer
- // * @param usAddress coils address
- // * @param usNCoils coils number
- // * @param eMode read or write
- // *
- // * @return result
- // */
- //eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress,
- // USHORT usNCoils, eMBRegisterMode eMode)
- //{
- // eMBErrorCode eStatus = MB_ENOERR;
- //// USHORT iRegIndex , iRegBitIndex , iNReg;
- //// UCHAR * pucCoilBuf;
- //// USHORT COIL_START;
- //// USHORT COIL_NCOILS;
- //// USHORT usCoilStart;
- //// iNReg = usNCoils / 8 + 1;
- ////
- //// pucCoilBuf = ucSCoilBuf;
- //// COIL_START = S_COIL_START;
- //// COIL_NCOILS = S_COIL_NCOILS;
- //// usCoilStart = usSCoilStart;
- ////
- //// /* it already plus one in modbus function method. */
- //// usAddress--;
- ////
- //// if( ( usAddress >= COIL_START ) &&
- //// ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) )
- //// {
- //// iRegIndex = (USHORT) (usAddress - usCoilStart) / 8;
- //// iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8;
- //// switch ( eMode )
- //// {
- //// /* read current coil values from the protocol stack. */
- //// case MB_REG_READ:
- //// while (iNReg > 0)
- //// {
- //// *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++],
- //// iRegBitIndex, 8);
- //// iNReg--;
- //// }
- //// pucRegBuffer--;
- //// /* last coils */
- //// usNCoils = usNCoils % 8;
- //// /* filling zero to high bit */
- //// *pucRegBuffer = *pucRegBuffer << (8 - usNCoils);
- //// *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils);
- //// break;
- ////
- //// /* write current coil values with new values from the protocol stack. */
- //// case MB_REG_WRITE:
- //// while (iNReg > 1)
- //// {
- //// xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8,
- //// *pucRegBuffer++);
- //// iNReg--;
- //// }
- //// /* last coils */
- //// usNCoils = usNCoils % 8;
- //// /* xMBUtilSetBits has bug when ucNBits is zero */
- //// if (usNCoils != 0)
- //// {
- //// xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils,
- //// *pucRegBuffer++);
- //// }
- //// break;
- //// }
- //// }
- //// else
- //// {
- //// eStatus = MB_ENOREG;
- //// }
- // return eStatus;
- //}
- //
- ///**
- // * Modbus slave discrete callback function.
- // *
- // * @param pucRegBuffer discrete buffer
- // * @param usAddress discrete address
- // * @param usNDiscrete discrete number
- // *
- // * @return result
- // */
- //eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
- //{
- // eMBErrorCode eStatus = MB_ENOERR;
- //// USHORT iRegIndex , iRegBitIndex , iNReg;
- //// UCHAR * pucDiscreteInputBuf;
- //// USHORT DISCRETE_INPUT_START;
- //// USHORT DISCRETE_INPUT_NDISCRETES;
- //// USHORT usDiscreteInputStart;
- //// iNReg = usNDiscrete / 8 + 1;
- ////
- //// pucDiscreteInputBuf = ucSDiscInBuf;
- //// DISCRETE_INPUT_START = S_DISCRETE_INPUT_START;
- //// DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES;
- //// usDiscreteInputStart = usSDiscInStart;
- ////
- //// /* it already plus one in modbus function method. */
- //// usAddress--;
- ////
- //// if ((usAddress >= DISCRETE_INPUT_START)
- //// && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES))
- //// {
- //// iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8;
- //// iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8;
- ////
- //// while (iNReg > 0)
- //// {
- //// *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++],
- //// iRegBitIndex, 8);
- //// iNReg--;
- //// }
- //// pucRegBuffer--;
- //// /* last discrete */
- //// usNDiscrete = usNDiscrete % 8;
- //// /* filling zero to high bit */
- //// *pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete);
- //// *pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete);
- //// }
- //// else
- //// {
- //// eStatus = MB_ENOREG;
- //// }
- //
- // return eStatus;
- //}
- //
|