Vai al contenuto

Program error su compilazione programma per Slimline

Home Forum Programmazione IEC 61131 (LogicLab) Program error su compilazione programma per Slimline

Stai visualizzando 6 post - dal 1 a 6 (di 6 totali)
  • Autore
    Post
  • #35494
    Roberto
    Partecipante

    Salve, devo configurare la comunicazione tra un contatore Electrex Femto D4 dotato di RS-485 (Modbus RTU) e un modulo Slimline PCB122100 (con RS-232) ho iniziato la configurazione al logic lab aggiungendo una FB ModbusMaster
    Ho cercato di adattare la parte software funzionante della comunicazione con l’inverter Aurora Power One apportando le opportune modifiche.

    Se eseguo la compilazione del programma senza inserire il mio programs nelle task, la compilazione va a buon fine senza errori. Se inserisco il mio programs nella task: Back ricevo il seguente errore durante la compilazione del programma:

    PROGRAM ERROR
    Module: armcodegen.cpp
    Line: 7506
    Exit Program? (Yes) (No)

    Non riesco a capire dove sta l’inghippo, il target selezionato dal logic lab è: SlimLine Mps046B XTarget 11.0, ho dovuto sostituire alla precedente selezione in quanto la Mps048B XTarget 10.0 non supporta la funzione Spy_Binary inserita nella Nuova FB ModbusMaster; infatti presumo debba aggiornare il firmware dalla mia SlimLine CPU prima di effettuare il download. Ecco l’estratto della parte software:

      CASE (ElctRegIDx) OF
        10: MdbElect.Address:=220; (* Fase 1 to neutro voltage (V) *)
        11: MdbElect.Address:=221; (* Fase 2 to neutro voltage (V) *)
        …
        12: MdbElect.Address:=244; (* Potenza Attiva fase 3 Watt (W) *)
      END_CASE;

    #38011
    Sergio Bertana
    Amministratore del forum

    Partiamo dal PROGRAM ERROR, questo tipo di errore è un errore interno al LogicLab, viene generato dopo avere parsato tutto il codice sorgente ed aver generato il metacodice per la compilazione. Purtroppo la linea riportata a diferenza di altri errori di parsing del codice sorgente non è riferita al programma sorgente ma è riferita al metacodice interno, e quindi non è possibile risalire facilmente al problema.
     
    In presenza di questo errore la soluzione per trovarlo è di commentare parti di programma sorgente e ricompilare fino a trovare la parte di programma che genera l’errore. Eventualmente puoi inviarmi il progetto support[at]elsist.it per una analisi mia e/o per inviarlo ad Axel per ulteriori tests.
     
    Mi hai detto che usi una PCB122*100 quindi dovrai utilizzare un convertitore RS232/RS485 tipo ATC-105 o altri della ns gamma di convertitori. Ma perché non usi la porta RS485 del modulo CPU ?
     
    In quanto al programma come si vede dal manuale istruzioni, tutti i registri da leggere dal contatore Electrex sono su registri contigui, allora io mi eviterei il lavoro di sequenziare le letture ma utilizzerei una sola lettura di tutti i registri contemporaneamente o al limite 2 o 3 letture di gruppi di registri.

    #38012
    Sergio Bertana
    Amministratore del forum

    Aggiungo che come base di partenza puoi usare il programma indicato in questo post. Come vedi in quel caso viene sequenziata la lettura di diversi nodi, mentre tu dovrai sequenziare letture sempre dallo stesso nodo ma da registri diversi.

    #38017
    Roberto
    Partecipante

    Grazie della pronta risposta. inizio con dare le risposte alle sue domande…

    Rriguardo al convertitore ho già provveduto all’acquisto del vostro convertitore ATC-108N proprio qualche giorno fa. Riguardo l’utilizzo della porta RS-485 del modulo CPU, la stessa è già impegnata con l’acquisizione dati dall’inverter Aurora Power One.

    Grazie del suggerimento della miglioria da apportare alla sequenza di acquisizione dati dai registri di Electrex, provvederò ad effettuare le modifiche.

    Riguardo all’aggiornamento del firmware, mi conferma che è mandatorio effettuarlo prima di scaricare il mio applicativo, ovviamente ammesso che si riesca a risolvere il problema della compilazione.

    Rivedendo il mio programma, mi è sorta un’ ulteriore domanda: nell’utilizzo della FB ModbusMaster come si deve gestire il CRC, è necessario ?

    NOTA ERRORE: Sfruttando la sua idea di commentare il programma, sono riuscito ad individuare la riga che genera l’errore:

    IF (MdbElect.Ok) THEN @ElctDPtr:=TO_REAL(MdbElect.Buffer)/1000.0; END_IF;

    #38018
    Sergio Bertana
    Amministratore del forum

    L’upgrade del firmware è obbligatorio per utilizzare la nuova versione della FB, per l’upgrade guarda qui.

    La FB ModbusMaster gestisce il CRC al suo interno, lo genera per i frames di comando e lo controlla sui frames di risposta ricevuti, ed è proprio questo controllo che garantisce la correttezza dei dati.

    In effetti la riga di codice IF (MdbElect.Ok) THEN @ElctDPtr:=TO_REAL(MdbElect.Buffer)/1000.0; END_IF; genera un errore di compilazione. Ma c’è qualcosa che non mi torna, il parametro MdbElect.Buffer deve essere valorizzato con l’indirizzo del buffer che contiene i dati da scrivere/leggere tramite il comando modbus.

    Non capisco quello che tu vuoi fare con il tuo programma, in pratica stai convertendo in float un indirizzo di memoria e lo trasferisci nella memoria puntata da ElctDPtr di cui non ne conosco il tipo. Attenzione. l’uso dei puntatori è molto pericoloso bisogna sempre sapere con certezza cosa succede. Un uso improprio può portare anche ad un blocco della esecuzione del programma.

    #38025
    Sergio Bertana
    Amministratore del forum

    Tanto per creare una traccia di come effettuare la lettura dei registri dal misuratore Femto D4 della Electrex ho realizzato un semplice programma Ladder che effettua la lettura da modbus di tutti 55 registri del dispositivo. Come si vede dalla stampa del programma un unico programma Ladder gestisce la lettura Modbus di tutti i registri.

    Per chiarezza di programma ho definito una struttura dati di tipo FEMTOD4VARIABLES con la definizione di tutti i registri del dispositivo, la FB ModbusMaster provvederà a valorizzarli tutti ad ogni lettura (Nel mio programma viene eseguita una lettura ogni secondo). Come se vede dal datasheet del dispositivo i registri sono mappati a partire dall’indirizzo 200, ma il protocollo Modbus ha offset 1, e l’FB sottrae 1 dal valore di indirizzo definito perché i dispositivi Modbus dovrebbero aggiungere di default l’offset di 1. Alcuni dispositivi non fanno questa operazione percui potrebbe essere necessario definire indirizzo 201, allego programma sorgente.

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