Vai al contenuto
PLC Forum


S7-scl: Lavorare Con Array


hellf

Messaggi consigliati

Salve a tutti, eccomi nuovamente qui tra queste mura :)

Vi spiego il mio problema...come ho scritto qualche post fa sono neofita e sto finendo le ultime cose della tesi...

diciamo che ormai ho già fatto tutto (ho fatto un osservatore di stato non lineare per applicazioni di FDI)..a questo punto mi manca da fare un integrale definito nel tempo del tipo

int from {t-T} to {t}

la mia idea è molto semplice: faccio un integrale e poi applico una sorta di delay di T in modo tale da avere

U(t) - U(t-T)
Ho già un FB funzionante per l'integrazione numerica quindi resta da fare il delay..la mia idea è semplicemente quella di fare una queue di N elementi (con N=T) e fare una semplice sottrazione tra campione 1 e campione N e qui la nota "dolente" ovvero...come fare la coda... per ora ho fatto un codice molto semplice del tipo:
VAR_INPUT
    in : REAL;
END_VAR
VAR_OUTPUT
    out : REAL;
END_VAR
VAR
    // Variabili statiche
    QUEUE : ARRAY[1..5] OF REAL;
    index : INT := 5;
END_VAR

BEGIN

IF index > 0 THEN
    QUEUE[index] := in;
    index := index -1;
    
ELSE
    QUEUE[5] := QUEUE[4];
    QUEUE[4] := QUEUE[3];    
    QUEUE[3] := QUEUE[2];
    QUEUE[2] := QUEUE[1];
    QUEUE[1] := in;
END_IF;
out := QUEUE[5] - QUEUE[1];

Il codice funziona e in teoria fa quello che interessa a me...

il problema è che non mi piace molto la parte dell'ELSE...

qualcuno sa se esistono delle funzioni in modo da rendere il codice un pò più "bellino"?? ;)

perché, ok in questo caso ho un'array di soli 5 elementi e posso ancora scrivere un else di quel tipo, ma se ovessi usare array da più elementi decisamente sarebbe una porcheria colossale :superlol:

ps: scusate se sono stato prolisso ma ho visto da altri thread che volete più informazioni possibili e spero di essere stato esauriente!!

aspetto vostre notizie!!

pps: Grazie in anticipo a chi mi potrà aiutare :superlol: :superlol:

Link al commento
Condividi su altri siti


Ok mi rispondo da solo!! una soluzione è quella di usare, ad esempio, un WHILE:

...
ELSE
    index:=5;
    WHILE index > 1 do
        QUEUE[index] := QUEUE[index-1];  
        index:=index-1;
    END_WHILE;
    QUEUE[1] := in;  
END_IF;

Qualcun'altro conosce altre vie? tipo se esistono funzioni di shift di elementi dell'array? o queste funzioni sono da scrivere?

Link al commento
Condividi su altri siti

Ciao,

per più bello intendi più performante o contratto?

A mio avviso, trattandosi di un coda o un buffer circolare manterrei gli elementi sempre fissi al più sposterei solo l'indice iniziale e finale, così che ad ongi ingresso o estrazione muovo solo un puntatore, in modo da maggiorare le performace di velocità del codice.

Non ho un esempio in SCL ma solo AWL, ma se hai compreso il concetto ti sarà semplice realizzarlo.

ciao

Link al commento
Condividi su altri siti

Ciao Federico!!

per più bello intendi più performante o contratto?

eheh scusa per il linguaggio poco professionale :) intendevo una forma più contratta, poi ovviamente se è anche performante è meglio visto che da quanto ho letto l'scl è un pò più pesante rispetto ad altri!

A mio avviso, trattandosi di un coda o un buffer circolare manterrei gli elementi sempre fissi al più sposterei solo l'indice iniziale e finale, così che ad ongi ingresso o estrazione muovo solo un puntatore, in modo da maggiorare le performace di velocità del codice.

Effettivamente con i puntatori è sicuramente più leggero rispetto ad utilizzare un WHILE (nonostante siano solo 6 righe di codice)

ps: cosa intendi per mantenere gli elementi fissi?

Tanto per fare un esempio (ps non so come uscirà :P

    
          ______________
        |    |   |    |   |   |
2  ==> | 3 | 4 | 5 | 6 | 7 |   ==>  8
      |___|___|___|___|___|

Tu intendi che col puntatore vado a "7" e "2" (facendo una specie di sliding window?)

e che gli estremi dei puntatori mi definiscono la finestra temporale? ma in questo caso come faccio a tener memoria degli elementi?

ps: potresti (sempre che non ti crei alcun problema) farmi vedere come lo implementi su AWL?

Grazie mille per la risposta!

Modificato: da hellf
Link al commento
Condividi su altri siti

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