Vai al contenuto
PLC Forum


Array Indicizzato - Si può fare?


marco_pal

Messaggi consigliati

Mi trovo nella condizione di immagazzinare dati giornalieri ora per ora quindi pensavo di usare un ARRAY [0..23]

indicizzandolo con la variabile INT ORA (che è un prograssivo da 0 a 23), ma in KOP non mi accetta la struttura indicizzata, è giusto o sto sbagliando io??

Grazie

Marco

Link al commento
Condividi su altri siti


bravo e' giusto

in Kop non si puo indicizzare ne tanto meno utilizzare i potenti puntatori

quindi devi scrivere il codice il awl oppure utilizzare un pacchetto aggiuntivo di linguaggio ad alto livello tendente al pascal che si chiama SCL.

ti do un consiglio per la tua applicazione , utilizza una matrice , ovvero un array bidimensionale

sul fronte di salita del cambio ora incrementi di 1 l'indice della "cella di memoria " che memorizza l'ora.

sul fronte si salita di questo indice che vale 23 ( se parti da zero ) incrementi l'altro indice

che punta alle giornate

index_ora:int;

index_giorni:int;

dati:array[index_ora,index_giorni] // dichiarazione matrice bidimensionale

mem:bool; //memoria per il fronte come si usava quando non esisteva la funzione fp

mem2:bool;

begin

if M0.0 and not mem then

index_ora:=index_ora+1;

mem:=true;

end_if;

if index_ora>= 23 and not mem2 then

index_giorni:=index_giorni+1;

index_ora:=0;

mem2:=true;

end_if;

if not m0.0 then // resetto il bit che memorizza lo stato di fronte di salita

mem:=false;

end_if;

if index_ora<23 then

mem2:=false;

end_if;

//scrivere o accedere ad un giorno alla tal ora

//giorno =3 (il giorno 3 del mese )

//ora=10 (alle ore 10 di mattina)

dati[3,10]:=100;

//crei di tutto questo una funzione dove chiedi in ingresso il giorno del mese e l'ora come interi

// e li elabori per esmpio cosi

var_input

giorno:int;

ora:int;

end_var

var_output

dato:int;

end_var;

begin

dato:=dati[giorno,ora];

end_function ....

....

dovrai poi implementare la lettura dell'orologio hw , per scrivere i valori nella matrice

e con un po di fantasia potrai fare un sacco di belle cose

ovviamente tutto lo puoi scrivere anche in awl , progettando per bene gli indici ed i puntatori

non e' difficle , l'importante e' conoscere tali tecnologie e fare tante prove e studiare e fare prove e studiare

ciao e buon divertimento

walter

Link al commento
Condividi su altri siti

se poi invece vai sul serio , allora ti fai un bel programmino su di un pc come supervisore

e memorizzi direttamente su file XMl o database access tutti i tuoi dati

oppure fai una chiamata dal pc e ti porti via tutta la matrice e la salvi mel pc

B);)

ciao

walter

p.s. per non diventare pazzo con i giorni del mese che a quanto pare cambiano di mese in mese

fai la matrice di 31 giorni per 24 ore

i giorni che non esisteranno ti daranno il valore 0 nella cella dedicata

Modificato: da walterword
Link al commento
Condividi su altri siti

Ovviamente la matrice 32x24 immagazzina i dati di ogni ora per un mese

se dovrai tenere in considerazione i dati di un anno

dovrai creare un'ennesima struttura per esempio di tipo array[1..12] of struct

in questo caso l'array finale , che pero e' la base di tutto , sara di tipo non primitivo

bensi di tipo della struttura creata precedentemente composta dalla matrice .

quindi poi potrai accedere ai dati cosi :

mesi:array[1..12] of tuastruttura ;

mesi[6].dati[giorno,ora]:=10;

//nel mese di giugno , il giorno che passerai come parametro alla funzione , e all'ora che passerai sempre alla funzione che gestira tutto il discorso .

questo codice sorgente awl e' il tuo caso

DATA_BLOCK DB 143

TITLE =

VERSION : 0.1

STRUCT

Mesi : ARRAY [1 .. 12 ] OF STRUCT

dati : ARRAY [1 .. 31, 0 .. 23 ] OF INT ;

END_STRUCT ;

END_STRUCT ;

BEGIN

Mesi[1].dati[1, 0] := 0;

Mesi[1].dati[1, 1] := 0;

Mesi[1].dati[1, 2] := 0;

Mesi[1].dati[1, 3] := 0;

Mesi[1].dati[1, 4] := 0;

Mesi[1].dati[1, 5] := 0;

Mesi[1].dati[1, 6] := 0;

Mesi[1].dati[1, 7] := 0;

Mesi[1].dati[1, 8] := 0;

Mesi[1].dati[1, 9] := 0;

Mesi[1].dati[1, 10] := 0;

Mesi[1].dati[1, 11] := 0;

Mesi[1].dati[1, 12] := 0;

Mesi[1].dati[1, 13] := 0;

Mesi[1].dati[1, 14] := 0;

Mesi[1].dati[1, 15] := 0;

Mesi[1].dati[1, 16] := 0;

Mesi[1].dati[1, 17] := 0;

Mesi[1].dati[1, 18] := 0;

Mesi[1].dati[1, 19] := 0;

Mesi[1].dati[1, 20] := 0;

Mesi[1].dati[1, 21] := 0;

Mesi[1].dati[1, 22] := 0;

Mesi[1].dati[1, 23] := 0;

Mesi[1].dati[2, 0] := 0;

Mesi[1].dati[2, 1] := 0;

Mesi[1].dati[2, 2] := 0;

