Chiarimenti sull’utilizzo dei blocchi funzione FB
Home › Forum › Programmazione IEC 61131 (LogicLab) › Chiarimenti sull’utilizzo dei blocchi funzione FB
- Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 11 anni, 1 mese fa da
Sergio Bertana.
-
AutorePost
-
Marzo 10, 2014 alle 6:11 pm #35531
Ruben
PartecipanteStò sviluppando un’aplicazione per lo Slimline MPS050A020, desidero lavorare con i FB’s ModbusRTUMaster_v1, CPUModuleIO e IOEncoder. Ho cercato di definire alcune variabili di input di questi FB’s nella Task “Boot” all’interno un IF SysFirstLoop THEN … END__IF, ma non lavorano come spero, ad esempio:
IF SysFirstLoop THEN
MyModBus(File:=Fp2,Timeout:=500, Delay:=10,Node:=1,Buffer:= ADR(ModBusArray),FCode:=16#10,Points:=2,Address:=16#A302);
MyCPUIO(Enable:=TRUE);
LineEncoder(APhase:= MyCPUIO.DI00, BPhase:= MyCPUIO.DI01, Enable:=TRUE);
END_IF;Dovrebbe trasmettere dopo di questa istruzione MyModBus(Enable:=TRUE); ma non lo fa. È possibile che debba inizializzare i FB’s ogni loop ? ho visto l’esempio della FB IOEncoder nel manuale e sembra uguale, mi sembra dificile capire bene come utilizzare le FB’s.
Marzo 11, 2014 alle 7:24 am #38115Sergio Bertana
Amministratore del forumIntanto ti consiglio di utilizzare la nuova FB ModbusMaster, e per acquisire gli ingressi logici del modulo CPU ti consiglio l’FB SysGetPhrDI. I blocchi funzione FB devono essere istanziati, cioè deve essere definito un oggetto del tipo del blocco funzione che si vuole utilizzare, e questo mi sembra tu l’abbia fatto hai definito ad esempio l’oggetto MyModbus di tipo ModbusMaster.
Ma la task di Boot è eseguita una sola volta al run del programma PLC quindi può essere utilizzata per inizializzare le variabili (E’ inutile il controllo IF SysFirstLoop THEN) ma non può essere utilizzata per eseguire fisicamente l’FB. Quando scrivi MyModBus(Enable:=TRUE); stai eseguendo il codice presente nel blocco funzione ed avendo messo questa chiamata nella task di Boot lo hai eseguito una sola volta.
Quindi ricapitolando la chiamata alla esecuzione del blocco funzione deve essere messa in una task eseguita ciclicamente (Fast, Slow o Back). E qui devi suddividere l’esecuzione dei blocchi funzione in base al loro specifico uso, la FB ModbusMaster andrà eseguita nella task Back, mentre la FB IOEncoder ipotizzando di dover acquisire un encoder fino a 400 Hz andrà eseguita nella task Fast.
Marzo 11, 2014 alle 7:33 am #38116Sergio Bertana
Amministratore del forumSe ho capito bene vuoi fare un programma che acquisisce un encoder utilizzando due ingressi digitali del modulo CPU ed invia il valore di quota letta tramite una scrittura Modbus verso un dispositivo con indirizzo nodo 16#01, scrivendo all’indirizzo 16#A302 con il comando Modbus 16#10 Preset multiple registers.
Ecco un esempio di programma che realizza queste specifiche come si vede dalla stampa, vi è un parte di programma per la lettura della quota encoder dagli ingressi logici eseguita in Fast e la parte di gestione Modbus eseguita in Back. Il valore di Quota per poter essere scritto dal programma di acquisizione e letto dal programma di invio Modbus è appoggiato su di una variabile globale.
Attenzione all’indirizzo del registro, l’FB Modbus sottrae 1 al valore perché di solito i dispositivi slave incrementano il valore di 1 ma devi verificare se questo avviene sul tuo dispositivo salve, in caso contrario somma 1 all’indirizzo che diventerà 16#A303. Ecco lo screenshot dei dati seriali catturati con Toolly, allego il programma sorgente.
Marzo 11, 2014 alle 8:59 am #38118Ruben
PartecipanteGrazie Bertaser, come sempre molto chiaro, ho capito tutto.
Ieri ho acquistato un modulo PCB124*000 per catturare le lettura di encoder ad alta velocità, ho inserito un nuovo post sul forum problematica generale. Vedremo se tutto va bene.
Vorrei dirti anche che la mia prima applicazione di CANOpen con il servo-azionamento è stata perfetta. Il controllore e veramente ottimo ed il vostro aiuto sempre puntuale.
Marzo 11, 2014 alle 9:16 am #38119Sergio Bertana
Amministratore del forumGrazie dei complimenti, cerchiamo se possibile di supportare i clienti nelle loro applicazioni, il nostro punto di forza vuole proprio essere questo.
La tua domanda è stata spostata qui, ti ricordo che nel caso del modulo PCB124*000 la gestione encoder è realizzata in hardware direttamente sul modulo quindi per l’acquisizione del valore di quota andrà utilizzato il blocco funzione SysGetEncoder ed è possibile acquisire encoder fino a 50 KHz di frequenza massima.
Marzo 11, 2014 alle 1:14 pm #38121Ruben
PartecipanteStò utilizando il programma con la FB ModbusMaster trovo i codici di errori (10007505 e 10007506) che non vedo nel manuale. Avete un manuale aggiornato ?
Marzo 11, 2014 alle 1:18 pm #38122Sergio Bertana
Amministratore del forumL’ultima versione del manuale la puoi scaricare dal nostro sito, ma attenzione sul manuale a volte i codici di errore sono raggruppati come nel caso dei due errori che citi. Sul manuale troverai una dicitura del tipo:
10007500~7 Errore in ricezione frame risposta (Carattere errato, lunghezza errata, CRC).
Il che significa che gli errori da 10007500 fino a 10007507 sono errori di ricezione frame di risposta, sembra che il tuo sistema risponda in modo errato al comando Modbus ricevuto. Per capire l’origine del problema occorre spiare la comunicazione tra lo SlimLine ed il tuo dispositivo e vedere cosa il dispositivo risponde.
Dalla versione SFW184A800 del sistema operativo è stata aggiunta la possibilità di spiare il funzionamento del programma da Telnet. In pratica nel programma devi attivare lo Spy sulla FB Modbus (Nella inizializzazione scrivere MyModbus.SpyOn:=TRUE;). Ora collegandosi in Telnet al modulo CPU puoi con il comando SpyData visualizzare la comunicazione (Screenshot).
-
AutorePost
- Devi essere connesso per rispondere a questo topic.