Vai al contenuto
PLC Forum


Funzione linearizzazione scl


Messaggi consigliati

Inserito:

Buonasera,

sto lavorando ad un vecchio progetto scritto in awl piattaforma Siemens 

Ho una funzione che voglio trascrivere in scl (eliminando i puntatori)

 

Praticamente la funzione ha un array di 6 ingressi (real) e 6 uscite (real), un ingresso input (real), un uscita output (real) e un uscita error (bool)

 

La funzione confronta l’array e controlla che il primo valore sia inferiore al secondo valore, che il secondo sia inferiore al terzo, ecc

 

Poi fa lo stesso controllo con l’array di uscite 

 

Se ci sono incongruenze l’uscita error si alza

 

Dopodiché prende il valore input e cerca tra quali valori dell’array ingressi è compreso (esempio tra il 2 e 3)

A questo punto fa una scalatura tra le uscite 2 e 3 dell’array delle uscite e mi restituisce il valore nell’uscita output

 

 

Presumo di usare qualche ciclo for però vorrei qualche idea più chiara per iniziare.

 

Grazie.

 

P.S. Ho il codice in awl, potrei postarlo qui

 


Inserita: (modificato)

#errore := FALSE;

FOR #x := 1 TO 5 DO
    
    IF #arr_in[#x] >= #arr_in[#x + 1] THEN
        #errore := TRUE;
    END_IF;
    
    IF #arr_out[#x] >= #arr_out[#x + 1] THEN
        #errore := TRUE;
    END_IF;
    
END_FOR;

 

 

arr_in e arr_out sono definiti come array di real in InOut

errore come bool in Out

x come int in Temp

Modificato: da drn5
Inserita:
4 ore fa, Mister_X_ ha scritto:

Fatto grazie 😁

 

Meravigliosa conclusione del post...grazie per il tuo apporto costruttivo al forum!

 

Inserita:

Giusto, scusate

Di seguito il codice funzionante.

 

 

Input

InIst  Real


Output
SP    Real


InOut
In    Array[0..5] of Real

Out    Array[0..5] of Real

Errore    Bool


Temp
x    Int
Valore    Int

InMin    Real

InMax    Real

OutMin    Real

OutMax    Real

 

 


//controllo che i valori In e Out siano uno di seguito all'altro

 

#Errore := FALSE;

 

FOR #x := 0 TO 4 DO


   IF #In[#x] >= #In[#x + 1] THEN

   #Errore := TRUE;
   END_IF;

   IF #Out[#x] >= #Out[#x + 1] THEN       #Errore := TRUE;
   END_IF;

 

END_FOR;

 


//trovo tra quali valori è compreso l'ingresso istantaneo

 

IF NOT #Errore THEN


FOR #x := 0 TO 4 DO


   IF #InIst >= #In[#x] THEN

   #Valore := #x;
   END_IF;

 

END_FOR;

 


//trovo valori min e max


#InMin := #In[#Valore];

#InMax := #In[#Valore + 1];

#OutMin := #Out[#Valore];

#OutMax := #Out[#Valore + 1];

 

 


//scalatura per trovare SP


#SP := ((#InIst - #InMin) * ((#OutMax - #OutMin) / (#InMax - #InMin))) + #OutMin;

 

 

END_IF;
 

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