Rapido Inserito: 29 novembre 2010 Segnala Inserito: 29 novembre 2010 salve,sono nuovo in questo sito e cerco un aiuto per programmare una FP0R con GTWIN pro come Modbus MasterForse 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 dierrori 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: 30 novembre 2010 Segnala Inserita: 30 novembre 2010 per programmare una FP0R con GTWIN pro come Modbus MasterForse ti riferisci a FPWIN-Proil comando F145F146_Modbus_command per mandare una lista di messaggi ModBus RTU a differenti slaveNo si capisce però se questa parte ti funzionaIl mio problema é il timing entro la "lista" di comandiA 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 problemiProva a spiegare meglio il problema.CiaoRoberto
Rapido Inserita: 1 dicembre 2010 Autore Segnala Inserita: 1 dicembre 2010 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
Stucci Inserita: 1 dicembre 2010 Segnala Inserita: 1 dicembre 2010 (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: 1 dicembre 2010 da Stucci
Rapido Inserita: 1 dicembre 2010 Autore Segnala Inserita: 1 dicembre 2010 Nella mia tabella . esiste "sys_bIsComPort1F145F146NotActive" due volte con differenti Indirizzi.R9044 vale per la FP0R cpu, ed infatti funziona.saluti
Stucci Inserita: 2 dicembre 2010 Segnala Inserita: 2 dicembre 2010 (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: 2 dicembre 2010 da Stucci
Roberto Gioachin Inserita: 4 dicembre 2010 Segnala Inserita: 4 dicembre 2010 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 tempoche 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 aumentodei tempi di comunicazione, nonostante il protocollo sia ottimizzato dalla casa madre.Ciao
Stucci Inserita: 6 dicembre 2010 Segnala Inserita: 6 dicembre 2010 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.
Rapido Inserita: 8 dicembre 2010 Autore Segnala Inserita: 8 dicembre 2010 Roberto GioachinHo 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.
Rapido Inserita: 8 dicembre 2010 Autore Segnala Inserita: 8 dicembre 2010 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 50ms3. 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: 9 dicembre 2010 Segnala Inserita: 9 dicembre 2010 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 SFCCiaoRoberto
Gabo Inserita: 10 dicembre 2010 Segnala Inserita: 10 dicembre 2010 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora