⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbtcp.c

📁 freemodbus-v1-1-1-0.zip v1.1.1版本的代码 支持多个平台
💻 C
字号:
 /*  * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU.  * Copyright (C) 2006 Christian Walter <wolti@sil.at>  *  * 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: mbtcp.c,v 1.2 2006/06/26 19:27:04 wolti Exp $  *//* ----------------------- System includes ----------------------------------*/#include "stdlib.h"#include "string.h"/* ----------------------- Platform includes --------------------------------*/#include "port.h"/* ----------------------- Modbus includes ----------------------------------*/#include "mb.h"#include "mbconfig.h"#include "mbtcp.h"#include "mbframe.h"#include "mbport.h"#if MB_TCP_ENABLED > 0/* ----------------------- Defines ------------------------------------------*//* ----------------------- MBAP Header --------------------------------------*//* * * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> *              <----------- MODBUS PDU (1') ----------------> *  +-----------+---------------+------------------------------------------+ *  | TID | PID | Length | UID  |Code | Data                               | *  +-----------+---------------+------------------------------------------+ *  |     |     |        |      |                                            * (2)   (3)   (4)      (5)    (6)                                           * * (2)  ... MB_TCP_TID          = 0 (Transaction Identifier - 2 Byte)  * (3)  ... MB_TCP_PID          = 2 (Protocol Identifier - 2 Byte) * (4)  ... MB_TCP_LEN          = 4 (Number of bytes - 2 Byte) * (5)  ... MB_TCP_UID          = 6 (Unit Identifier - 1 Byte) * (6)  ... MB_TCP_FUNC         = 7 (Modbus Function Code) * * (1)  ... Modbus TCP/IP Application Data Unit * (1') ... Modbus Protocol Data Unit */#define MB_TCP_TID          0#define MB_TCP_PID          2#define MB_TCP_LEN          4#define MB_TCP_UID          6#define MB_TCP_FUNC         7#define MB_TCP_PROTOCOL_ID  0   /* 0 = Modbus Protocol *//* ----------------------- Start implementation -----------------------------*/eMBErrorCodeeMBTCPDoInit( USHORT ucTCPPort ){    eMBErrorCode    eStatus = MB_ENOERR;    if( xMBTCPPortInit( ucTCPPort ) == FALSE )    {        eStatus = MB_EPORTERR;    }    return eStatus;}voideMBTCPStart( void ){}voideMBTCPStop( void ){    /* Make sure that no more clients are connected. */    vMBTCPPortDisable( );}eMBErrorCodeeMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ){    eMBErrorCode    eStatus = MB_EIO;    UCHAR          *pucMBTCPFrame;    USHORT          usLength;    USHORT          usPID;    if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE )    {        usPID = pucMBTCPFrame[MB_TCP_PID] << 8U;        usPID |= pucMBTCPFrame[MB_TCP_PID + 1];        if( usPID == MB_TCP_PROTOCOL_ID )        {            *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC];            *pusLength = usLength - MB_TCP_FUNC;            eStatus = MB_ENOERR;            /* Modbus TCP does not use any addresses. Fake the source address such             * that the processing part deals with this frame.             */            *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS;        }    }    else    {        eStatus = MB_EIO;    }    return eStatus;}eMBErrorCodeeMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength ){    eMBErrorCode    eStatus = MB_ENOERR;    UCHAR          *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC;    USHORT          usTCPLength = usLength + MB_TCP_FUNC;    /* The MBAP header is already initialized because the caller calls this     * function with the buffer returned by the previous call. Therefore we      * only have to update the length in the header. Note that the length      * header includes the size of the Modbus PDU and the UID Byte. Therefore      * the length is usLength plus one.     */    pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U;    pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF;    if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE )    {        eStatus = MB_EIO;    }    return eStatus;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -