Jump to content
PLC Forum


Fede74

Modbus TCP

Recommended Posts

Fede74

Salve a tutti,

 

dovrei realizzare una piccola automazione che prevede il controllo di due servomotori (1 asse elettrico ed un motore).

Per quello che riguarda il PLC intendo rimanere in famiglia Omron ed in particolare nella serie CP1 e CX Programmer, per l'HMI utilizzo Weintek, mentre per la parte motion, non ho ancora le idee chiare.. al momento sto valutando un'offerta Festo che prevede l'utilizzo di azionamenti della serie CMMO-ST.

Premetto che ho già avuto esperienze di controllo motori (Festo ed SMC) ed ho sempre usato (con soddisfazione) la logica a "treno di impulsi" per interfacciarmi al CP1, ma pensavo che questa potrebbe essere l'occasione per fare un piccolo salto di qualità e passare all' interfacciamento tramite Bus di campo e Modbus TCP dovrebbe essere appunto quello più indicato.

 

dal punto di vista hardware non ci dovrebbero essere problemi, il CMMO-ST accetta già il protocollo Modbus TCP ed il PLC anche (CP1L + CP1W-MODTCP61).

 

 

Tanto per cominciare:

 

Per collegare entrambi i drive al PLC posso utilizzare un normale switch ethernet?

Ci sono librerie da integrare in CX Programmer? .. le ho trovate solo per Sysmac Studio.

Edited by Fede74

Share this post


Link to post
Share on other sites

Ctec

Non usare un CP1 normale con modulo espansione, spendi soldi inutilmente.

Meglio usare un CP1-EL o CP1-EM, che hanno l'ethernet integrata e già il protocollo Modbus/TCP incorporato. E in MyOmron trovi le FB già pronte per usare tale protocollo.

E va benissimo un normale switch ethernet, anche non managed. Consigliabile per uso industriale, non quelli da tavolo...

Share this post


Link to post
Share on other sites
Fede74

grazie Ctec

 

ho trovato questo link: https://www.myomron.com/index.php?article=1478&action=kb

che mi sembra piuttosto esaustivo a riguardo.

 

Si parla di socket.. ma cos'è un socket?

 

La mia configurazione prevederebbe:

 

PLC >> Switch >> Drive1(Modbus) + Drive2(Modbus) + HMI(Ethernet)

 

 

... devo aprire 3 "socket"?? .. oppure un socket per Modbus ed uno per Ethernet??

 

 

 

Share this post


Link to post
Share on other sites
Ctec

Il socket (non me ne vogliano i puristi, è una semplificazione) è un canale via ethernet come master.

Siccome il PLC è master del protocollo Modbus/TCP, dovrai aprire un socket per tale connessione, ma apri un canale solo dato che poi in quel protocollo ciascun nodo è associato a un proprio indirizzo nel protocollo.

Per la connessione con lo HMI non devi aprire nulla, perché in quel caso il master è il display, non il PLC, per cui sarà lui a farlo

La configurazione è ok, come vedi anche nell'esempio di MyOmron.

Share this post


Link to post
Share on other sites
Fede74

ok, non so come ringraziarti per la disponibilità.

Ho la testa dura.. ma pian piano, tra manuali, datasheet e le tue dritte sto iniziando a capire .. non mi resta che procurare il materiale ed iniziare a smanettarci.

 

Share this post


Link to post
Share on other sites
minihidro

Scusa Ctec , ma non riesco a trovare la CP1E-M ?

Share this post


Link to post
Share on other sites
Ctec

Ho scritto male i codici. CP1L-EL o CP1L-EM. Sono identiche alla CP1L-L e CP1L-M, ma con in più l'ethernet (e altre funzioncine...)

Share this post


Link to post
Share on other sites
Fede74

Eccomi qua..  alle prese con la configurazione del Modbus.

Quadro.thumb.jpg.3672d1b632a8b4e9fb2cef212babfc7d.jpg

 

Ho cablato il mio quadretto, poi mi sono collegato via ethernet tramite PC e con un simulatore modbus ho smanettato un po'  con gli assi.

Ho caricato la libreria modbus sul CX Programmer e ora sto cercando di configurare la comunicazione col PLC.

 

 

 

All'ingresso dell' FB di apertura del socket ho messo l'indirizzo IP della CP1L e la porta di comunicazione.

In uscita c'è una variabile dove verrà scritto dall' FB il numero di socket che viene aperto

 

1085139567_AperturaSocket.thumb.JPG.ab5c7b94ab1a8a0550e90c5da888c30f.JPG

 

 

Poi ho richiamato l'FB per la lettura dei registri dai miei due drive ed in ingresso di entrambi i blocchi ho inserito la variabile col numero di socket aperto

 

 1775846813_LetturaRegistri.thumb.JPG.a38510015b723ce38be8713a14a44cf3.JPG

 

 

 

 

                  .. e poi????

 

 

Share this post


Link to post
Share on other sites
Ctec

Il socket è una connessione tra PLC e periferica. Ogni periferica deve essere connessa con un socket diverso, e nel CP1 si possono aprire massimo 3 socket.

Ovviamente, nella FB di apertura socket, devi indicare non l'indirizzo del PLC (che il PLC conosce benissimo...) ma l'indirizzo della periferica da interrogare. A quel punto, se l'apertura del socket va in porto (cioè se la periferica risponde), si attiva l'uscita Done della FB e ti viene dato il numero di socket da passare alle altre FB.

Come riportato nel manuale della FB, come numero di porta locale usa un valore da 1024 in su, e diverso per ogni socket.

 

Nella ReadRegister, specificherai il SocketNumber associato a quell'indirizzo IP con la FB di cui sopra, non mettere il flag Sempre On sull'ingresso Fn03 della FB, altrimenti fai una mega mitraglia di chiamate che rischi di intasare la comunicazione. Attivalo quando ti serve leggere, e il dato sarà valido quando l'uscita Done va a 1. Devi ovviamente mettere anche il numero del registro da leggere dalla periferica, cosa che nel tuo programma non c'è (infatti hai errore sulla barra sinistra...). Gli indirizzi dei registri li troverai nei manuali delle periferiche.

 

 

Share this post


Link to post
Share on other sites
Fede74

Chiarissimo Ctec ! (come sempre)

 

Ho indicato l' IP del PLC perchè nel reference dell' FB era specificato di inserire l'IP locale.. mi chiedevo anch'io che senso potesse avere.

 

Ho aperto un solo socket perchè avevo mal interpretato un tuo post precedente.. infatti non riuscivo a capire in che modo potevo successivamente indicizzare le due periferiche.

 

Dopo le feste vedrò di mettere in pratica le tue indicazioni.

 

 

Grazie e... a proposito .. BUONA PASQUA

 

Share this post


Link to post
Share on other sites
Ctec

Feste? Quali feste? Io lavoro sempre.. 😭

Buona pasqua a te e a tutti i forummiani

Share this post


Link to post
Share on other sites
Fede74

Buongiorno.

 

Ho fatto qualche passetto.. ma ancora non vedo la luce

 

111.thumb.JPG.f881fb4b4eadbd2253d4f2b179a8fccd.JPG222.thumb.JPG.193e07fa35bdd876a6561b0b5785f794.JPG333.thumb.JPG.0bb3b6df1e372df8e49eb18ea87a00b2.JPG

 

Quando tento di leggere l' FB mi risponde con l'errore 8720.

Non sono nemmeno riuscito a trovare il significato di quel codice

 

Share this post


Link to post
Share on other sites
Ctec

L'errore &8720 corrisponde a #2210 in esadecimale. Nella descrizione della FB trovi che i codici di errore sono nei manuali W420, W342, W516. Io ho anche guardato il W421, e si vede che corrisponde a "The specified socket is not open", infatti vedendo il tuo primo snapshot, appena apri il socket (200.0) e ottieni la risposta che è aperto (200.1), questo bit toglie il flag di apertura, quindi il socket è richiuso. Pertanto quando lanci la Read, questa si ritrova il socket chiuso.

