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.

Committer:
lincina
Date:
Thu Nov 14 15:38:42 2019 +0000
Revision:
4:97b3bd92b315
Parent:
0:62be54b8975d
remote komunikacija

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paleskyjp 0:62be54b8975d 1 /*
paleskyjp 0:62be54b8975d 2 * FreeModbus Libary: lwIP Port
paleskyjp 0:62be54b8975d 3 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
paleskyjp 0:62be54b8975d 4 *
paleskyjp 0:62be54b8975d 5 * This library is free software; you can redistribute it and/or
paleskyjp 0:62be54b8975d 6 * modify it under the terms of the GNU Lesser General Public
paleskyjp 0:62be54b8975d 7 * License as published by the Free Software Foundation; either
paleskyjp 0:62be54b8975d 8 * version 2.1 of the License, or (at your option) any later version.
paleskyjp 0:62be54b8975d 9 *
paleskyjp 0:62be54b8975d 10 * This library is distributed in the hope that it will be useful,
paleskyjp 0:62be54b8975d 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
paleskyjp 0:62be54b8975d 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
paleskyjp 0:62be54b8975d 13 * Lesser General Public License for more details.
paleskyjp 0:62be54b8975d 14 *
paleskyjp 0:62be54b8975d 15 * You should have received a copy of the GNU Lesser General Public
paleskyjp 0:62be54b8975d 16 * License along with this library; if not, write to the Free Software
paleskyjp 0:62be54b8975d 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
paleskyjp 0:62be54b8975d 18 *
paleskyjp 0:62be54b8975d 19 * File: $Id: portother.c,v 1.1 2006/08/30 23:18:07 wolti Exp $
paleskyjp 0:62be54b8975d 20 */
paleskyjp 0:62be54b8975d 21
paleskyjp 0:62be54b8975d 22 /* ----------------------- System includes ----------------------------------*/
paleskyjp 0:62be54b8975d 23 //#include <sys/types.h>
paleskyjp 0:62be54b8975d 24 //#include <sys/stat.h>
paleskyjp 0:62be54b8975d 25 //#include <unistd.h>
paleskyjp 0:62be54b8975d 26 #include <stdio.h>
paleskyjp 0:62be54b8975d 27 #include <stdarg.h>
paleskyjp 0:62be54b8975d 28 #include <string.h>
paleskyjp 0:62be54b8975d 29
paleskyjp 0:62be54b8975d 30 #include "port.h"
lincina 4:97b3bd92b315 31 #include "mbed.h"
lincina 4:97b3bd92b315 32 DigitalOut led2(LED2);
paleskyjp 0:62be54b8975d 33
paleskyjp 0:62be54b8975d 34 /* ----------------------- Defines ------------------------------------------*/
paleskyjp 0:62be54b8975d 35 #define MB_FRAME_LOG_BUFSIZE 512
paleskyjp 0:62be54b8975d 36
paleskyjp 0:62be54b8975d 37 /* ----------------------- Start implementation -----------------------------*/
paleskyjp 0:62be54b8975d 38
paleskyjp 0:62be54b8975d 39 #ifdef MB_TCP_DEBUG
paleskyjp 0:62be54b8975d 40 void
paleskyjp 0:62be54b8975d 41 prvvMBTCPLogFrame( const CHAR * pucMsg, UCHAR * pucFrame, USHORT usFrameLen )
paleskyjp 0:62be54b8975d 42 {
paleskyjp 0:62be54b8975d 43 int i;
paleskyjp 0:62be54b8975d 44 int res;
paleskyjp 0:62be54b8975d 45 int iBufPos = 0;
paleskyjp 0:62be54b8975d 46 size_t iBufLeft = MB_FRAME_LOG_BUFSIZE;
paleskyjp 0:62be54b8975d 47 static CHAR arcBuffer[MB_FRAME_LOG_BUFSIZE];
paleskyjp 0:62be54b8975d 48
paleskyjp 0:62be54b8975d 49 assert( pucFrame != NULL );
paleskyjp 0:62be54b8975d 50
paleskyjp 0:62be54b8975d 51 for( i = 0; i < usFrameLen; i++ )
paleskyjp 0:62be54b8975d 52 {
paleskyjp 0:62be54b8975d 53 /* Print some additional frame information. */
paleskyjp 0:62be54b8975d 54 switch ( i )
paleskyjp 0:62be54b8975d 55 {
paleskyjp 0:62be54b8975d 56 case 0:
paleskyjp 0:62be54b8975d 57 /* TID = Transaction Identifier. */
paleskyjp 0:62be54b8975d 58 res = snprintf( &arcBuffer[iBufPos], iBufLeft, "| TID = " );
paleskyjp 0:62be54b8975d 59 break;
paleskyjp 0:62be54b8975d 60 case 2:
paleskyjp 0:62be54b8975d 61 /* PID = Protocol Identifier. */
paleskyjp 0:62be54b8975d 62 res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | PID = " );
paleskyjp 0:62be54b8975d 63 break;
paleskyjp 0:62be54b8975d 64 case 4:
paleskyjp 0:62be54b8975d 65 /* Length */
paleskyjp 0:62be54b8975d 66 res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | LEN = " );
paleskyjp 0:62be54b8975d 67 break;
paleskyjp 0:62be54b8975d 68 case 6:
paleskyjp 0:62be54b8975d 69 /* UID = Unit Identifier. */
paleskyjp 0:62be54b8975d 70 res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | UID = " );
paleskyjp 0:62be54b8975d 71 break;
paleskyjp 0:62be54b8975d 72 case 7:
paleskyjp 0:62be54b8975d 73 /* MB Function Code. */
paleskyjp 0:62be54b8975d 74 res = snprintf( &arcBuffer[iBufPos], iBufLeft, "|| FUNC = " );
paleskyjp 0:62be54b8975d 75 break;
paleskyjp 0:62be54b8975d 76 case 8:
paleskyjp 0:62be54b8975d 77 /* MB PDU rest. */
paleskyjp 0:62be54b8975d 78 res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | DATA = " );
lincina 4:97b3bd92b315 79 //res = snprintf (&arcBuffer[1],iBufLeft,"PIMpEK");
lincina 4:97b3bd92b315 80
paleskyjp 0:62be54b8975d 81 break;
paleskyjp 0:62be54b8975d 82 default:
paleskyjp 0:62be54b8975d 83 res = 0;
paleskyjp 0:62be54b8975d 84 break;
paleskyjp 0:62be54b8975d 85 }
paleskyjp 0:62be54b8975d 86 if( res == -1 )
paleskyjp 0:62be54b8975d 87 {
paleskyjp 0:62be54b8975d 88 break;
paleskyjp 0:62be54b8975d 89 }
paleskyjp 0:62be54b8975d 90 else
paleskyjp 0:62be54b8975d 91 {
paleskyjp 0:62be54b8975d 92 iBufPos += res;
paleskyjp 0:62be54b8975d 93 iBufLeft -= res;
paleskyjp 0:62be54b8975d 94 }
paleskyjp 0:62be54b8975d 95
paleskyjp 0:62be54b8975d 96 /* Print the data. */
paleskyjp 0:62be54b8975d 97 res = snprintf( &arcBuffer[iBufPos], iBufLeft, "%02X", pucFrame[i] );
lincina 4:97b3bd92b315 98 if (pucFrame[11]>5){led2=1;}
lincina 4:97b3bd92b315 99 else {led2=0;}
lincina 4:97b3bd92b315 100
paleskyjp 0:62be54b8975d 101 if( res == -1 )
paleskyjp 0:62be54b8975d 102 {
paleskyjp 0:62be54b8975d 103 break;
paleskyjp 0:62be54b8975d 104 }
paleskyjp 0:62be54b8975d 105 else
paleskyjp 0:62be54b8975d 106 {
paleskyjp 0:62be54b8975d 107 iBufPos += res;
paleskyjp 0:62be54b8975d 108 iBufLeft -= res;
paleskyjp 0:62be54b8975d 109 }
paleskyjp 0:62be54b8975d 110 }
paleskyjp 0:62be54b8975d 111
paleskyjp 0:62be54b8975d 112 if( res != -1 )
paleskyjp 0:62be54b8975d 113 {
paleskyjp 0:62be54b8975d 114 /* Append an end of frame string. */
paleskyjp 0:62be54b8975d 115 res = snprintf( &arcBuffer[iBufPos], iBufLeft, " |\r\n" );
paleskyjp 0:62be54b8975d 116 if( res != -1 )
paleskyjp 0:62be54b8975d 117 {
paleskyjp 0:62be54b8975d 118 vMBPortLog( MB_LOG_DEBUG, pucMsg, "%s", arcBuffer );
paleskyjp 0:62be54b8975d 119 }
paleskyjp 0:62be54b8975d 120 }
paleskyjp 0:62be54b8975d 121 }
paleskyjp 0:62be54b8975d 122 #endif
paleskyjp 0:62be54b8975d 123
paleskyjp 0:62be54b8975d 124 #ifdef MB_TCP_DEBUG
paleskyjp 0:62be54b8975d 125 void
paleskyjp 0:62be54b8975d 126 vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, ... )
paleskyjp 0:62be54b8975d 127 {
paleskyjp 0:62be54b8975d 128 va_list args;
paleskyjp 0:62be54b8975d 129 static const char *arszLevel2Str[] = { "ERROR", "WARN", "INFO", "DEBUG"};
paleskyjp 0:62be54b8975d 130
paleskyjp 0:62be54b8975d 131 ( void )printf( "%s: %s: ", arszLevel2Str[eLevel], szModule );
paleskyjp 0:62be54b8975d 132 va_start( args, szFmt );
paleskyjp 0:62be54b8975d 133 vprintf( szFmt, args );
paleskyjp 0:62be54b8975d 134 va_end( args );
paleskyjp 0:62be54b8975d 135 }
paleskyjp 0:62be54b8975d 136 #endif