Vai al contenuto

Chiarimenti sull’utilizzo dei blocchi funzione FB

Home Forum Programmazione IEC 61131 (LogicLab) Chiarimenti sull’utilizzo dei blocchi funzione FB

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Autore
    Post
  • #35531
    Ruben
    Partecipante

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

    #38115
    Sergio Bertana
    Amministratore del forum

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

    #38116
    Sergio Bertana
    Amministratore del forum

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

    #38118
    Ruben
    Partecipante

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

    #38119
    Sergio Bertana
    Amministratore del forum

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

    #38121
    Ruben
    Partecipante

    Stò  utilizando il programma con la FB ModbusMaster trovo i codici di errori (10007505 e 10007506) che non vedo nel manuale. Avete un manuale aggiornato ?

    #38122
    Sergio Bertana
    Amministratore del forum

    L’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).

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Devi essere connesso per rispondere a questo topic.