Attenzione che le routine di comunicazione spesso impiegano più cicli di scansione per eseguire il compito, soprattutto quelle come le tue che si aspettano una risposta da un modulo remoto, che col cavolo che è sincronizzato con la scansione del PLC. Pertanto, attiva il socket e lascialo aperto per tutto il tempo che ti serve (in teoria, finché non viene spento il PLC...). Quando il ( o i socket) sono aperti, comincia il polling delle letture/scritture dei registri. Usa il Done (e l'Error) di queste per terminare l'operazione di lettura o scrittura, salva il dato eventualmente letto e passa alla successiva operazione di lettura/scrittura sullo stesso socket. Le operazioni su socket diversi possono anche operare contemporaneamente, ci pensa il sistema operativo del PLC a gestire le priorità.

Share this post


Link to post
Share on other sites
Fede74

niente da fare..

ho semplificato il tutto aprendo un solo socket e tenendolo forzato come mi suggerisci, ma l'errore persiste

 

111.thumb.JPG.b8ad5b44d866d2cfc3fc88bef9bf5ed2.JPG222.thumb.JPG.d4844995b6c872539f569c2448a44851.JPG

Share this post


Link to post
Share on other sites
Fede74

rettifico.. l'errore ora è il 4353

Share this post


Link to post
Share on other sites
Fede74

quindi in esadecimale corrisponde a #1101,

che significa:

 

The area designation of the Send/Receive Data Address is not

inallowable range.

Share this post


Link to post
Share on other sites
Fede74

ho provato a riallocare la memoria relativa agli FB in questo modo

 

111.thumb.JPG.03369caa24bc0b294892042beedab3ba.JPG

 

e il codice di errore ora è il 3

 

...che non sono riuscito a trovare sul manuale

Share this post


Link to post
Share on other sites
Ctec

L'area non raggiungibile (#1101) non è quella della FB, ma l'indirizzo del registro della periferica interrogata.

Vedo che cerchi di leggere il registro #0000, che normalmente non è allocato in nessuno dei dispositivi che ho mai visto.

Devi cercare nel manuale del dispositivo (era un servo Festo, se non erro) e vedere quali sono gli indirizzi dei registri leggibili.

La roba della Festo non la conosco, per cui non so come aiutarti.

Un esempio: per leggere un peso in uno strumento in modbus TCP, l'indirizzo è il 40008, quindi indirizzo 7 (partendo da 0).

Per vedere come risponde lo strumento, usa un programma di test modbus da PC e vedi che risultato hai (io uso il Radzio RMMS)

Share this post


Link to post
Share on other sites
Fede74
41 minuti fa, Ctec scrisse:

per leggere un peso in uno strumento in modbus TCP, l'indirizzo è il 40008, quindi indirizzo 7 (partendo da 0).

Scusami non mi è chiaro questo passaggio

Share this post


Link to post
Share on other sites
Fede74

questo il simulatore che sto usando, mi sembra di capire che a partire dall'indirizzo 0x0000 (start adress), i primi 8 byte sono per la trasmissione e i successivi 8 byte sono per la ricezione

 

1111.thumb.jpg.199b7fbb69059083a4a903146bf6727a.jpg

Share this post


Link to post
Share on other sites
Ctec

Sono andato un po' a vedere. Il driver dovrebbe essere un Festo CMMO-ST, ma non ha un protocollo Modbus standard, bensì un Modbus/FHPP, in pratica gestisce le chiamate in modo particolare. Quel simulatore è il client della Festo per interrogare i propri prodotti con tale protocollo.

Da quel che capisco, devono essere letti 4 registri (8 byte) a partire dallo 0, ma te hai usato la funzione 03, che legge un solo registro (2 byte).

Ma le FB che ho io per il CP1L-E (uguali alle tue) non hanno la possibilità di modificare il numero di registri letto, per cui temo sia un casino.

Le FB sono protette, per cui non è possibile modificarle. Non so come aiutarti. Prova a sentire il supporto Omron se hanno altre FB per lettura e scrittura di registri multipli.

L'unica è provare a leggere uno alla volta i quattro registri (indirizzi da 0 a 3) e vedere se risponde. Per la scrittura la vedo più complicata.

Share this post


Link to post
Share on other sites
Fede74

Forse ho già trovato degli FB che permettono il trasferimento multiplo di registri, c'è anche un esempio bello e pronto (quasi) che sto testando ora e sembra funzionare.

 

il pacchetto di FB si chiama   MTCP_CP1L_Client_E 

 

non mancherò di postare aggiornamenti in merito... o di rompere ancora se non ne vado fuori

 

purtroppo (si fa per dire)... da domani sono in ferie per una decina di giorni.. quindi ne riparleremo più avanti.

 

Ctec ti ringrazio infinitamente!

 

Share this post


Link to post
Share on other sites
Fede74

Aggiornamenti:

 

la buona notizia è che sono riuscito a stabilire la connessione e a colloquiare perfettamente con uno dei due drive Festo, tramite le FB che ho scaricato dal my Omron  "MTCP_CP1L_Client_E".

 

Il problema è che le suddette FB non danno la possibilità di gestire i 3 socket a disposizione, infatti si connettono unicamente al socket 1 porta 502 (come chiaramente evidenziato anche sul pdf di reference del blocco).

 

Ho tentato la "furbata" di usare lo stesso socket richiamando alternativamente i due indirizzi IP, ma senza risultato.

 

 

Share this post


Link to post
Share on other sites
Fede74

Ho contattato l'assistenza software di Omron.

 

Per prima cosa mi dicono che le CP1L-EL supportano solo teoricamente la gestione contemporanea dei 3 socket .. in pratica mi dicono che non hanno risorse sufficienti allo scopo.

Allora mi suggeriscono di effettuare un polling dello stesso soket, alternando i due IP dei dispositivi collegati, cosa che in realtà avevo già tentato, ma senza risultati.

Mi spiegano che alcuni dispositivi non permettono la disconnessione istantanea, quindi risulta impossibile la gestione del polling.

 

La soluzione sarebbe essere quella di acquistare il modulino aggiuntivo (CP1W-MODTCP61) che converte Modbus RTU in Modbus TCP.

 

 

Share this post


Link to post
Share on other sites
Fede74

Non riesco a trovare le librerie Easy Modbus... 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...