E,A,M,L,D si indica un area di memoria dove vengono memorizzati dei bit,(ad esempio E0.0 )che possono assumere lo stato di "0" o "1",non mi e' molto chiaro l'uso e la funzionalita' delle MW(word),da quello che ho capito sono anch'esse aree di memoria il cui valore deve essere dichiarato nel blocco dati DB1
Per sommi capi, stiamo parlando della serie 300 e 400:
1) Tutte le aree di memoria, nella rappresentazione assoluta, hanno un indirizzo composto da un prefisso leterario: E(I), A(Q), M, L, etc. Con questo prefisso si individua una zona di memoria RAM per ricordare qualcosa al programmatore. Ricordare cosa?
1.1) E oppure I in inglese, anticipa gli indirizzi della RAM che la CPU alloga per appoggiare tutti i dati rilevati, (letti), dagli ingressi, siano essi schede dul bus locale o di periferia. E' sempre il programmatore che decidere come allocare la zona, tramite la configurazione hardware. E' importante sapere che, se una determinata zona di memoria, dell'immagine di processo degli ingressi, "E", è configurata a livello hardaware, è bene che il programmatori non preveda di scriverci nulla dentro, perché essa viene ciclicamente rinfrescata dalla CPU.
1.2) A oppure Q in inglese, anticipa gli indirizzi della RAM che la CPU alloca per apoggiare i dati da trasferire poi alle uscite, siano esse sul bus principale, siano esse di periferia. Tale area RAM detta immagine di processo delle uscite, contine sostanzialmente quelle che poi fisicamente sono le uscite hardware. Ma potrebbero anche essere uscite software, contenenti dati di comunicazione per altri elementi.
1.3) L individua una precisa area di memoria destinata ai dati temporanei delle funzioni, FC od FB. L'area quindi è accessibile da tutte le funzioni, è vero, ma bisogna comprendere che, la validità dei dati ha senso solo nel contesto della funzione in essere e, sicoome l'area non viene mai azzerata prima del richiamo delle funzioni, ci si trova dentro di tutto, quindi, per l'uso delle variabili locali all'interno delle funzioni, vale sempre la regola che la prima operazione deve essere di scrittura.
1.4) M invece individua un'area di memoria libera, di dimensioni variabili a seconda della CPU, (regola che vale per tutte le aree), che contiene i cosidetti merker. (Il nome ha origini storiche, vorrebbe essere un richiamo ai relè di appoggio che si usano nella soluzione dei circuiti logici, hardware o software che siano). E' poco importante questo, ma bisogna capire che: a) è molto aprezzata come area di memoria perché l'accesso ai dati è molto più veloce rispetto alle DB; b) ha lo svantaggio di non essere ritentiva, o, comunque lo è poco. Il ritegno viene fatto da un condensatore di pochi giorni, contrariamente alle DB, che vivono più a lungo, (anche se non molto). Non è un area sottoponibile a simbolici strutturati, ma è concepita per l'uso di variabili semplici, valide in tutto il contesto del programma.
2) Tutte queste aree possono essere interrogate e scritte in tutti i modi possibili: come bit, come byte, come word, come dword. La notazione sarà: E0.0 (booleano), EB0 (il byte 0, che contiene gli otto bit, compreso E0.0), EW0 (la word 0, che comprende il byte 1 ed il byte 0), ED0 (la dword 0 che comprende i byte 3, 2, 1, e 0).
3) L'uso delle lettere che precedono gli indirizzi assoluti assumono dunque grandissima importanza: individuano la zona di memoria; indicano alla CPU cosa elaborare: un bit, un byte, una word o una dword. (I due accumulatori delle CPU 300/400 sono a 32 bit, ossia 4 byte, ossia 2 word, ossia 1 dword. Quindi, tutte le operazioni hanno questo limite massimo).
4) Le DB sono un'ara di memoria più completa: innanzi tutto il loro numero bnon si limita alla DB1, ma, a seconda della CPU, arriva a valori di 65000 e rotti. I dati delle DB sono sempre tutti ritentivi, possono essere strutturati secondo strutture (udt) personali e, bellissima cosa, possono addirittura risiedere solo nella memoria di caricamento e non in quella di lavoro, (per intenderci in MMC e non in RAM). Questo chiarisce anche perché l'accesso a questi dati è molto più lento. Un programmatore avveduto fa in modo di evitare il continua accesso alle DB all'interno del suo programma, meglio se, al limite, fa uso di blocchi funzione FB con istanza, quindi usa le variabili STAT dela funzione. In questo modo l'apertura della DB è unica alla chiamata della funzione.
Pochi sanno che:
L DB1.DBB0 non vuol solo dire leggere il determinato byte, ma prima di tutto, aprire la DB1 e, se successivamente si trova:
...
L DB1.DBB1, benchè la DB1 fosse l'ultima aperta, essa viene riaperta, (con un gran dispensio di risorse da parte della CPU).
Alcuni usano:
OPN DB1
L DBB0
....
Ma in questo modo, si perdono tutti i commenti ed i simboli delle variabili. Un modo di programmare veramente brutto.
5) L'uso delle MW, come già ti dicevo, è legato al tipo di dato da manipolare: una word dichiarata nella zona M, che potrebbe essere un contatore eventi:
- Codice: Seleziona tutto
U E0.0
FP M0.0
SPB e1
L MW10
L 1
+I
T MW10
e1: nop 0
E' ad esempio il codice di un contatore che incrementa la word MW10 ad ogni fronte di salita di E0.0. Essendo una word (16 bit), arriverà fino a 65535 e poi ripartirà da 0.