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

📄 demo.c

📁 freemodbus-v1-1-1-0.zip v1.1.1版本的代码 支持多个平台
💻 C
字号:
/* * FreeModbus Libary: STR71XTCP Demo Application * Copyright (C) 2006 Christian Walter <wolti@sil.at> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * * File: $Id: demo.c,v 1.4 2006/09/13 21:19:46 wolti Exp $ *//* ----------------------- System includes ----------------------------------*/#include <stdio.h>/* ----------------------- lwIP includes ------------------------------------*/#include "lwip/opt.h"#include "lwip/sio.h"#include "lwip/sys.h"#include "lwip/inet.h"#include "ppp/ppp.h"#include "arch/cc.h"/* ----------------------- FreeRTOS includes --------------------------------*/#include "FreeRTOS.h"#include "task.h"#include "queue.h"/* ----------------------- Platform includes --------------------------------*/#include "eic.h"#include "netif/serial.h"/* ----------------------- Modbus includes ----------------------------------*/#include "mb.h"/* ----------------------- Defines ------------------------------------------*/#define mainMB_TASK_PRIORITY    ( tskIDLE_PRIORITY + 3 )#define REG_INPUT_START         1000#define REG_INPUT_NREGS         4#define REG_HOLDING_START       2000#define REG_HOLDING_NREGS       130#define PPP_AUTH_ENABLED        1#define PPP_USER                "freemodbus"#define PPP_PASS                "insecure"/* ----------------------- Type definitions ---------------------------------*/typedef enum{    CONNECTING, CONNECTED, DISCONNECT} ePPPThreadControl;/* ----------------------- Static variables ---------------------------------*/static USHORT   usRegInputStart = REG_INPUT_START;static USHORT   usRegInputBuf[REG_INPUT_NREGS];static USHORT   usRegHoldingStart = REG_HOLDING_START;static USHORT   usRegHoldingBuf[REG_HOLDING_NREGS];static ePPPThreadControl ePPPThrCtl;/* ----------------------- Static functions ---------------------------------*/static void     vlwIPInit( void );static void     vMBServerTask( void *arg );static void     vPPPStatusCB( void *ctx, int errCode, void *arg );sio_fd_t        stdio_fd;sio_fd_t        ppp_fd;/* ----------------------- Start implementation -----------------------------*/intmain( void ){    EIC_Init(  );    EIC_IRQConfig( ENABLE );    /* Use UART0 as stdin/stdout for debug purposes. */    if( ( stdio_fd = sio_open_new( 0, 115200, 8, SIO_STOP_1, SIO_PAR_NONE ) ) == SIO_FD_NULL )    {        /* nothing we can do here - no stdout means no logging. */    }    else    {        /* Initialize lwIP and its interface layer. */        vlwIPInit(  );        /* Use UART1 as PPP device. */        if( ( ppp_fd = sio_open_new( 1, 115200, 8, SIO_STOP_1, SIO_PAR_NONE ) ) == SIO_FD_NULL )        {            vMBPortLog( MB_LOG_ERROR, "PPP", "can't open PPP device!\r\n" );        }        else if( sys_thread_new( vMBServerTask, NULL, mainMB_TASK_PRIORITY ) == SYS_THREAD_NULL )        {            vMBPortLog( MB_LOG_ERROR, "MB-INIT", "can't start modbus task!\r\n" );        }        else        {            vMBPortLog( MB_LOG_INFO, "MB-INIT", "FreeModbus demo application starting...\r\n" );            /* Everything ready. Start the scheduler. */            vTaskStartScheduler(  );        }    }    for( ;; );}voidvlwIPInit( void ){    sys_init(  );    mem_init(  );    memp_init(  );    pbuf_init(  );    netif_init(  );    ip_init(  );    tcpip_init( NULL, NULL );}voidvMBServerTask( void *arg ){    eMBErrorCode    xStatus;    ePPPThreadControl ePPPThrCtlCur;    int             ppp_con_fd;    portTickType    xTicks;    pppInit(  );    if( PPP_AUTH_ENABLED )    {      pppSetAuth( PPPAUTHTYPE_PAP, PPP_USER, PPP_PASS );    }    else    {      pppSetAuth( PPPAUTHTYPE_NONE, NULL, NULL );    }    do    {        vPortEnterCritical(  );        ePPPThrCtl = CONNECTING;        vPortExitCritical(  );        if( ( ppp_con_fd = pppOpen( ppp_fd, vPPPStatusCB, NULL ) ) == PPPERR_NONE )        {            /* Check every 50ms if the state of the connecton has changed.             * This could either mean it was aborted or successful.             */            do            {                vTaskDelay( ( portTickType ) ( 50UL / portTICK_RATE_MS ) );                vPortEnterCritical(  );                ePPPThrCtlCur = ePPPThrCtl;                vPortExitCritical(  );            }            while( ePPPThrCtlCur == CONNECTING );            if( ePPPThrCtlCur == CONNECTED )            {                if( eMBTCPInit( MB_TCP_PORT_USE_DEFAULT ) != MB_ENOERR )                {                    vMBPortLog( MB_LOG_ERROR, "PPP", "can't initalize modbus stack!\r\n" );                }                else if( eMBEnable(  ) != MB_ENOERR )                {                    vMBPortLog( MB_LOG_ERROR, "PPP", "can't enable modbus stack!\r\n" );                }                else                {                    do                    {                        vPortEnterCritical(  );                        ePPPThrCtlCur = ePPPThrCtl;                        vPortExitCritical(  );                        /* Application code here. */                        xStatus = eMBPoll(  );                        /* Update input registers with the current system  tick. */                        xTicks = xTaskGetTickCount(  );                        /* Note: little endian stuff */                        usRegInputBuf[0] = ( USHORT ) ( xTicks );                        usRegInputBuf[1] = ( USHORT ) ( xTicks >> 16UL );                    }                    while( ( xStatus == MB_ENOERR ) && ( ePPPThrCtlCur == CONNECTED ) );                    ( void )eMBDisable(  );                    ( void )eMBClose(  );                }            }            /* FIXME: pppClose bugs because thread is not stopped. */            /* Connection has been closed. */            pppClose( ppp_con_fd );        }        /* Wait 1s until reopening the connection. */        vTaskDelay( ( portTickType ) ( 1000UL / portTICK_RATE_MS ) );    }    while( pdTRUE );}voidvPPPStatusCB( void *ctx, int err, void *arg ){    /* Imported from ipcp.c */    extern char    *_inet_ntoa( u32_t n );    ePPPThreadControl ePPPThrCtlNew;    struct ppp_addrs *ppp_addrs;    switch ( err )    {        /* No error. */    case PPPERR_NONE:        ePPPThrCtlNew = CONNECTED;        ppp_addrs = arg;        vMBPortLog( MB_LOG_INFO, "PPP", "new PPP connection established\r\n" );        vMBPortLog( MB_LOG_INFO, "PPP", "  our IP address = %s\r\n",                    _inet_ntoa( ppp_addrs->our_ipaddr.addr ) );        vMBPortLog( MB_LOG_INFO, "PPP", "  his IP address = %s\r\n",                    _inet_ntoa( ppp_addrs->his_ipaddr.addr ) );        vMBPortLog( MB_LOG_INFO, "PPP", "  netmask = %s\r\n",                    _inet_ntoa( ppp_addrs->netmask.addr ) );        break;    default:        ePPPThrCtlNew = DISCONNECT;        vMBPortLog( MB_LOG_ERROR, "PPP", "PPP connection died ( err = %d )\r\n", err );        break;    }    vPortEnterCritical(  );    ePPPThrCtl = ePPPThrCtlNew;    vPortExitCritical(  );}eMBErrorCodeeMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ){    eMBErrorCode    eStatus = MB_ENOERR;    int             iRegIndex;    if( ( usAddress >= REG_INPUT_START )        && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )    {        iRegIndex = ( int )( usAddress - usRegInputStart );        while( usNRegs > 0 )        {            *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );            *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );            iRegIndex++;            usNRegs--;        }    }    else    {        eStatus = MB_ENOREG;    }    return eStatus;}eMBErrorCodeeMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ){    eMBErrorCode    eStatus = MB_ENOERR;    int             iRegIndex;    if( ( usAddress >= REG_HOLDING_START ) &&        ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )    {        iRegIndex = ( int )( usAddress - usRegHoldingStart );        switch ( eMode )        {            /* Pass current register values to the protocol stack. */        case MB_REG_READ:            while( usNRegs > 0 )            {                *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] >> 8 );                *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] & 0xFF );                iRegIndex++;                usNRegs--;            }            break;            /* Update current register values with new values from the             * protocol stack. */        case MB_REG_WRITE:            while( usNRegs > 0 )            {                usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;                usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;                iRegIndex++;                usNRegs--;            }        }    }    else    {        eStatus = MB_ENOREG;    }    return eStatus;}eMBErrorCodeeMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ){    return MB_ENOREG;}eMBErrorCodeeMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ){    return MB_ENOREG;}

⌨️ 快捷键说明

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