Vai al contenuto
PLC Forum


Comunicazione MoDBUS RTU tra Driver Oriental Motor ed FX5U


MTU

Messaggi consigliati

Buongiorno a tutti,

volevo affrontare la comunicazione tra i due dispositivi citati nel titolo: PLC della serie FX5U ed un driver per un Motore Brushless Oriental Motor (BLH2D30-KR ).

Ho provato aleggere il manuale di Mitsubishi ed a fare alcune prove di comunicazione, ma non trovo un effettivo riscontro.

Ho provato ad usare il blocco ADPRW, ma non ho compreso bene l'utilizzo evidentemente.

Come canale seriale RS485 uso il CH1.

Avreste alcuni suggerimenti da darmi per sbloccarmi?

 

 

Link al commento
Condividi su altri siti


Per prima cosa, suppongo che tu abbia già correttamente impostato i dati di comunicazione della porta 485 integrata: protocollo Modbus RTU, baud e bit di stop/parità.

A quel punto entra in gioco la ADPRW.

Il primo parametro è il numero del nodo che andrai ad interrogare. Dovrà essere stato impostato nello slave con cui comunicare. Se non corrisponde, avrai un errore di comunicazione

Il secondo è la funzione Modbus che vuoi usare. Per esempio, la funzione 16 (10H) è quella per scrivere dei registri Modbus.

I successivi dipendono dalla funzione scelta (vedi in dettaglio il manuale apposito per la comunicazione ModBus)

L'ultimo parametro è un array di tre elementi bool in cui l'istruzione ti metterà l'esito (ok, errore, ecc).

Prova a descrivere cosa devi fare esattamente e come hai scritto la funzione

 

 

 

Link al commento
Condividi su altri siti

Grazie per la gentile risposta Ctec,

allego due immagini di quello che ho fatto.

Per esempio, vorrei leggere un registro (indicante la velocità del motore) al registro 0480h;

quindi scrivo K480 per il registro, 2 per indicare la lunghezza dei registri che voglio andare a leggere partendo da quello descritto.

e su s5d1 dovrei vedere il risultato della mia lettura? oppure dove lo posso leggere?

vedo che dal registro interno del PLC (SM8800) c'è comunicazione MODBus e le impostazioni su entrambi i dispositivi sono le medesime (38400kbps, 1 bit stop, parità pari, indirizzo di slave ID=1).

 

 

Immagine1.png

Immagine.png

Link al commento
Condividi su altri siti

Prima cosa, hai detto che devi leggere il registro 0480h (1152 decimale), ma te hai specificato per S2 il valore K450 (quindi 01C2h esadecimale). Stai puntando in un posto diverso, forse inaccessibile.

Poi, dato che hai richiesto 2 registri (K2 in S4), la variabile in S5 (uLabel13) deve essere un array di 2 word. Non so se è definita così. Quando funziona, avrai nell'indice 0 la prima word e nell'indice 1 la seconda word.

Anche il D2 (Label12) deve essere un array di 3 bool. Questi bit sono:

image.png.6306c27171949ea910b65dc8cc088a8c.png

Il primo quindi dice che l'istruzione è in esecuzione, il secondo se l'esecuzione è andata a buon fine, e il terzo invece se c'è stato un errore.

 

Qui un esempio di programma che scrive una word (velocità) su un inverter (scritto in ladder, non mi piace lo FDB):

image.png.c5abc8588629eee2c746e0e2434776f5.png

 

MBsend è un mio flag di invio dato, NodeAddr una variabile con il numero di nodo di destinazione, RegAddr una variabile con l'indirizzo del registro destinazione, RegValue1 (niente array perché scrivo una sola word) variabile con il dato da scrivere, e infine MBflag[] è un array con i risultati. Setto MBflag dopo aver impostato le altre variabili, la ADPRW esegue il comando (manda a 1 il MBflag[0] a indicare che sta comunicando) e appena questo bit torna a 0 (fronte negativo) resetto il mio flag. Questo evento mi permette poi di capire, leggendo il MBflag[1], se è andato tutto bene o meno.

 

