Funzioni ed FB comunicazione multimaster (eMMasterDTxferLib) ------------------------------------------------------------ **Attenzione! Per utilizzare la libreria occorre importarla nel proprio progetto**. Vedere capitolo relativo all'\ `import delle librerie <#ChpLibraryImport>`__. Questa libreria rende disponibili una serie di funzioni e di blocchi funzione per la gestione della comunicazione multimaster su linea seriale. La possibilità di fare dialogare su una unica linea seriale RS422/485 più dispositivi master permette di velocizzare il dialogo tra i sistemi ottimizzando l'impegno della linea seriale. Questa particolarità è molto apprezzata nelle connessioni radio, dove radiomodems che sfruttano tutti la stessa frequenza possono dialogare tra di loro minimizzando l'impegno della banda ed aumentando i tempi di trasferimento delle informazioni. Nelle comunicazioni tra diversi sistemi su doppino seriale e/o con radiomodems tipicamente si utilizza un protocollo a pacchetto (Esempio modbus) ed uno dei sistemi che funge da master dialoga ciclicamente con tutti gli altri sistemi della rete scambiando le informazioni tra di loro. Come si può ben capire questa soluzione ha i seguenti difetti: a) Tutta la comunicazione è delegata al sistema master, nel caso di guasto di quest'ultimo tutta la rete è ferma. b) Il sistema master deve interrogare i vari sistemi slaves per conoscere se hanno dati da inviare al master od agli altri slaves. Questo implica un impegno del canale di comunicazione anche quando gli slaves non hanno informazioni utili da scambiare. c) Lo scambio dati tra due sistemi slaves deve passare dal sistema master e questo rallenta l'invio dei dati da un sistema all'altro oltre ad un maggiore impegno del canale di comunicazione. Utilizzando questa libreria è possibile fare dialogare i diversi sistemi direttamente tra di loro in modalità peer to peer. In questo modo un sistema invia dati all'altro solo quando è necessario garantendo un rapido invio dei dati con il minimo impegno del canale di comunicazione. **Comunicazione in broadcast** Nel caso in cui un dispositivo su di un nodo della rete sia in comunicazione con molti altri dispositivi ed i dati in scambio siano gli stessi per tutti i dispositivi è possibile utilizzare il blocco funzione **BroadcastDataSend** che invia il pacchetto dati in broadcast, tutti i dispositivi che hanno come nodo di destinazione **ToNode** nel blocco funzione **DataTxferClient** l'indirizzo del nodo che invia il messaggio in broacast lo riceveranno senza pero inviare l'acknowledge. Questo significa che la trasmissione in broadcast permette di velocizzare il trasferimento dati da un nodo ad altri nodi permettendo altresì la ricezione simultanea dei dati inviati su tutti i nodi. Ma non è certa l'avvenuta ricezione dei dati da parte dei nodi destinatari, quindi conviene fare seguire ad una trasmissione in broadcast anche una trasmissione peer to peer. Nella figura seguente è riportato uno scenario tipico di comunicazione multimaster via radiomodem. Il PLC nodo 0 scambia dati con i PLC nodo 1 e 2. Il PLC nodo 1 scambia i dati con i PLC nodo 0, 2 e 3. Il PLC nodo 2 scambia i dati con i PLC nodo 0, 1 e 3. Il PLC nodo 3 scambia i dati con i PLC nodo 1 e 2. Nel PLC nodo 0 è gestita anche la FB di invio in broadcast, attivando la trasmissione i dati saranno ricevuti solo dai PLC nodo 1 e 2 e non dal PLC nodo 3 perchè non ha attivo nessun scambio con il PLC del nodo che ha inviato il messaggio di broadcast. |image0| MMasterDataTxfer, multimaster data transfer ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eMMasterDTxferLib_C00 | | | 0 | +-----------------------+-----------------------+ |image1| Questo blocco funzione esegue l'interfaccia con il terminale di I/O definito in **File** per gestire la comunicazione multimaster su rete multidrop. Questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi `protezione funzioni e blocchi funzione <#ChpFctFBProtection>`__. E' comunque possibile utilizzarlo liberamente in modo test per 30 Min. Il blocco funzione agisce da server di comunicazione gestendo il dispositivo di I/O, verranno poi connessi dei blocchi funzione client che gestiscono lo scambio dati tra i sistemi. L'FB ritorna un **MMDtTxfID** che deve essere passato alle FB client (Esempio **DataTxferClient**). In **MyNode** occorre definire il numero di nodo del sistema, in una rete il numero di nodo deve essere univoco. Tutti i messaggi che hanno come nodo di destinazione il valore di **MyNode** saranno ricevuti dalla FB che li passerà alle FB clients per la verifica. La comunicazione multimaster si basa sul controllo del canale di comunicazione libero e sulla gestione delle collisioni, i parametri per questa gestione sono impostabili in **MinFreeTm** e **MaxFreeTm**. In questi parametri occorrerà definire tempi piccoli per comunicazioni su linea seriale e tempi più lunghi nel caso di comunicazione via radiomodem. In **MinChkTm** e **MaxChkTm** è possibile impostare un tempo per l'invio di un messaggio di controllo verso gli altri sistemi della rete. L'FB abiliterà a turno sequenzialmente le varie FB clients per uno scambio dati con il peer con cui l'FB dialoga controllando la connessione. **Se uno o entrambi i valori sono impostati a 0 il controllo non viene eseguito**. In **RxErrors** è ritornato il conteggio degli errori di ricezione, l'FB monitora continuamente il canale di comunicazione e se i dati ricevuti sono in errore viene incrementato il contatore. Errori possono manifestarsi in caso di collisioni sul canale di comunicazione. In caso di errore esecuzione viene attivata per un loop l'uscita **Fault**. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Comando di abilitazione blocco | | | funzione. | +-----------------------------------+-----------------------------------+ | **File** (FILEP) | Flusso dati stream ritornato | | | dalla funzione Sysfopen. | +-----------------------------------+-----------------------------------+ | **MyNode** (USINT) | Nodo identificativo del sistema | | | (Range da 0 a 250). | +-----------------------------------+-----------------------------------+ | **Timeout** (UDINT) | Tempo attesa frame di acknowledge | | | dal sistema peer (mS). | +-----------------------------------+-----------------------------------+ | **MinFreeTm** (REAL) | Tempo minimo attesa canale di | | | comunicazione libero (S). | +-----------------------------------+-----------------------------------+ | **MaxFreeTm** (REAL) | Tempo massimo attesa canale di | | | comunicazione libero (S). | +-----------------------------------+-----------------------------------+ | **MinChkTm** (REAL) | Tempo minimo attesa invio frame | | | controllo verso sistema peer (S). | +-----------------------------------+-----------------------------------+ | **MaxChkTm** (REAL) | Tempo massimo attesa invio frame | | | controllo verso sistema peer (S). | +-----------------------------------+-----------------------------------+ | **Enabled** (BOOL) | Attivo su abilitazione blocco | | | funzione. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop su errore | | | esecuzione. | +-----------------------------------+-----------------------------------+ | **MMDtTxfID** (UDINT) | ID server multimaster da passare | | | alle FB clients (Esempio | | | **DataTxferClient**). | +-----------------------------------+-----------------------------------+ | **RxFrames** (UDINT) | Counter frame dati ricevuti. Sono | | | conteggiati tutti i frames | | | corretti indipendentemente se | | | diretti a questo nodo. | +-----------------------------------+-----------------------------------+ | **TxFrames** (UDINT) | Counter frame dati trasmessi. | +-----------------------------------+-----------------------------------+ | **RxErrors** (UDINT) | Counter errori frame dati | | | ricevuti. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +----------+----------------------------------------------------------+ | 10040010 | Valore di **File** non definito. | +----------+----------------------------------------------------------+ | 10040020 | FB protetta, terminato tempo funzionamento in modo demo. | +----------+----------------------------------------------------------+ | 10040050 | Timeout esecuzione. | +----------+----------------------------------------------------------+ | 10040070 | Errore case gestione. | +----------+----------------------------------------------------------+ DataTxfer Client, Data transfer client ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eMMasterDTxferLib_C00 | | | 0 | +-----------------------+-----------------------+ |image2| Questo blocco funzione esegue lo scambio dati con un altro sistema su canale di comunicazione. Si collega al blocco funzione **MMasterDataTxfer** di gestione dispositivo di comunicazione, occorre passare **MMDtTxfID** in uscita dal blocco funzione server. Il blocco funzione scambia i dati con il sistema definito in **ToNode**. In pratica il valore di **ToNode** deve coincidere con il valore di **MyNode** della FB **MmasterDataTxfer** dell'altro sistema. In **RxData** ed in **TxData** occorre definire l'indirizzo del buffer dati che si vuole scambiare con il sistema peer. In **DLen** la dimensione in bytes del buffer dati in scambio (I buffers **RxData** e **TxData** devono avere la stessa dimensione). L'FB controlla se vi è una variazione dei dati nel buffer **TxData** e ne esegue immediatamente l'invio al sistema peer che risponde con i dati del proprio buffer **TxData** che saranno trasferiti nel buffer **RxData**. L'uscita **PeerOk** è attiva se la comunicazione con il sistema peer è operativa, in caso di errori di comunicazione l'uscita si disattiva. In **RxFrames** e **TxFrames** è ritornato il conteggio dei frames dati ricevuti ed inviati dalla FB verso il sistema peer, in **AckErrors** il numero di errori di acknowledge da parte del sistema peer. In caso di errore esecuzione viene attivata per un loop l'uscita **Fault**. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Comando di abilitazione blocco | | | funzione. | +-----------------------------------+-----------------------------------+ | **MMDtTxfID** (UDINT) | ID server multimaster in uscita | | | dalla FB server | | | (**MmasterDataTxfer**). | +-----------------------------------+-----------------------------------+ | **ToNode** (USINT) | Nodo identificativo del sistema | | | peer con cui scambiare i dati | | | (Range da 0 a 250). | +-----------------------------------+-----------------------------------+ | **RxData** (@USINT) | Puntatore al buffer dove devono | | | essere trasferiti i dati | | | ricevuti. | +-----------------------------------+-----------------------------------+ | **TxData** (@USINT) | Puntatore al buffer dove sono | | | presenti i dati da trasmettere. | +-----------------------------------+-----------------------------------+ | **DLen** (UDINT) | Numero di bytes scambiati (Max | | | 32). | +-----------------------------------+-----------------------------------+ | **Enabled** (BOOL) | Attivo su abilitazione blocco | | | funzione. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop su errore | | | esecuzione. | +-----------------------------------+-----------------------------------+ | **RxOk** (BOOL) | Attivo per un loop ad ogni | | | ricezione dati da sistema peer. | +-----------------------------------+-----------------------------------+ | **PeerOk** (BOOL) | Attivo se scambio dati con | | | sistema peer è Ok. | +-----------------------------------+-----------------------------------+ | **RxFrames** (UDINT) | Counter frame dati ricevuti. | +-----------------------------------+-----------------------------------+ | **TxFrames** (UDINT) | Counter frame dati trasmessi. | +-----------------------------------+-----------------------------------+ | **AckErrors** (UDINT) | Counter errori acknowledge dati | | | da sistema peer. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +-----------------------------------+-----------------------------------+ | 10041010 | **MMDtTxfID** non definito. | +-----------------------------------+-----------------------------------+ | 10041020 | **MMDtTxfID** non corretto. | +-----------------------------------+-----------------------------------+ | 10041050 | Valore **DLen** errato. | +-----------------------------------+-----------------------------------+ | 10041200 | Frame dati ricevuto da sistema | | | peer ha lunghezza errata. | | | Verificare **DLen** sistema peer. | +-----------------------------------+-----------------------------------+ **Esempi** """""""""""""" Nell'esempio è gestito lo scambio di 8 BOOL con il sistema peer nodo 1 (**MyNode**\ =1). **Definizione variabili** |image3| **Esempio LD** |image4| Broadcast DataSend, broadcast data send ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eMMasterDTxferLib_C00 | | | 0 | +-----------------------+-----------------------+ |image5| Questo blocco funzione esegue l'invio di dati in modo broadcast. Si collega al blocco funzione **MMasterDataTxfer** di gestione dispositivo di comunicazione, occorre passare **MMDtTxfID** in uscita dal blocco funzione server. Il blocco funzione invia i dati presenti nel buffer puntato da **TxData** con indirizzo di broadcast 16#FF. Tutti i sistemi che eseguono la FB **DataTxferClient** che hanno **ToNode** uguale al valore di **Node** definito nella **MMasterDataTxfer** riceveranno i dati inviati. In **TxData** occorre definire l'indirizzo del buffer ed in **DLen** la dimensione in bytes del buffer dati che si vuole scambiare con i sistemi peer Ad ogni attivazione dell'ingresso **Enable** viene eseguito l'invio dei dati in broadcast, terminato l'invio si attiva l'uscita **Done** che rimane attiva sino alla disattivazione dell'ingresso **Enable**. Per effettuare una nuova trasmissione occorre disattivare e poi riattivare l'ingresso **Enable**. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Comando di abilitazione blocco | | | funzione. | +-----------------------------------+-----------------------------------+ | **MMDtTxfID** (UDINT) | ID server multimaster in uscita | | | dalla FB server | | | (**MmasterDataTxfer**). | +-----------------------------------+-----------------------------------+ | **TxData** (@USINT) | Puntatore al buffer dove sono | | | presenti i dati da trasmettere. | +-----------------------------------+-----------------------------------+ | **DLen** (UDINT) | Numero di bytes scambiati (Max | | | 32). | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo al termine dell'invio dei | | | dati, rimane attivo fino alla | | | disabilitazione di **Enable**. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop su errore | | | esecuzione. | +-----------------------------------+-----------------------------------+ | **TxFrames** (UDINT) | Counter frame dati trasmessi. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +----------+-----------------------------+ | 10044010 | **MMDtTxfID** non definito. | +----------+-----------------------------+ | 10044020 | **MMDtTxfID** non corretto. | +----------+-----------------------------+ | 10044050 | Valore **DLen** errato. | +----------+-----------------------------+ .. |image0| image:: media/image1.jpg :width: 7.0375in :height: 9.78819in .. |image1| image:: media/image2.jpg :width: 1.63403in :height: 1.59444in .. |image2| image:: media/image3.jpg :width: 1.41736in :height: 1.59444in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 1.53542in .. |image4| image:: media/image5.jpg :width: 7.08681in :height: 6.06319in .. |image5| image:: media/image6.jpg :width: 1.41736in :height: 1.05139in