marcopez Inserito: 16 luglio 2020 Segnala Share Inserito: 16 luglio 2020 Buongiorno a tutti, volevo sottoporre alla vostra attenzione questa particolarità nell'uso delle variabili temp nei blocchi FC in ambiante TIA Portalv14.1. Attualmente sto utilizzando delle funzioni di libreria tipo FC da me scritte e che richiamo in blocchi FB in configurazione multistanza. Nelle FC eseguo calcoli o operazioni logiche utilizzando delle variabili temp di appoggio nei calcoli intermedi, le variabili temp sono definite all'interno del blocco FC. Ho potuto osservare che facendo un richiamo incapsulato ad esempio di una FC1 da parte di una FB10 che a sua volta è richiamata da una FB15, la FC1 non funziona regolarmente dato che si comporta come se le temp al suo interno definite, fossero delle costanti pari a zero. Per risolvere tale problema è stato necessario condividere le variabili intermedie della FC1 come IN/OUT ed appoggiarle alle temp di FB10 oppure alle static di FB10. Ho guardato sulla documentazione Siemens ma non sono riuscito a trovare informazioni su problemi di chiamate iterative multiple di blocchi FC da parte di blocchi FB. A qualcuno è mai capitato un problema simile? Non capisco se è un limite dell'ambiente di sviluppo oppure uso Io impropriamente i blocchi FC. Ogni vostra considerazione è ben gradita. Vi ringrazio anticipatamente per l'attenzione. Saluti Marco Pezzetta Link al commento Condividi su altri siti More sharing options...
batta Inserita: 16 luglio 2020 Segnala Share Inserita: 16 luglio 2020 Secondo me, stai usando le variabili temp in modo errato. Puoi pubblicare il codice della FC? Link al commento Condividi su altri siti More sharing options...
marcopez Inserita: 16 luglio 2020 Autore Segnala Share Inserita: 16 luglio 2020 Ciao, ecco il codice dichiarazioni variabili: InOut: Random - UInt temp: k - Word temp - Array[0..15] of Bool LSB - Bool codice #k := UINT_TO_WORD(#Random); SCATTER(IN := #k, OUT => #temp); #LSB := #temp[15] XOR #temp[13] XOR #temp[12] XOR #temp[10] ; #Random := SHL_UINT(IN := #Random, N := 1) + BOOL_TO_UINT(#LSB); si tratta di un banale random generator. quello che si osserva è come se l'array #temp fosse sempre nullo... Grazie Ciao da Marco Link al commento Condividi su altri siti More sharing options...
marcopez Inserita: 16 luglio 2020 Autore Segnala Share Inserita: 16 luglio 2020 Dimenticavo anche #LSB è sempre nullo...dato che si osserva lo shift verso sinistra del dato senza modifica del bit 0 Grazie Ciao da Marco Link al commento Condividi su altri siti More sharing options...
batta Inserita: 16 luglio 2020 Segnala Share Inserita: 16 luglio 2020 Il codice sempba corretto, per quanto riguarda l'uso delle variabili temp, ma non capisco il funzionamento. Fino a quando non vengono impegnati i bit 10, 12, 13 e 15 di Random, viene solo effettuato uno shift a sinistra di un bit. Poi, dopo lo shift, può essere sommato 1 oppure 0. Se Random contiene zero, rimarrà sempre a zero. Per me, il problema è a monte. Hai verificato il valore di #Random (e quindi di #k), quando entri nella funzione? Link al commento Condividi su altri siti More sharing options...
marcopez Inserita: 17 luglio 2020 Autore Segnala Share Inserita: 17 luglio 2020 Ho verificato i valori di #Random, #k, #temp ed #LSB facendoli emettere come Out dalla FC e il valore di #Random è passato giusto, tutti le altre variabili sono zero. Hai ragione sul fatto che se #Random è zero rimarrà a zero. A livello di implementazione la variabile #Random viene caricata con un valore di default diverso da zero, in generale è un fatto che l'algoritmo che ho riportato non contempla lo zero, infatti se tutto funziona regolarmente dovrebbe generare dei numeri casuali da 1 a 65535 con distribuzione uniforme. In pratica il bit0 del nuovo #Random generato viene popolato dalla parità dei bit 10, 12, 13 e 15 del #Random precedente. Ribadisco la cosa bizzarra che osservo è che le variabili temp della FC1 sembrano non sopravvivere ad un annidamento ricorsivo di tre chiamate all'interno di FB. Inserendo ad esempio la FC1 in una singola FB tutto funziona regolarmente. Per quanto sono riuscito a documentarmi sui manuali Siemens, non si parla di vincoli nell'inclusione di FC all'interno di FB. Grazie Ciao da Marco Link al commento Condividi su altri siti More sharing options...
batta Inserita: 17 luglio 2020 Segnala Share Inserita: 17 luglio 2020 Ho fatto un test come segue: FB_A | FB_B | FB_C | FB_D | FB_E | FB_F | FC_Random Le FB sono tutte annidate come multistanza. Tutto funziona. Rimangono le mie perplessità sulla funzione Random. Se parti con valore 1, fino a quando non verranno impegnati i bit 10, 12, 13, 15, è solo uno shift a sinistra di un bit, che equivale a moltiplicare per 2. E poi, chi mi garantisce che, casualmente, non possa assumere valore zero e non ripartire più? Un metodo che, a volte, si usa nei PLC per avere un numero pseudocasuale, è andare a leggere l'unitù più piccola dell'ora di sistema. Con Siemens, per esempio, nel formato DTL leggi i nanosecondi in formato UDInt. Impossibile, anche volendo, sincronizzare una scansione sui nanosecondi, quindi, questo valore, per quanto non abbia nulla di casuale, essendo letto in istanti casuali, si può assumere come valore casuale. Potresti valutare solo le 3 o 4 cifre meno significative, ed avere un valore pseudo casuale da 0 a 999, o da 0 a 9999. Se ti interessa questa soluzione, la data e ora di sistema la puoi leggere con RD_SYS_T. Link al commento Condividi su altri siti More sharing options...
marcopez Inserita: 17 luglio 2020 Autore Segnala Share Inserita: 17 luglio 2020 Ti ringrazio per le varie considerazioni, credo che sia il simulatore a questo punto ad essere il problema. Capisco la tua perplessità ma la funzione Random non và mai a zero, ammesso che la si faccia partire con un valore diverso da zero, questo l'ho verificato per dove ho potuto per ora. Molto interessante la soluzione con l'orologio di sistema, non pensavo che contenesse informazione fino ai nanosecondi, sicuramente è un'ottima alternativa. Verifico meglio il simulatore, mi conforta il fatto che almeno tu sei riuscito a far girare la FC con un grado di annidamento 6, confido che il problema sia di altro tipo Per ora ti ringrazio molto e grazie per il supporto. Un caro saluto Marco Link al commento Condividi su altri siti More sharing options...
batta Inserita: 17 luglio 2020 Segnala Share Inserita: 17 luglio 2020 1 ora fa, marcopez ha scritto: credo che sia il simulatore a questo punto ad essere il problema. Io ho provato con il simulatore PlcSim V16 upd2. Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 27 luglio 2020 Segnala Share Inserita: 27 luglio 2020 io evito di annidare e non uso FB per le rotuine. I DB di istanza per i timer TON etc li dichiaro in DB globali in forma vettoriale per disaccoppiare parti di impianto e non avere il problema di dichiarare DB di istanza Fossi in te proverei a mettere giù l'algoritmo senza troppi intoppi di FB -> FC e annidamenti vari. Fai un FC con DB globale o un FB con DB istanza e variabili statiche e provi . Le temp le uso solo per "allungare un RLC " su più segmenti. Hai tanta memoria ram da buttare usala. L'annidamento è un problema che riguarda lo stack e l'heap dei processori, annidare troppo rischi di ritrovarti problemi. In step 7 queste cose le ritrovavi dopo qualche anno, aprivi un DB di istanza e ti risultava tutto rosso con la scritta delle variabili "Stat" ....perdevi qualche bulbo di capello rimasto ed eri nella m....a. Non capisco nemmeno a cosa possa servire una funzione random in un sistema di automazione industriale. Tutt'al più se c'e', e c'e' sempre, un livello 2 su pc che fa da bridge al livello 3 etc , lo fai fare al pc il random e ti fai inviare le missioni o i dati. il plc va usato per certi scopi, la distribuzione delle carte da scopa d'assi non la vedo una cosa fattibile, però se vuoi giocare .... Link al commento Condividi su altri siti More sharing options...
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