Vai al contenuto
PLC Forum


Comunicazione tra S7 1200 e dispositivi Modbus Tcp


pegu

Messaggi consigliati

Buongiorno a tutti, da poco tempo sono precipitato nella programmazione PLC e sono stato subito messo alla prova con delle funzioni avanzate, nello specifico la comunicazione Modbus tcp.

Vi presento il caso: ho una rete formata da un S7 1215 collegato a un switch a cui sono collegati diversi multimetri ABB M2M Modbus TCP. Il PLC deve leggere costantemente la potenza acquisita dai multimetri. Per la programmazione sto usando Tia Portal V13.

Allora innanzitutto ho imparato ad acquisire il dato tra un PLC e un multimetro, in un blocco FB che chiamo in OB1 ho usato l'istruzione MB_CLIENT e inserito i parametri, come modalità, indirizzo dei registri, IP etc, in un DB creato da me, perchè nel DB che viene creato in automatico non trovo alcuni parametri per la connessione, come "Connect" che dovrebbe essere di tipo TCON_IP_v4 mentre è impostato come Variant. 

Qui sorge il primo dubbio, a cosa serve il DB di istanza creato in automatico? posso usarlo per registrare i parametri di connessione?

La prova di lettura da un singolo dispositivo è riuscita, adesso ho provato a creare altre istruzioni MB_Client e leggere i dati da altre 8 multimetri che però al momento non sono connessi/disponibili.

Ho messo i parametri di tutte le connessioni in un singolo DB globale (Config Modbus [DB2]) perchè provando a creare un DB multi-istanza vedo che è protetto da scrittura.

Secondo dubbio, come si può usare il blocco multi-istanza?

Quindi, avviato il programma, dovrei vedere la lettura da 1 multimetro e altri 8 che non riescono a leggere, in pratica il contatto DONE dell'istruzione MB_Client che si attiva solo sulla prima istruzione e non sulle restanti 8.

Mentre qui vedo dei comportamenti strani: prima vedevo lo STATUS 8200 "Elaborazione di un'ulteriore richiesta Modbus in corso attraverso la porta" allora ho pensato che dovevo attivare i segmenti uno dopo l'atro quando quello precedente aveva finito di comunicare ma risulta abbastanza complicato per le mie capacità e (Dubbio 3) mi sono chiesto se fosse proprio necessario e ci fossero dei sistemi/istruzioni che gestissero il traffico dati.

Ritorno il giorno dopo sul progetto e lo testo per vedere se il problema si ripresenta ma è magicamente scomparso, adesso si presenta un secondo comportamento strano: tutte le istruzioni MB_Client vengono eseguite con successo, in particolare ho messo un contatore per segnare il numero di DONE delle singole istruzioni, per vedere se vengono eseguite uno stesso numero di volte, e il contatore è uguale per tutte.

Da cosa è dato questo comportamento? Forse dal singolo DB creato da me dove sono racchiusi i parametri di connessione?

Questi sono i problemi che sto riscontrando e più vado avanti più i dubbi si accumulano e al momento sono un po' bloccato.

Vi ringrazio in anticipo per l'aiuto.

 

Connessione singolo modbus.png

DB connessione singolo modbus.png

DB connessione multipli modbus.png

Contatore DONE.png

Link al commento
Condividi su altri siti


Una nota sull'ultimo comportamento che ho descritto: se provo a staccare il cavo ethernet dell'unico multimetro a cui sono connesso tutte le istruzioni MB_CLIENT danno come STATUS 7200, cioè sta tentando la connessione se non ricordo male. Il che è normale per la prima istruzione, ma non capisco cosa lega la prima a tutte le altre dato che gli indirizzi IP sono tutti diversi.

Link al commento
Condividi su altri siti

Ok, ho sentito un esperto e il problema è che utilizzo un DB globale che manda in confusione i blocchetti MB_CLIENT. La domanda quindi è: come utilizzo il DB di istanza generato dal sistema per inserire tutti i miei parametri di connessione? Nello specifico come inserisco i parametri CONNECT e MB_DATA_PTR? Dato che nel DB di istanza sono di tipo Variant, e nella tabella non si riesce a modificarli, mentre a me servono rispettivamente di tipo TCON_IP_v4 e il secondo è l'indirizzo di una variabile o DB. 

MB_Client_DB.png

Link al commento
Condividi su altri siti

Ecco. Adesso so che sbaglio usando un DB globale ma non riesco proprio a capire come cambiare il dato CONNECT da Variant a TCON_IP_v4 e inserire i parametri per la connessione nei DB di istanza

segmento1.png

segmento2.png

segmento3.png

Link al commento
Condividi su altri siti

il problema non è il db globale, il problema nasce dal fatto che stai usando lo stesso db di istanza per ogni richiamo, clikka con il tasto destro sui vari mb_client e premi su cambia istanza, usane una diversa per ogni richiamo.

Link al commento
Condividi su altri siti

Ciao, grazie della risposta. Ho provato ieri sera a implementare la tua soluzione e ho creato altri 8 DB di istanza, compilo il programma correttamente ma quando provo a caricarlo TIA Portal va avanti all'infinito. Adesso provo a vedere cosa ha.  

Link al commento
Condividi su altri siti

Oggi magicamente carica tutto e non vedo errori apparenti, poi domani dovrò testare sull'impianto quindi gli errori usciranno 😅, grazie dell'aiuto. Se hai tempo potresti spiegarmi ha cosa servono i DB di istanza? Da quello che vedo non servono per tenere i parametri del blocchetto, quindi per cosa viene usato?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...