marco1278 Inserito: 15 ottobre Segnala Inserito: 15 ottobre 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 Inserita: 16 ottobre Segnala Inserita: 16 ottobre 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 Inserita: 16 ottobre Autore Segnala Inserita: 16 ottobre 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 Inserita: 16 ottobre Segnala Inserita: 16 ottobre (modificato) 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... Modificato: 16 ottobre da drn5
marco1278 Inserita: 16 ottobre Autore Segnala Inserita: 16 ottobre 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 Inserita: 17 ottobre Segnala Inserita: 17 ottobre 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 Inserita: 17 ottobre Segnala Inserita: 17 ottobre e mi sa che ci hai proprio azzeccato. I byVal e ByRef del C e del VB ... non ci avevo pensato...
marco1278 Inserita: 18 ottobre Autore Segnala Inserita: 18 ottobre 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 Inserita: 18 ottobre Segnala Inserita: 18 ottobre prova a postare il codice che magari gli diamo un'occhiata
marco1278 Inserita: 19 ottobre Autore Segnala Inserita: 19 ottobre 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 Inserita: 20 ottobre Segnala Inserita: 20 ottobre (modificato) 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 Modificato: 20 ottobre da Mattia Spoldi
marco1278 Inserita: 20 ottobre Autore Segnala Inserita: 20 ottobre 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 Inserita: 21 ottobre Segnala Inserita: 21 ottobre 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 Inserita: 22 ottobre Autore Segnala Inserita: 22 ottobre 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 Inserita: 22 ottobre Segnala Inserita: 22 ottobre 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 Inserita: 22 ottobre Autore Segnala Inserita: 22 ottobre 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
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora