Vai al contenuto

Richiamo UDT in FB come InOut genera errori nella CPU


Messaggi consigliati

Inserito:

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

Inserita:

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

Inserita:

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

Inserita: (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: da drn5
Inserita:

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:

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

Inserita:

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

Inserita:

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:

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

Inserita:

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
Inserita: (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: da Mattia Spoldi
Inserita:
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:

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

Inserita:

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

Inserita:

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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...