marco1278 Posted October 15 Report Posted October 15 Ciao a tutti, su un impianto ho una CPU S7-1500 1515-2PN e il programma scritto in Tia 14. Nel programma ho diverse FB che richiamano nei campi "InOut" delle UDT. La CPU genera in continuo errori nella diagnostica indicando che sta puntando ad aree di memoria non corrette. Con i colleghi ho provato a capire il problema andanod a creare una nuova FB e inserendo i parametri. La UDT_PID è lunga 128 byte. Se la richiamo in "Static" la lunghezza è corretta, mentre se la richiamo in "InOut" la lunghezza non è corretta; addirittura mette solo 6 byte. Sapete il perché? Tutto il programma richiama UDT in "InOut" e quindi la CPU continua a generare errori. Grazie a tutti per il supporto. Ciao
drn5 Posted October 16 Report Posted October 16 Sarebbe interessante espandere nell'interfaccia quel Var1 e Var2 per vedere come mai interpreta gli UDT da 6 byte invece che da 128... Deve essere il modo in cui sono strutturati....
marco1278 Posted October 16 Author Report Posted October 16 Ciao, ti allego la struttura dell'UDT e l'esploso di Var1 e Var2. Non so cosa pensare: magari gli errori non sono dovuti alla dichiarazione, però la diagnostica punta a tutte le variabili della UDT. Ciao
drn5 Posted October 16 Report Posted October 16 (edited) Forse sono fisime mie..ma nel UDT io completerei quella serie di 10 bool dichiarandone i rimanenti 6 che non hai messo prima di INCREMENTA. Non vedo altro... a meno che ci sia un limite/bug nel TIA14 a livello di interfaccia degli FB. Il fatto stesso che l'assegnazione dello Static con lo stesso UDT produca il giusto offset lascia perplessi. Per curiosità hai provato ad assegnare ai parametri di INput e OUTput quel UDT? Giusto per vedere se dà la stessa anomalia di Offset... Edited October 16 by drn5
marco1278 Posted October 16 Author Report Posted October 16 Non l’ho fatto io il programma. Un collega ha provato anche con Step7 su un s7-300 e fa la stessa cosa. Imposta sempre lunghezza di 6 byte. Adesso devo capire perché genera tutti quegli errori.
Mattia Spoldi Posted October 17 Report Posted October 17 ciao, non sono sicuro di quello che sto per scrivere ma penso sia giusto, quando passi dei parametri di input o di output, il passaggio viene fatto per valore, quindi se passi 800 byte di struttura, nel FB vedrai dichiarati 800 byte, quando li passi per inout, vengono passati per puntatore che, guarda caso, ha una dimensione di 6 byte, quindi penso che tu veda 6 byte perchè è la dimensione del puntatore. qui trovi qualche info in più https://support.industry.siemens.com/cs/mdm/91696622?c=44399784331&lc=it-IT
drn5 Posted October 17 Report Posted October 17 e mi sa che ci hai proprio azzeccato. I byVal e ByRef del C e del VB ... non ci avevo pensato...
marco1278 Posted October 18 Author Report Posted October 18 Grazie mille per la spiegazione. Ragionando a puntatori il tutto ha un senso. Mi resta da capire perché la cpu da errore nel puntamento 😅
Mattia Spoldi Posted October 18 Report Posted October 18 prova a postare il codice che magari gli diamo un'occhiata
marco1278 Posted October 19 Author Report Posted October 19 Ciao, spero che si riesca a leggere tutto perché ho messo il codice come immagini. La logica è questa: - OB35 impostato con tempo ciclo di 50000 microsecondi = 50ms 1. Viene eseguita in OB35 una FB che va a popolare un array di 2 booleani facendo una sorta di shift register 2. Sempre in OB35, in base al valore contenuto nell'array vengono richiamate delle FC 3. Le FC sono praticamente tutte con la stessa logica: fanno la parametrizzazione iniziale e richiamano la FB12 4. Nella FB12 vengono richiamate altre FB e viene richiamato il blocco CONT_C che è il PID. Se vado nella diagnostica gli errori puntano tutti a questa FB per tutte le variabili della UDT #IO_DB_PID che sono usate nel codice
Mattia Spoldi Posted October 20 Report Posted October 20 (edited) non ricordo esattamente perchè ormai è passato un po' di tempo, sulla v14 e precedenti c'erano dei problemi a passare dei db basati sulle udt come parametri di inout degli FB, si poteva risolvere usando i variant o dichiarando 1 udt di input, una di output e 1 statica, all' inizio del fb, copi quella di input sulla statica, lavori sulla statica, alla fine del fb copi la statica su quella di out, ovviamenti metti sia in input sia in output lo stessa db/udt altrimenti, passi tutto come variant, tenti un'assegnazione con ?= su un tipo di dato ref_to "tua udt" e poi lavori con la variabile di ref_to Edited October 20 by Mattia Spoldi
marco1278 Posted October 20 Author Report Posted October 20 4 ore fa, Mattia Spoldi ha scritto: grazie, se migrando il progetto con Tia 16 il problema si risolve, allora lo migro subito. Altrimenti devo riscrivere tutto
Mattia Spoldi Posted October 21 Report Posted October 21 non sono sicuro che si risolva, perchè comunque dipende dal firmware della cpu, però se usi i variant e i ref_to devi riscrivere poco
marco1278 Posted October 22 Author Report Posted October 22 Ieri con un collega siamo riusciti a capire. Simulando il programma abbiamo disattivato i vari richiami della FB e abbiamo capito che il problema era generato da un solo richiamo. In una chiamata alla FB veniva dichiarato nulla nella variabile IO_DB_PID e quando il programma veniva compilata, quella variabile IN/OUT spariva. Il problema è la FB la cercava lo stesso e quindi andava in errore. E' bastato far puntare la variabile a una finta DB con dentro la struttura della UDT e l'errore è sparito. Non capisco perché se la variabile serve il compilatore non genera errore e la fa sparire. I misteri di TiaPortal Grazie a tutti per il supporto :)
Mattia Spoldi Posted October 22 Report Posted October 22 4 minuti fa, marco1278 ha scritto: Ieri con un collega siamo riusciti a capire. Simulando il programma abbiamo disattivato i vari richiami della FB e abbiamo capito che il problema era generato da un solo richiamo. In una chiamata alla FB veniva dichiarato nulla nella variabile IO_DB_PID e quando il programma veniva compilata, quella variabile IN/OUT spariva. Il problema è la FB la cercava lo stesso e quindi andava in errore. E' bastato far puntare la variabile a una finta DB con dentro la struttura della UDT e l'errore è sparito. Non capisco perché se la variabile serve il compilatore non genera errore e la fa sparire. I misteri di TiaPortal Grazie a tutti per il supporto effettivamente è molto strano, normalmente se non appoggi niente sulle variabili di io ti avvisa e non compila, probabilmente sarò qualche baco dato dalla versione vecchissima
marco1278 Posted October 22 Author Report Posted October 22 Ho convertito il progetto con Tia16, lo fa lo stesso. Se non dichiaro le variabili di in/out e compilo, non viene generato nessun errore e nel codice spariscono. che cosa strana
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now