📄 mbtcp.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 + -