Jump to content

Richiamo UDT in FB come InOut genera errori nella CPU


Recommended Posts

marco1278
Posted

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.

 

image.thumb.jpeg.0298cf0b4887b3161606fdb0e07777eb.jpeg

 

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.

 

image.thumb.jpeg.14b85492c7cd9dea230b92a45491c062.jpeg

 

Grazie a tutti per il supporto.

 

Ciao

Posted

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

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

 

image.thumb.jpeg.48fb992109717f30140deecf6e67c31d.jpegimage.thumb.jpeg.5b25bb25116d9cefd1f76dd114a95b28.jpegimage.thumb.jpeg.5a282020b086e7ddf85e8874f20304af.jpeg

Posted (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 by drn5
marco1278
Posted

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

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

Posted

e mi sa che ci hai proprio azzeccato. I  byVal e ByRef del C e del VB ... non ci avevo pensato...

marco1278
Posted

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

prova a postare il codice che magari gli diamo un'occhiata

marco1278
Posted

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

 

image.png.d8fc55b5f13ef43499f941654cf6dfc5.png

 

3. Le FC sono praticamente tutte con la stessa logica: fanno la parametrizzazione iniziale e richiamano la FB12

image.thumb.png.1bb7f0321875f2ec5068232135ee80cb.png

 

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

image.thumb.png.1bf0452e9e3770fedf76e38f9fd70b06.png

image.thumb.png.d2301b0a3d78c745b6de07a638139fee.png

image.thumb.png.0d92e4855d9e345f3c2073dc4ccffae9.png

image.thumb.png.6c7a15cbc40a964bd8204df94e06863c.png

image.thumb.png.fd75fd6ebe31ca97e4cac7c5e0fc4c10.png

 

 

Mattia Spoldi
Posted (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 by Mattia Spoldi
marco1278
Posted
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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...