Program error su compilazione programma per Slimline
Home › Forum › Programmazione IEC 61131 (LogicLab) › Program error su compilazione programma per Slimline
- Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 11 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Gennaio 21, 2014 alle 10:27 am #35494
Roberto
PartecipanteSalve, 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;Gennaio 21, 2014 alle 1:39 pm #38011Sergio Bertana
Amministratore del forumPartiamo 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.Gennaio 21, 2014 alle 2:04 pm #38012Sergio Bertana
Amministratore del forumAggiungo 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.
Gennaio 22, 2014 alle 8:20 am #38017Roberto
PartecipanteGrazie 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;
Gennaio 22, 2014 alle 1:31 pm #38018Sergio Bertana
Amministratore del forumL’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.
Gennaio 23, 2014 alle 9:32 am #38025Sergio Bertana
Amministratore del forumTanto 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.