Mesi[1].dati[2, 3] := 0;

Mesi[1].dati[2, 4] := 0;

Mesi[1].dati[2, 5] := 0;

Mesi[1].dati[2, 6] := 0;

Mesi[1].dati[2, 7] := 0;

Mesi[1].dati[2, 8] := 0;

Mesi[1].dati[2, 9] := 0;

Mesi[1].dati[2, 10] := 0;

Mesi[1].dati[2, 11] := 0;

Mesi[1].dati[2, 12] := 0;

Mesi[1].dati[2, 13] := 0;

Mesi[1].dati[2, 14] := 0;

Mesi[1].dati[2, 15] := 0;

Mesi[1].dati[2, 16] := 0;

Mesi[1].dati[2, 17] := 0;

Mesi[1].dati[2, 18] := 0;

Mesi[1].dati[2, 19] := 0;

Mesi[1].dati[2, 20] := 0;

Mesi[1].dati[2, 21] := 0;

Mesi[1].dati[2, 22] := 0;

Mesi[1].dati[2, 23] := 0;

Mesi[1].dati[3, 0] := 0;

Mesi[1].dati[3, 1] := 0;

Mesi[1].dati[3, 2] := 0;

Mesi[1].dati[3, 3] := 0;

Mesi[1].dati[3, 4] := 0;

Mesi[1].dati[3, 5] := 0;

Mesi[1].dati[3, 6] := 0;

Mesi[1].dati[3, 7] := 0;

Mesi[1].dati[3, 8] := 0;

Mesi[1].dati[3, 9] := 0;

Mesi[1].dati[3, 10] := 0;

Mesi[1].dati[3, 11] := 0;

Mesi[1].dati[3, 12] := 0;

Mesi[1].dati[3, 13] := 0;

Mesi[1].dati[3, 14] := 0;

Mesi[1].dati[3, 15] := 0;

Mesi[1].dati[3, 16] := 0;

Mesi[1].dati[3, 17] := 0;

Mesi[1].dati[3, 18] := 0;

Mesi[1].dati[3, 19] := 0;

Mesi[1].dati[3, 20] := 0;

Mesi[1].dati[3, 21] := 0;

Mesi[1].dati[3, 22] := 0;

Mesi[1].dati[3, 23] := 0;

Mesi[1].dati[4, 0] := 0;

Mesi[1].dati[4, 1] := 0;

Mesi[1].dati[4, 2] := 0;

Mesi[1].dati[4, 3] := 0;

Mesi[1].dati[4, 4] := 0;

Mesi[1].dati[4, 5] := 0;

Mesi[1].dati[4, 6] := 0;

Mesi[1].dati[4, 7] := 0;

Mesi[1].dati[4, 8] := 0;

Mesi[1].dati[4, 9] := 0;

Mesi[1].dati[4, 10] := 0;

Mesi[1].dati[4, 11] := 0;

Mesi[1].dati[4, 12] := 0;

Mesi[1].dati[4, 13] := 0;

Mesi[1].dati[4, 14] := 0;

Mesi[1].dati[4, 15] := 0;

.....

Mesi[12].dati[31, 23] := 0;

END_DATA_BLOCK

crea una sorgente awl e copia quanto scritto sopra , ricordandoti di mettere al posto dei puntini la parte rimanente

(magari fallo con excel in automatico )

poi dal menu fai compila e nella cartella blocchi troverai il tuo bel db , all'interno clicchi su visualizza->dati e sei apposto

se non vuoi utilizzare una matrice puoi utilizzare sempre un array di mesi , che contiene un'array di giorni da 1..31 che a sua volta contiene un array di ore da 0..23

in questo modo :

DATA_BLOCK DB 143

TITLE =

VERSION : 0.1

STRUCT

Mesi : ARRAY [1 .. 12 ] OF STRUCT

giorni : ARRAY [1 .. 31 ] OF STRUCT

ora : ARRAY [0 .. 23 ] OF INT ;

END_STRUCT ;

END_STRUCT ;

END_STRUCT ;

BEGIN

Mesi[1].giorni[1].ora[0] := 0;

Mesi[1].giorni[1].ora[1] := 0;

Mesi[1].giorni[1].ora[2] := 0;

....................................

Mesi[12].giorni[31].ora[23] := 0;

END_DATA_BLOCK

ti ho scritto in sorgente awl , se lo sai fare dallo step7 e' piu veloce

comunque ricordat5i che le sorgenti sono uno strumento potente di step7 e veloce .

per esempio in awl puoi fare cosi :

L 100

T DB_Dati.Mesi[1].giorni[1].ora[2]

//dbxx.struttura_principale.struttura secondaria.sottostruttura .

e' un modo interessante per rendere i dati piu piacevoli da vedere

alla fine e' sempre un 'area di memoria che parte da DB143.dbw0 fino a DB143.DBW17854

il tutto scritto in 3 minuti

quindi ti ho dato due idee , vedi tu piu di cosi io non so cosa fare .

nel primo caso la matrice e' tridimensionale composta da 3 vettori (mesi, giorni e ora)

ciao

walter

p.s. una volta sincronizzato l'orologio ti bastera prendere l'ora e ad ogni cambio incrementare l'indice dell'ora

e via dicendo con il giorno ed il mesi nell 'anno , tutto viene da solo ed automatico

se poi vuoi immagazzinare i dati di anni basta implementare aldi sopra di tutto un array da anni[1..100] di tipo struttura ed accodarci tutto il resto in ordine gerarchico come il tempo ci insegna

quindi struttura quadridimensionale :)

;):D

Modificato: da walterword
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...