Link al commento
Condividi su altri siti

46 minuti fa, Ctec ha scritto:

Prima cosa, hai detto che devi leggere il registro 0480h (1152 decimale), ma te hai specificato per S2 il valore K450 (quindi 01C2h esadecimale). Stai puntando in un posto diverso, forse inaccessibile.

 

Andando a puntare il registro 0480h in lettura (comando ModBus 04h, per intendere il registro superiore) e con s4 posto a 1 vi compare nel registro PLC SD8067 l'errore 6160 (in HEX 1810H) => Channel used by the instruction is used by other instruction. (quindi registro già usato??)

Scusami, ma mi sento leggermente confuso...i registri devo scriverli in esadecimale ed igli errori me li vedo in decimale?

Altra cosa, mi viene da suppore che la comunicazione stia "funzionando", visto che comunque un errore mi compare..

 

46 minuti fa, Ctec ha scritto:

 

Poi, dato che hai richiesto 2 registri (K2 in S4), la variabile in S5 (uLabel13) deve essere un array di 2 word. Non so se è definita così. Quando funziona, avrai nell'indice 0 la prima word e nell'indice 1 la seconda word.

Anche il D2 (Label12) deve essere un array di 3 bool. Questi bit sono:

image.png.6306c27171949ea910b65dc8cc088a8c.png

Il primo quindi dice che l'istruzione è in esecuzione, il secondo se l'esecuzione è andata a buon fine, e il terzo invece se c'è stato un errore.

 

Qui un esempio di programma che scrive una word (velocità) su un inverter (scritto in ladder, non mi piace lo FDB):

image.png.c5abc8588629eee2c746e0e2434776f5.png

 

MBsend è un mio flag di invio dato, NodeAddr una variabile con il numero di nodo di destinazione, RegAddr una variabile con l'indirizzo del registro destinazione, RegValue1 (niente array perché scrivo una sola word) variabile con il dato da scrivere, e infine MBflag[] è un array con i risultati. Setto MBflag dopo aver impostato le altre variabili, la ADPRW esegue il comando (manda a 1 il MBflag[0] a indicare che sta comunicando) e appena questo bit torna a 0 (fronte negativo) resetto il mio flag. Questo evento mi permette poi di capire, leggendo il MBflag[1], se è andato tutto bene o meno.

 

 

Link al commento
Condividi su altri siti

Calma. Prima cosa da capire in programmazione è la notazione. La stessa entità può essere espressa in modi (notazione) diversa.

Per esempio 1d+1d=10b è corretta (1+1 in decimale fa 2 in decimale, che è 10b in binario...)

Il mitsubishi prevede il prefisso K (o nessun prefisso sul FX5) per i valori decimali, e H per gli esadecimali.

Spesso gli indirizzi dei registri modbus sono indicati in esadecimale. Te puoi scriverlo sia in esadecimale (H0480) che in decimale (K1152), funziona lo stesso. Dentro il PLC il processore li vede entrambi in binario...

 

Il valore che vuoi leggere (velocità) è la coppia di registri (in modbus ogni registro è fatto da 16bit, cioè una word) 0480-0481h. Quindi per leggere questo valore devi specificare che vuoi leggere 2 registri (totale di 32bit). 

image.png.d5da00d3fac4010f9609f5f3219c2cb8.png

Pertanto dovrai usare il comando 3 (H03), registro da leggere H0480 (o K1152 se preferisci il decimale, ma sono la stessa cosa), e 2 (H2 o K2, sempre 2 è) registri consecutivi.

Siccome l'istruzione ADPRW vuole che S5 (la risposta al comando 3) sia a 16bit, devi mettere un array di due valori. Poi li "rimonterai" insieme in un valore a 32bit, se necessario.

