mb.h
上传用户:kongshuqi
上传日期:2013-10-09
资源大小:59k
文件大小:17k
源码类别:

通讯编程

开发平台:

Visual C++

  1.  /*
  2.   * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU.
  3.   * Copyright (C) 2006 Christian Walter <wolti@sil.at>
  4.   *
  5.   * This library is free software; you can redistribute it and/or
  6.   * modify it under the terms of the GNU Lesser General Public
  7.   * License as published by the Free Software Foundation; either
  8.   * version 2.1 of the License, or (at your option) any later version.
  9.   *
  10.   * This library is distributed in the hope that it will be useful,
  11.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.   * Lesser General Public License for more details.
  14.   *
  15.   * You should have received a copy of the GNU Lesser General Public
  16.   * License along with this library; if not, write to the Free Software
  17.   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.   *
  19.   * File: $Id: mb.h,v 1.13 2006/06/25 00:03:09 wolti Exp $
  20.   */
  21. #ifndef _MB_H
  22. #define _MB_H
  23. #include "port.h"
  24. #ifdef __cplusplus
  25. PR_BEGIN_EXTERN_C
  26. #endif
  27. #include "mbport.h"
  28. /*! defgroup modbus Modbus
  29.  * code #include "mb.h" endcode
  30.  *
  31.  * This module defines the interface for the application. It contains
  32.  * the basic functions and types required to use the Modbus protocol stack.
  33.  * A typical application will want to call eMBInit() first. If the device
  34.  * is ready to answer network requests it must then call eMBEnable() to activate
  35.  * the protocol stack. In the main loop the function eMBPoll() must be called
  36.  * periodically. The time interval between pooling depends on the configured
  37.  * Modbus timeout. If an RTOS is available a separate task should be created
  38.  * and the task should always call the function eMBPoll().
  39.  *
  40.  * code
  41.  * // Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A
  42.  * eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN );
  43.  * // Enable the Modbus Protocol Stack.
  44.  * eMBEnable(  );
  45.  * for( ;; )
  46.  * {
  47.  *     // Call the main polling loop of the Modbus protocol stack.
  48.  *     eMBPoll(  );
  49.  *     ...
  50.  * }
  51.  * endcode
  52.  */
  53. /* ----------------------- Defines ------------------------------------------*/
  54. /*! ingroup modbus
  55.  * brief Use the default Modbus TCP port (502)
  56.  */
  57. #define MB_TCP_PORT_USE_DEFAULT 0   
  58. /* ----------------------- Type definitions ---------------------------------*/
  59. /*! ingroup modbus
  60.  * brief Modbus serial transmission modes (RTU/ASCII).
  61.  *
  62.  * Modbus serial supports two transmission modes. Either ASCII or RTU. RTU
  63.  * is faster but has more hardware requirements and requires a network with
  64.  * a low jitter. ASCII is slower and more reliable on slower links (E.g. modems)
  65.  */
  66.     typedef enum
  67. {
  68.     MB_RTU,                     /*!< RTU transmission mode. */
  69.     MB_ASCII,                   /*!< ASCII transmission mode. */
  70.     MB_TCP                      /*!< TCP mode. */
  71. } eMBMode;
  72. /*! ingroup modbus
  73.  * brief If register should be written or read.
  74.  *
  75.  * This value is passed to the callback functions which support either
  76.  * reading or writing register values. Writing means that the application
  77.  * registers should be updated and reading means that the modbus protocol
  78.  * stack needs to know the current register values.
  79.  *
  80.  * see eMBRegHoldingCB( ), eMBRegCoilsCB( ), eMBRegDiscreteCB( ) and 
  81.  *   eMBRegInputCB( ).
  82.  */
  83. typedef enum
  84. {
  85.     MB_REG_READ,                /*!< Read register values and pass to protocol stack. */
  86.     MB_REG_WRITE                /*!< Update register values. */
  87. } eMBRegisterMode;
  88. /*! ingroup modbus
  89.  * brief Errorcodes used by all function in the protocol stack.
  90.  */
  91. typedef enum
  92. {
  93.     MB_ENOERR,                  /*!< no error. */
  94.     MB_ENOREG,                  /*!< illegal register address. */
  95.     MB_EINVAL,                  /*!< illegal argument. */
  96.     MB_EPORTERR,                /*!< porting layer error. */
  97.     MB_ENORES,                  /*!< insufficient resources. */
  98.     MB_EIO,                     /*!< I/O error. */
  99.     MB_EILLSTATE,               /*!< protocol stack in illegal state. */
  100.     MB_ETIMEDOUT                /*!< timeout error occurred. */
  101. } eMBErrorCode;
  102. /* ----------------------- Function prototypes ------------------------------*/
  103. /*! ingroup modbus
  104.  * brief Initialize the Modbus protocol stack.
  105.  *
  106.  * This functions initializes the ASCII or RTU module and calls the
  107.  * init functions of the porting layer to prepare the hardware. Please
  108.  * note that the receiver is still disabled and no Modbus frames are
  109.  * processed until eMBEnable( ) has been called.
  110.  *
  111.  * param eMode If ASCII or RTU mode should be used.
  112.  * param ucSlaveAddress The slave address. Only frames sent to this
  113.  *   address or to the broadcast address are processed.
  114.  * param ucPort The port to use. E.g. 1 for COM1 on windows. This value
  115.  *   is platform dependent and some ports simply choose to ignore it.
  116.  * param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend
  117.  *   on the porting layer.
  118.  * param eParity Parity used for serial transmission.
  119.  *
  120.  * return If no error occurs the function returns eMBErrorCode::MB_ENOERR.
  121.  *   The protocol is then in the disabled state and ready for activation
  122.  *   by calling eMBEnable( ). Otherwise one of the following error codes 
  123.  *   is returned:
  124.  *    - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid
  125.  *        slave addresses are in the range 1 - 247.
  126.  *    - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error.
  127.  */
  128. eMBErrorCode    eMBInit( eMBMode eMode, UCHAR ucSlaveAddress,
  129.                          UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity );
  130. /*! ingroup modbus
  131.  * brief Initialize the Modbus protocol stack for Modbus TCP.
  132.  *
  133.  * This function initializes the Modbus TCP Module. Please note that
  134.  * frame processing is still disabled until eMBEnable( ) is called.
  135.  *
  136.  * param usTCPPort The TCP port to listen on.
  137.  * return If the protocol stack has been initialized correctly the function
  138.  *   returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error
  139.  *   codes is returned:
  140.  *    - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid
  141.  *        slave addresses are in the range 1 - 247.
  142.  *    - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error.
  143.  */
  144. eMBErrorCode    eMBTCPInit( USHORT usTCPPort );
  145. /*! ingroup modbus
  146.  * brief Release resources used by the protocol stack.
  147.  *
  148.  * This function disables the Modbus protocol stack and release all
  149.  * hardware resources. It must only be called when the protocol stack 
  150.  * is disabled. 
  151.  *
  152.  * note Note all ports implement this function. A port which wants to 
  153.  *   get an callback must define the macro MB_PORT_HAS_CLOSE to 1.
  154.  *
  155.  * return If the resources where released it return eMBErrorCode::MB_ENOERR.
  156.  *   If the protocol stack is not in the disabled state it returns
  157.  *   eMBErrorCode::MB_EILLSTATE.
  158.  */
  159. eMBErrorCode    eMBClose( void );
  160. /*! ingroup modbus
  161.  * brief Enable the Modbus protocol stack.
  162.  *
  163.  * This function enables processing of Modbus frames. Enabling the protocol
  164.  * stack is only possible if it is in the disabled state.
  165.  *
  166.  * return If the protocol stack is now in the state enabled it returns 
  167.  *   eMBErrorCode::MB_ENOERR. If it was not in the disabled state it 
  168.  *   return eMBErrorCode::MB_EILLSTATE.
  169.  */
  170. eMBErrorCode    eMBEnable( void );
  171. /*! ingroup modbus
  172.  * brief Disable the Modbus protocol stack.
  173.  *
  174.  * This function disables processing of Modbus frames.
  175.  *
  176.  * return If the protocol stack has been disabled it returns 
  177.  *  eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns
  178.  *  eMBErrorCode::MB_EILLSTATE.
  179.  */
  180. eMBErrorCode    eMBDisable( void );
  181. /*! ingroup modbus
  182.  * brief The main pooling loop of the Modbus protocol stack.
  183.  *
  184.  * This function must be called periodically. The timer interval required
  185.  * is given by the application dependent Modbus slave timeout. Internally the
  186.  * function calls xMBPortEventGet() and waits for an event from the receiver or
  187.  * transmitter state machines. 
  188.  *
  189.  * return If the protocol stack is not in the enabled state the function
  190.  *   returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns 
  191.  *   eMBErrorCode::MB_ENOERR.
  192.  */
  193. eMBErrorCode    eMBPoll( void );
  194. /*! ingroup modbus
  195.  * brief Configure the slave id of the device.
  196.  *
  197.  * This function should be called when the Modbus function <em>Report Slave ID</em>
  198.  * is enabled ( By defining MB_FUNC_OTHER_REP_SLAVEID_ENABLED in mbconfig.h ).
  199.  *
  200.  * param ucSlaveID Values is returned in the <em>Slave ID</em> byte of the
  201.  *   <em>Report Slave ID</em> response.
  202.  * param xIsRunning If TRUE the <em>Run Indicator Status</em> byte is set to 0xFF.
  203.  *   otherwise the <em>Run Indicator Status</em> is 0x00.
  204.  * param pucAdditional Values which should be returned in the <em>Additional</em>
  205.  *   bytes of the <em> Report Slave ID</em> response.
  206.  * param usAdditionalLen Length of the buffer <code>pucAdditonal</code>.
  207.  *
  208.  * return If the static buffer defined by MB_FUNC_OTHER_REP_SLAVEID_BUF in
  209.  *   mbconfig.h is to small it returns eMBErrorCode::MB_ENORES. Otherwise
  210.  *   it returns eMBErrorCode::MB_ENOERR.
  211.  */
  212. eMBErrorCode    eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning,
  213.                                UCHAR const *pucAdditional,
  214.                                USHORT usAdditionalLen );
  215. /* ----------------------- Callback -----------------------------------------*/
  216. /*! defgroup modbus_registers Modbus Registers
  217.  * code #include "mb.h" endcode
  218.  * The protocol stack does not internally allocate any memory for the
  219.  * registers. This makes the protocol stack very small and also usable on
  220.  * low end targets. In addition the values don't have to be in the memory
  221.  * and could for example be stored in a flash.<br>
  222.  * Whenever the protocol stack requires a value it calls one of the callback
  223.  * function with the register address and the number of registers to read
  224.  * as an argument. The application should then read the actual register values
  225.  * (for example the ADC voltage) and should store the result in the supplied
  226.  * buffer.<br>
  227.  * If the protocol stack wants to update a register value because a write
  228.  * register function was received a buffer with the new register values is
  229.  * passed to the callback function. The function should then use these values
  230.  * to update the application register values.
  231.  */
  232. /*! ingroup modbus_registers
  233.  * brief Callback function used if the value of a <em>Input Register</em>
  234.  *   is required by the protocol stack. The starting register address is given
  235.  *   by c usAddress and the last register is given by <tt>usAddress +
  236.  *   usNRegs - 1</tt>.
  237.  *
  238.  * param pucRegBuffer A buffer where the callback function should write
  239.  *   the current value of the modbus registers to.
  240.  * param usAddress The starting address of the register. Input registers
  241.  *   are in the range 1 - 65535.
  242.  * param usNRegs Number of registers the callback function must supply.
  243.  *
  244.  * return The function must return one of the following error codes:
  245.  *   - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal
  246.  *       Modbus response is sent.
  247.  *   - eMBErrorCode::MB_ENOREG If the application can not supply values
  248.  *       for registers within this range. In this case a 
  249.  *       <b>ILLEGAL DATA ADDRESS</b> exception frame is sent as a response.
  250.  *   - eMBErrorCode::MB_ETIMEDOUT If the requested register block is
  251.  *       currently not available and the application dependent response
  252.  *       timeout would be violated. In this case a <b>SLAVE DEVICE BUSY</b>
  253.  *       exception is sent as a response.
  254.  *   - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case
  255.  *       a <b>SLAVE DEVICE FAILURE</b> exception is sent as a response.
  256.  */
  257. eMBErrorCode    eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress,
  258.                                USHORT usNRegs );
  259. /*! ingroup modbus_registers
  260.  * brief Callback function used if a <em>Holding Register</em> value is
  261.  *   read or written by the protocol stack. The starting register address
  262.  *   is given by c usAddress and the last register is given by
  263.  *   <tt>usAddress + usNRegs - 1</tt>.
  264.  *
  265.  * param pucRegBuffer If the application registers values should be updated the
  266.  *   buffer points to the new registers values. If the protocol stack needs
  267.  *   to now the current values the callback function should write them into
  268.  *   this buffer.
  269.  * param usAddress The starting address of the register.
  270.  * param usNRegs Number of registers to read or write.
  271.  * param eMode If eMBRegisterMode::MB_REG_WRITE the application register 
  272.  *   values should be updated from the values in the buffer. For example
  273.  *   this would be the case when the Modbus master has issued an 
  274.  *   <b>WRITE SINGLE REGISTER</b> command.
  275.  *   If the value eMBRegisterMode::MB_REG_READ the application should copy 
  276.  *   the current values into the buffer c pucRegBuffer.
  277.  *
  278.  * return The function must return one of the following error codes:
  279.  *   - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal
  280.  *       Modbus response is sent.
  281.  *   - eMBErrorCode::MB_ENOREG If the application can not supply values
  282.  *       for registers within this range. In this case a 
  283.  *       <b>ILLEGAL DATA ADDRESS</b> exception frame is sent as a response.
  284.  *   - eMBErrorCode::MB_ETIMEDOUT If the requested register block is
  285.  *       currently not available and the application dependent response
  286.  *       timeout would be violated. In this case a <b>SLAVE DEVICE BUSY</b>
  287.  *       exception is sent as a response.
  288.  *   - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case
  289.  *       a <b>SLAVE DEVICE FAILURE</b> exception is sent as a response.
  290.  */
  291. eMBErrorCode    eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress,
  292.                                  USHORT usNRegs, eMBRegisterMode eMode );
  293. /*! ingroup modbus_registers
  294.  * brief Callback function used if a <em>Coil Register</em> value is
  295.  *   read or written by the protocol stack. If you are going to use
  296.  *   this function you might use the functions xMBUtilSetBits(  ) and
  297.  *   xMBUtilGetBits(  ) for working with bitfields.
  298.  *
  299.  * param pucRegBuffer The bits are packed in bytes where the first coil
  300.  *   starting at address c usAddress is stored in the LSB of the
  301.  *   first byte in the buffer <code>pucRegBuffer</code>.
  302.  *   If the buffer should be written by the callback function unused
  303.  *   coil values (I.e. if not a multiple of eight coils is used) should be set
  304.  *   to zero.
  305.  * param usAddress The first coil number.
  306.  * param usNCoils Number of coil values requested.
  307.  * param eMode If eMBRegisterMode::MB_REG_WRITE the application values should
  308.  *   be updated from the values supplied in the buffer c pucRegBuffer.
  309.  *   If eMBRegisterMode::MB_REG_READ the application should store the current
  310.  *   values in the buffer c pucRegBuffer.
  311.  *
  312.  * return The function must return one of the following error codes:
  313.  *   - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal
  314.  *       Modbus response is sent.
  315.  *   - eMBErrorCode::MB_ENOREG If the application does not map an coils
  316.  *       within the requested address range. In this case a 
  317.  *       <b>ILLEGAL DATA ADDRESS</b> is sent as a response.
  318.  *   - eMBErrorCode::MB_ETIMEDOUT If the requested register block is
  319.  *       currently not available and the application dependent response
  320.  *       timeout would be violated. In this case a <b>SLAVE DEVICE BUSY</b>
  321.  *       exception is sent as a response.
  322.  *   - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case
  323.  *       a <b>SLAVE DEVICE FAILURE</b> exception is sent as a response.
  324.  */
  325. eMBErrorCode    eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress,
  326.                                USHORT usNCoils, eMBRegisterMode eMode );
  327. /*! ingroup modbus_registers
  328.  * brief Callback function used if a <em>Input Discrete Register</em> value is
  329.  *   read by the protocol stack.
  330.  *
  331.  * If you are going to use his function you might use the functions
  332.  * xMBUtilSetBits(  ) and xMBUtilGetBits(  ) for working with bitfields.
  333.  *
  334.  * param pucRegBuffer The buffer should be updated with the current
  335.  *   coil values. The first discrete input starting at c usAddress must be
  336.  *   stored at the LSB of the first byte in the buffer. If the requested number
  337.  *   is not a multiple of eight the remaining bits should be set to zero.
  338.  * param usAddress The starting address of the first discrete input.
  339.  * param usNDiscrete Number of discrete input values.
  340.  * return The function must return one of the following error codes:
  341.  *   - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal
  342.  *       Modbus response is sent.
  343.  *   - eMBErrorCode::MB_ENOREG If no such discrete inputs exists.
  344.  *       In this case a <b>ILLEGAL DATA ADDRESS</b> exception frame is sent 
  345.  *       as a response.
  346.  *   - eMBErrorCode::MB_ETIMEDOUT If the requested register block is
  347.  *       currently not available and the application dependent response
  348.  *       timeout would be violated. In this case a <b>SLAVE DEVICE BUSY</b>
  349.  *       exception is sent as a response.
  350.  *   - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case
  351.  *       a <b>SLAVE DEVICE FAILURE</b> exception is sent as a response.
  352.  */
  353. eMBErrorCode    eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress,
  354.                                   USHORT usNDiscrete );
  355. #ifdef __cplusplus
  356. PR_END_EXTERN_C
  357. #endif
  358. #endif