![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Aplikacijski kod
Dependencies: mbed
U prikazanom primjeru izvedena je remote ModBus TCP/IP komunikacija. Generalni opis konfiguracije: U ovom radu je korištena oprema prizvođača Mikortik te mikrokontroler mbed NXP LPC1768. Libery za ethernet odnosno Modbus TCP/IP sam skino sam stranice mbeda te sam ga modificirao kako bi odgovarao željenoj aplikaciji. (https://os.mbed.com/users/paleskyjp/code/ModbusTCP_Modified/) Preko mrežne opreme izeveo sam SSTP VPN koji spaja lokalne subnete iz uređaja "mbed LOCAL" i uređaja "mbed LAPTOP" u jedan jedinstveni te omogućava nesmetanu komunikaciju između uređaja povezanih u lokalnim subnetima. Moguće se također spojiti direktno preko ethernet kabela u uređaj, ali u ovom primjeru laptop je spojen na WIFI mrežu nazvanzu "MBED TVZ" te preko nje komunicira sa mikrokontrolerom koji je kabelom spojem u mrežni uređaj naziva "mbed LOCAL". Riječ remote u ovom primjeru pokazuje da su dva uređaja "mbed LOCAL" i "mbed LAPTOP" preko WIFI-ja spojeni na 2 različita hosta (mobiteli pored njih) te je otvoren VPN kanal između njih. Na uređajima je također podešen DHCP koji dodijeljuje adrese uređajima koji se pokušavaju spojiti na njih, tako i mikrokontroleru. Lokalni subnet nije pušten na internet te mbed nije direktno izložen internetu, što pridonosi sigurnosnom aspektu komunikacije. Za tesitranje komunikacije dovoljno je koristit osnovne alate koji dolaze sa svakim windows-ima, naredba ping (na videu doljnji desni dio ekrana, dok je mbed bio ugašen vidljivo je da ne prolazi komunikacija, nakon što se upalio i spojio na mrežu komunikacija se uspostavila te je vidljivo kako konstantno vraća odgovor) Alat korišten za upis podataka u registre je Modbus Master koji podržava TCP/IP. Svakako je moguće koristiti i druge aplikacije ili druge uređaje koji podržavaju ovaj tip komunikacije. Primjerice PLC, drugi mbed, neko drugo računalo,... Aplikacija sama po sebi nije nešto pretjerano komplicirana ali put samog paketa od Modbus master-a do samog Modbus slave-a nije tako jednostavan. Aplikacija se odnosi na dio ukoliko na nulti registar bilo koje adresnog polja Modbus master pošalje vrijednost veću od 5 konstantno svijetli LED2 izvedena na samoj ploćici mbeda, te ukoliko dođe vrijednos manja od 5 da ugasi LED2. To je samo demostracija rada komunikacije. U ovoj konfiguraciji moguće je bilo gdje odnjeti mikortik i mbed te ga spojiti na WIFI koji ima propust prema internetu te se sa drugim mikrotikom povezati sa mbed-om i nesmetano komunicirati.
ModBus/portother.cpp
- Committer:
- paleskyjp
- Date:
- 2012-03-13
- Revision:
- 0:62be54b8975d
- Child:
- 4:97b3bd92b315
File content as of revision 0:62be54b8975d:
/* * FreeModbus Libary: lwIP Port * 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: portother.c,v 1.1 2006/08/30 23:18:07 wolti Exp $ */ /* ----------------------- System includes ----------------------------------*/ //#include <sys/types.h> //#include <sys/stat.h> //#include <unistd.h> #include <stdio.h> #include <stdarg.h> #include <string.h> #include "port.h" /* ----------------------- Defines ------------------------------------------*/ #define MB_FRAME_LOG_BUFSIZE 512 /* ----------------------- Start implementation -----------------------------*/ #ifdef MB_TCP_DEBUG void prvvMBTCPLogFrame( const CHAR * pucMsg, UCHAR * pucFrame, USHORT usFrameLen ) { int i; int res; int iBufPos = 0; size_t iBufLeft = MB_FRAME_LOG_BUFSIZE; static CHAR arcBuffer[MB_FRAME_LOG_BUFSIZE]; assert( pucFrame != NULL ); for( i = 0; i < usFrameLen; i++ ) { /* Print some additional frame information. */ switch ( i ) { case 0: /* TID = Transaction Identifier. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, "| TID = " ); break; case 2: /* PID = Protocol Identifier. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | PID = " ); break; case 4: /* Length */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | LEN = " ); break; case 6: /* UID = Unit Identifier. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | UID = " ); break; case 7: /* MB Function Code. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, "|| FUNC = " ); break; case 8: /* MB PDU rest. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | DATA = " ); break; default: res = 0; break; } if( res == -1 ) { break; } else { iBufPos += res; iBufLeft -= res; } /* Print the data. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, "%02X", pucFrame[i] ); if( res == -1 ) { break; } else { iBufPos += res; iBufLeft -= res; } } if( res != -1 ) { /* Append an end of frame string. */ res = snprintf( &arcBuffer[iBufPos], iBufLeft, " |\r\n" ); if( res != -1 ) { vMBPortLog( MB_LOG_DEBUG, pucMsg, "%s", arcBuffer ); } } } #endif #ifdef MB_TCP_DEBUG void vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, ... ) { va_list args; static const char *arszLevel2Str[] = { "ERROR", "WARN", "INFO", "DEBUG"}; ( void )printf( "%s: %s: ", arszLevel2Str[eLevel], szModule ); va_start( args, szFmt ); vprintf( szFmt, args ); va_end( args ); } #endif