Il comando 4 (o H04, è lo stesso) è il Read Input Registers, cioè legge i registri degli ingressi, e tra l'altro spesso non è implementato nello slave. Il comando per leggere de "valori" da un inverter è sempre il comando 3 (Read Holding Registers).

Poi, se non ti va a 1 il secondo bit dell'array di risposta, vuol dire che c'è un errore (quindi il terzo bit è a 1). Ma un errore può essere anche il cavo disconnesso, oppure lo slave non risponde, oppure stai cercando di leggere un'area non leggibile, ecc.

Se vado nel manuale delle comunicazioni della serie iQF, io trovo che SD8067 non ha niente a che fare col Modbus RTU, ma con le socket ethernet.

Il codice di errore lo devi vedere in SD8500 e SD8501 (per il canale 1), e nel paragrafo 47.3 trovi le spiegazioni agli errori.

 

 

Link al commento
Condividi su altri siti

Il 1/3/2024 alle 17:13 , Ctec ha scritto:

Calma. Prima cosa da capire in programmazione è la notazione. La stessa entità può essere espressa in modi (notazione) diversa.

Per esempio 1d+1d=10b è corretta (1+1 in decimale fa 2 in decimale, che è 10b in binario...)

Il mitsubishi prevede il prefisso K (o nessun prefisso sul FX5) per i valori decimali, e H per gli esadecimali.

Spesso gli indirizzi dei registri modbus sono indicati in esadecimale. Te puoi scriverlo sia in esadecimale (H0480) che in decimale (K1152), funziona lo stesso. Dentro il PLC il processore li vede entrambi in binario...

 

Il valore che vuoi leggere (velocità) è la coppia di registri (in modbus ogni registro è fatto da 16bit, cioè una word) 0480-0481h. Quindi per leggere questo valore devi specificare che vuoi leggere 2 registri (totale di 32bit). 

image.png.d5da00d3fac4010f9609f5f3219c2cb8.png

Pertanto dovrai usare il comando 3 (H03), registro da leggere H0480 (o K1152 se preferisci il decimale, ma sono la stessa cosa), e 2 (H2 o K2, sempre 2 è) registri consecutivi.

Siccome l'istruzione ADPRW vuole che S5 (la risposta al comando 3) sia a 16bit, devi mettere un array di due valori. Poi li "rimonterai" insieme in un valore a 32bit, se necessario.

Il comando 4 (o H04, è lo stesso) è il Read Input Registers, cioè legge i registri degli ingressi, e tra l'altro spesso non è implementato nello slave. Il comando per leggere de "valori" da un inverter è sempre il comando 3 (Read Holding Registers).

Poi, se non ti va a 1 il secondo bit dell'array di risposta, vuol dire che c'è un errore (quindi il terzo bit è a 1). Ma un errore può essere anche il cavo disconnesso, oppure lo slave non risponde, oppure stai cercando di leggere un'area non leggibile, ecc.

Se vado nel manuale delle comunicazioni della serie iQF, io trovo che SD8067 non ha niente a che fare col Modbus RTU, ma con le socket ethernet.

Il codice di errore lo devi vedere in SD8500 e SD8501 (per il canale 1), e nel paragrafo 47.3 trovi le spiegazioni agli errori.

 

 

 

 

Grazie mille Ctec,

ho provato come hai detto tu e riesco a leggere il registro.

Ora posso cominciare ad interagire :)

Utilissimo il consiglio sui prefissi K ed H per quanto riguarda i registri..onestamente non conoscevo tale nomenclatura e sul manuale non è spiegato così bene.

Tu usi sempre il e-Manual Viewer o qualcosa di più approfondito?

 

Link al commento
Condividi su altri siti

E-manual Viewer è aggiornato con l'ultima versione dei file pdf di tutta la manualistica, molto più utile di . in linea poco affidabili. Purtroppo i manuali Mitsubishi hanno un po' troppi salti avanti/indietro, ma niente in confronto ad altri... Consente anche di fare ricerche ben fatte.

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...