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

通讯编程

开发平台:

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: mbtcp.c,v 1.2 2006/06/26 19:27:04 wolti Exp $
  20.   */
  21. /* ----------------------- System includes ----------------------------------*/
  22. #include "stdlib.h"
  23. #include "string.h"
  24. /* ----------------------- Platform includes --------------------------------*/
  25. #include "port.h"
  26. /* ----------------------- Modbus includes ----------------------------------*/
  27. #include "mb.h"
  28. #include "mbconfig.h"
  29. #include "mbtcp.h"
  30. #include "mbframe.h"
  31. #include "mbport.h"
  32. #if MB_TCP_ENABLED > 0
  33. /* ----------------------- Defines ------------------------------------------*/
  34. /* ----------------------- MBAP Header --------------------------------------*/
  35. /*
  36.  *
  37.  * <------------------------ MODBUS TCP/IP ADU(1) ------------------------->
  38.  *              <----------- MODBUS PDU (1') ---------------->
  39.  *  +-----------+---------------+------------------------------------------+
  40.  *  | TID | PID | Length | UID  |Code | Data                               |
  41.  *  +-----------+---------------+------------------------------------------+
  42.  *  |     |     |        |      |                                           
  43.  * (2)   (3)   (4)      (5)    (6)                                          
  44.  *
  45.  * (2)  ... MB_TCP_TID          = 0 (Transaction Identifier - 2 Byte) 
  46.  * (3)  ... MB_TCP_PID          = 2 (Protocol Identifier - 2 Byte)
  47.  * (4)  ... MB_TCP_LEN          = 4 (Number of bytes - 2 Byte)
  48.  * (5)  ... MB_TCP_UID          = 6 (Unit Identifier - 1 Byte)
  49.  * (6)  ... MB_TCP_FUNC         = 7 (Modbus Function Code)
  50.  *
  51.  * (1)  ... Modbus TCP/IP Application Data Unit
  52.  * (1') ... Modbus Protocol Data Unit
  53.  */
  54. #define MB_TCP_TID          0
  55. #define MB_TCP_PID          2
  56. #define MB_TCP_LEN          4
  57. #define MB_TCP_UID          6
  58. #define MB_TCP_FUNC         7
  59. #define MB_TCP_PROTOCOL_ID  0   /* 0 = Modbus Protocol */
  60. /* ----------------------- Start implementation -----------------------------*/
  61. eMBErrorCode
  62. eMBTCPDoInit( USHORT ucTCPPort )
  63. {
  64.     eMBErrorCode    eStatus = MB_ENOERR;
  65.     if( xMBTCPPortInit( ucTCPPort ) == FALSE )
  66.     {
  67.         eStatus = MB_EPORTERR;
  68.     }
  69.     return eStatus;
  70. }
  71. void
  72. eMBTCPStart( void )
  73. {
  74. }
  75. void
  76. eMBTCPStop( void )
  77. {
  78.     /* Make sure that no more clients are connected. */
  79.     vMBTCPPortDisable( );
  80. }
  81. eMBErrorCode
  82. eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength )
  83. {
  84.     eMBErrorCode    eStatus = MB_EIO;
  85.     UCHAR          *pucMBTCPFrame;
  86.     USHORT          usLength;
  87.     USHORT          usPID;
  88.     if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE )
  89.     {
  90.         usPID = pucMBTCPFrame[MB_TCP_PID] << 8U;
  91.         usPID |= pucMBTCPFrame[MB_TCP_PID + 1];
  92.         if( usPID == MB_TCP_PROTOCOL_ID )
  93.         {
  94.             *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC];
  95.             *pusLength = usLength - MB_TCP_FUNC;
  96.             eStatus = MB_ENOERR;
  97.             /* Modbus TCP does not use any addresses. Fake the source address such
  98.              * that the processing part deals with this frame.
  99.              */
  100.             *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS;
  101.         }
  102.     }
  103.     else
  104.     {
  105.         eStatus = MB_EIO;
  106.     }
  107.     return eStatus;
  108. }
  109. eMBErrorCode
  110. eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength )
  111. {
  112.     eMBErrorCode    eStatus = MB_ENOERR;
  113.     UCHAR          *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC;
  114.     USHORT          usTCPLength = usLength + MB_TCP_FUNC;
  115.     /* The MBAP header is already initialized because the caller calls this
  116.      * function with the buffer returned by the previous call. Therefore we 
  117.      * only have to update the length in the header. Note that the length 
  118.      * header includes the size of the Modbus PDU and the UID Byte. Therefore 
  119.      * the length is usLength plus one.
  120.      */
  121.     pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U;
  122.     pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF;
  123.     if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE )
  124.     {
  125.         eStatus = MB_EIO;
  126.     }
  127.     return eStatus;
  128. }
  129. #endif