Vai al contenuto
PLC Forum


Gtwin Pro E Modbus - comunicazione con altri utenti


Messaggi consigliati

Inserito:

salve,

sono nuovo in questo sito e cerco un aiuto per programmare una FP0R con GTWIN pro come Modbus Master

Forse ha giá usato qualcuno il comando F145F146_Modbus_command per mandare una lista di messaggi ModBus RTU a differenti slave.

Il mio problema é il timing entro la "lista" di comandi, cosicché non bloccano il resto del programma in caso di

errori di comunicazione con i moduli esterni.

Inoltre devo lasciare una pausa di 10ms tra due comandi per fare lavorare i moduli esterni liberamente.

Grazie per le risposte.


Roberto Gioachin
Inserita:
per programmare una FP0R con GTWIN pro come Modbus Master

Forse ti riferisci a FPWIN-Pro

il comando F145F146_Modbus_command per mandare una lista di messaggi ModBus RTU a differenti slave

No si capisce però se questa parte ti funziona

Il mio problema é il timing entro la "lista" di comandi

A cosa ti riferisci, il timing sei tu a deciderlo, inviando ogni singolo comando quando lo ritieni necessario, non devi per forza fare una trasmissione continua.

Inoltre i comandi F145 e F146 sono due, uno per l'invio di dati ed uno per la richiesta di dati allo slave, in quale dei due casi hai problemi

Prova a spiegare meglio il problema.

Ciao

Roberto

Inserita:

Scusate il mio italiano, ma parlo e scrivo piú in tedesco che non in italiano :)

- Va bene, io uso FPWIN-Pro 6.201.

- il comando F145F146_Modbus_command é relativamente nuovo in questa versione e raggruppa i due comandi in uno.

Per mandare piú comandi entro brevissimo tempo, bisogna sincronizzare i comandi con sys_bIsComPort1F145F146NotActive, ed

in piú con un contatore indice che decide quale comando prossimo deve essere trasferito.

sys_bIsComPort1F145F146NotActive dovrebbe venire quando la risposta dello slave é arrivata.

Ma, se lo slave non risponde, dopo quanto tempo arriva?

Il resto del programma deve lavorare lo stesso senza interruzioni ed anche gli altri slaves non devono essere bloccati.

Nel mio caso ho soltanto una Baudrate di 9600Bd, ma devo comunicare il piú velocemente possibile con piú slaves possibili.

In caso di errori sulla linea, si rallenta la comunicazione enormemente, quindi bisognerebbe levare lo slave difettoso dalla lista.

Io pensavo che forse ha giá fatto qualcunaltro di queste esperienze e mi puó dare un buon consiglio.

Nei manuali della Panasonic non ho trovato esempi adatti.

Grazie

Inserita: (modificato)

Guarda bene nel manuale, la R: "sys_bIsComPort1F145F146NotActive" non è supportata da FP0R.

Nell' elp di fpwinPRO in cerca vai a trovare la tabella delle variabili di sistema, e c'è scritto che non è presente su quella cpu.

saluti

Modificato: da Stucci
Inserita:

Nella mia tabella . esiste "sys_bIsComPort1F145F146NotActive" due volte con differenti Indirizzi.

R9044 vale per la FP0R cpu, ed infatti funziona.

saluti

Inserita: (modificato)

T CHIEDO INFINITAMENTE SCUSA HAI RAGIONE.

Io ho usato la 145 e 146 separatamente per una comunicazione non in Modbus ma su 232 per leggere e scrivere DT da un plc all' altro con un solo "slave" naturalmente (non essendo modbus). Ho sincronizzato con R904A come dici tu è il modo più veloce che esiste naturalmente.

L' h_elp a riguardo di R9044 e 904a dice: "The relay is TRUE if the execution of F145_WRITE or F146_READ is possible because neither instruction is active. It is FALSE if the execution of F145_WRITE or F146_READ is inhibited because one of the instructions is active."

Io se fossi in te farei così:

provalo con un master e 2 slave, registrati usando un timer per quanto tempo la R resta eccitata quando la comunicazione funziona correttamente. Fatti una registrazione su un bel buffer grande, più dati campioni e più certezze avrai, poi provi a staccare uno slave sempre tenendo la registrazione del tempo in cui rimane a 1. Una volta fatto potrai vedere il tempo medio quando la comunicazione è ok e il tempo medio di quando non funziona bene. E hai un riferimento da cui partire.. che ne dici ?

Modificato: da Stucci
Roberto Gioachin
Inserita:

Il registro di sistema "31" su Time-Out stabilisce il tempo di attesa in mancanza di comunicazione.

Questo lo puoi impostare un po' più alto del tempo massimo necessario per la trasmissione più lunga.

In alternativa puoi eseguire una trasmissione "vuota" come descritto nei manuali per ripristinare la seriale, qualora venga superato un tempo

che stabilisci a livello codice di programma.

In ogni caso devi tener presente che quando uno slave non risponde, avrai sempre un ritardo sulla comunicazione anche degli altri slave.

La sola cosa che si può fare è quella di contenere al minimo questo ritardo con i sistemi che ti ho indicato.

Per farti un esempio, se configuri tre plc per la comunicazioni in plc-link, una volta collaudato il tutto togli uno dei plc, anche in questo caso noterai un aumento

dei tempi di comunicazione, nonostante il protocollo sia ottimizzato dalla casa madre.

Ciao

Inserita:

Credo che lui voglia individuare una possibile caduta di comunicazione verso uno slave e escluderla dal ciclo in modo da non aver rallentamenti su tutti gli altri. Sarebbe bello avere un feedback da parte di Rapido.

Inserita:

Roberto Gioachin

Ho misurato il timeout se uno slave non risponde, son ca. 100ms, e ripete 2 volte automaticamente.

La mia soluzione per il momento é la seguente:

1.

Inserita:

Ho misurato il timeout se uno slave non risponde, sono ca. 100ms, e ripete 2 volte automaticamente prima di cambiare sys_bIsComPort1F145F146NotActive .

La mia soluzione per il momento é la seguente:

1. uso sys_bIsComPort1F145F146NotActive come tatto, e nello stesso momento faccio partire un timer di 50ms TM_10ms_FB per esempio.

2. il timer parte con il rising edge della variable, cioé il timer bada che il periodo di non attivitá non sia piú lungo di 50ms

3. con il tatto faccio contare un contatore CTU come un indice. Il contatore indice ha un limite in qui ritorna a 0 da se stesso.

4. La variabile contatore indice la uso per definire quale blocco FB deve essere lanciato.

5. In ogni ModBus blocco FB compaio il contatore con un numero definito AND sys_bIsComPort1F145F146NotActive. Il risultato lo uso per l´EN dello FB F145F146_Modbus_command.

Quindi:

Il contatore indice va da zero al numero di Ordini ModBus che voglio spedire. Il ciclo é infinito.

Quando il telegramma ha finito (risposta é arrivata), avviene un incremento del contatore cosiché il prossimo telegramma viene spedito.

Se un telegramma non riceve risposta, il sistema aspetta 100ms e prova due volte prima di cambiare sys_bIsComPort1F145F146NotActive che incrementa il contatore indice.

Se avviene una pausa piú lunga di 50ms perché il contatore vá a vuoto, scatta il timer ed incrementa il contatore invece del sys_bIsComPort1F145F146NotActive, cosí il contatore non si ferma mai anche se non vengono eseguiti Telegrammi ModBus.

Il tatto posso fermarlo o manipolare nel caso che voglio saltare un tatto.

In quale fila gli FB vengono eseguiti dipende dal nr. di ragguaglio che dó allo FB.

Spero che mi sono fatto capire.

Che ne dite?

Roberto Gioachin
Inserita:

Ho capito quello che hai fatto.

Tutto questo serve per creare una sequenza sulle trasmissioni verso gli slave.

Se non ho capito male tu fai in modo di continuare ad incrementare un contatore preventivamente impostato.

Se un nodo non risponde però non hai modo di toglierlo dalla lista fino a che non viene richiesto di ripristinarlo.

Un modo diverso potrebbe essere quello di puntare ad un array, all'interno del quale inserisci il numero dei nodi attivi.

In ogni caso il metodo che hai illustrato mi sembra sia da considerare già un buon lavoro.

Io ho già realizzato una cosa di questo tipo, ma ho utilizzato il linguaggio SFC

Ciao

Roberto

Inserita:

Io comunico con circa 20 inverter (la mia velocità di comunicazione però e 38.4) ed utilizzo anche il flag sys_bIsComPort1F145F146Error che viene generato dalla funzione se non riceve risposta dallo slave entro un timeout impostabile che si trova nel browser del progetto: time-out ==> tempo di attesa per funzione data transfer (nel mio caso 50ms).

Magari dico una banalità ma hai caricato la rete con una R=120ohm? In alcuni casi la rete funziona lo stesso ma caricandola sicuramente l'effecienza è maggiore.

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