PPPPPP
|
PP
PP
t
t
|
PP
PP
ttt
ttt
i
|
PP
pp
t
t
|
PPPPP
u u n nnn
t aaa
t oooo r rr
i
|
PP
u u nn n
t a
t o o
rr
i
|
PP
u u n n
t aaaaa t
o o r
i
|
PP
u uu n n
t a a
t o o
r
i
|
PP
uuu u n n ttt aaa
a ttt oooo
r
ii |
|
|
|
|
Brevissima, non completa e tanto meno
esaustiva descrizione |
sull'utilizzo, notazione e calcolo dei puntatori per i PLC
della |
famiglia S7
300.
|
|
|
|
|
|
|
|
|
|
|
|
Documento --+--
Abstract
|
|
|
+--
Cenni sui
puntatori
|
|
|
+--
Puntatore a 16
bit
|
|
|
+--
Puntatore a 32
bit
|
|
|
+--
Ultimi cenni sul
calcolo
|
|
|
+--
Cenni sugli
ANY
|
|
|
|
|
|
|
|
|
|
.
Abstract
|
|
In S7 300 esiste una famiglia di operandi e dati che prendono
il |
nome di puntatori. Questi hanno un ruolo
importantissimo sulla |
ricerca e indicizzazone dei dati. Essitono
varie possibilità |
sull'utilizzo dei puntatori, vari metodi e notazioni.
Qui si |
prenderà in considerazione solo una piccola
parte.
|
Vista la pericolosità del software
quando si utilizzano
i |
puntatori l'autore non è in alcun modo responsabile
di danni a |
persone, animali e cose provenienti dalla
lettura di questo |
documento, tutti i nomi citati come S7 300 sono
protetti dai |
marchi di fabbrica dei rispettivi
fornitori/produttori.
|
Queste note sono a carattere personale, qualunque altro
scopo e |
utilizzo deve prima essere vagliato
dall'autore.
|
In queste note spesso si useranno termini
non propriamente |
tecnici o corretti, non viene trattato l'
utilizzo di ARR e |
compagnia ... proprio per
dimostrare la potenzialità
dei |
puntatori
;-).
|
|
|
|
. Cenni sui
puntatori
|
|
S7 300 dispone di 3 tipi
dipuntatori:
|
|
.1 Puntatore a 16
Bit
|
.2 Puntatore a 32
Bit
|
.3 Puntatore parametro
ANY
|
|
Qui trateremo solo i primi due anche se
il parametro ANY
è |
a volte un chiccheria
;-).
|
Bisogna stare attenti a non confondere i primi
due parametri, |
perchè servono a cose
diverse.
|
|
|
|
. Puntatore a 16
Bit
|
|
I puntatori a 16 Bit vengono spesso usati assieme
a variabili |
temporane di tipo intero. Il loro unico scopo di esistenza
è per |
aprire i DB. L'esempio più banale infatti è proprio
questo:
|
|
AUF DB20 //
Apertura del DB
20
|
|
Se vogliamo indicizzare l'apertura del DB o
comunque
|
non essere soggetti a restrizioni possiamo,
posto
|
la variabile temporane N_DB un intero
:
|
|
L
35 // Carica
35 in
ACC1
|
T #N_DB //
Trasferisci ACC1 in
N_DB
|
|
AUF DB[#N_DB] // Qui si apre la DB
35
|
|
Lo scopo e l'utilizzo di questi puntatori è limitato
solo per |
questo utilizzo. In definitiva non si tratta di un vero
punata= |
tore come si utilizza in linguaggi tipo c/c++,
pascal, ASSEBLY |
..., ma di un operatore per aprire i
DataBlock.
|
|
|
|
. Puntatore a 32
Bit
|
|
La definizione è errata in quato non
utilizza lo spazio
di |
indirizzamento totale di 32 Bit, ma solo di una parte. Non
viene |
qui approfondito come e perchè, ma verranno
date le basi solo |
per utilizzarli subito senza tante stramberie e
perfezionamenti. |
|
Vediamo prima di tutto come è composto un byte
nel S7 300, in |
particolare si deve ricordare (a torto o a ragione che sia)
che |
in S7 300 si lavora a byte, quindi tutti i nostri
puntamenti su |
DB dovranno essere fatte a
byte.
|
|
Un byte è fatto da 8 bit accatastati, per chi
ha famigliarità |
con le liste diciamo che è la concatenazione di otto bit
8-). |
|
_0_ _1_ _2_ _3_ _4_ _5_ _6_
_7_
|
byte | | | |
| | | |
|
n_esimo
|
|___|___|___|___|___|___|___|___|
|
|
Questa è larappresentazione grafica di un byte, ovvimente
questo |
byte per essere reale farà parte di una memoria, quindi
occuperà |
un indirizzo ben preciso. Astrattamente possiamo pensare che
sia |
parte di un'area dimemoria, ad esempio un gruppo
di registri, |
che in S7 300 potrebbero essere dei Merker Byte
...
|
|
Quindi se fosse così l'idirizzo di un byte in una
macchina che |
lavora a byte dovrebbe essere rintracciato dalla
formula:
|
|
Indirizzo = n_Byte, cioè l'idirizzo di un byte in
una zona di |
memoria che inizia da 0 e
ha M byte |
contigui è proprio dato dal posto in
cui |
esso si
trova.
|
|
Paradosalmente, a dimostrazione della validità,
basti pensare |
a quando si dice quanto vale il
MB44? ebbene sì,
stiamo |
cercando il valore del byte che occuma la memoria di
registr |
M nella posizione
44!
|
|
Per nostra fortuna, il puntatore in S7 300 è un po'
più comples= |
so proprio per soperire ad alcune defficenze di questo
modo di |
ragionare. Esempio, se volessimo puntare al bit
4 del byte |
come potremo
fare?
|
|
Proprio per questo motivo S7 300 usa una notazione
diversa per |
puntare ai
dati.
|
|
Partiamo con un
esempio:
|
|
U M 5.4 //
Voglimo interogare il bit 4 del byte
5. |
|
S7 300 quindi usa un puntamento a bit e non a byte,
cosa vuol |
dire questo? Semplice, se come abbiamo impotizzato
prima, per |
calcolare l'indirizzo di un byte tramite una macchina che
lavora |
a "bit" avremmo una fromuletta del
tipo:
|
|
Indirizzo = n_Byte * 8 +
Offset_Bit
|
|
Ebbene si, con alcune riserve questa è
proprio la formula da |
utilizzare per calcolare l'idirizzo di un bit in un
byte.
|
|
Esempio:
|
|
U M 5.4 //
Interrogo il bit 4 del byte 5 dell'area
M |
|
// allo stesso
modo
|
|
L
5
//
|
ITD
// da INT A
DINT
|
L
L#8 //
carico una costante a 32
Bit
|
*D
// Moltiplicazione a 32
Bit
|
L
L#4
//
|
+D
//
|
T #INDIRIZZO // variabile temorane
DINT
|
|
U M[#INDIRIZZO] // stessa cosa di fare M
5.4
|
|
|
.
Conclusione
|
|
Pur sapendo di non aver trattato l'argomento in modo
esaustivo, |
ma di averlo sorvolato, ho mostrato con poche righe le
potenzia= |
lità dei puntatori utilizzati in modo
normalissimo, cioè
come |
semplici formulette. In conclusione una dimostrazione dell'
uso |
che si potrebbe
fare:
|
|
|
Condizioni al contorno : DB genrico, formattato come insieme
di |
byte da 0 a 100. Si vuole
scandire |
tutto il DB leggendo ogni singolo
byte |
e sostituendo il precedente con
la |
media di entrambi ;-)
...
|
In termini matematici
:
|
f(n) =
(f(n+1)+f(n))/2
|
f(Max) =
f(Max)
|
|
|
L
#i_N_DB //
Variabile di ingresso dellafunzione |
T
#N_DB
// Carico su temporanea
intera
|
|
AUF
DB[#N_DB] // Apro il DB
richiesto
|
|
L
100
//
|
Loop: T
#CONT
// TEMPORANEA
BYTE
|
L
100
// 100 - CONT = 0 ...
100
|
L
#CONT
//
|
-I
//
|
ITD
// trasformo in un
DINT
|
L
L#8
//
|
*D
// Ora ho un puntatore che punta
alla |
// (100-CONT)_esima
locazione
|
T
#PUNT
// Variabile temporanea a 32
Bit
|
L
DW#16#8
//
|
+D
//
|
T
#PUNT_1 //
Puntatora all'elemento
successiovo |
|
L
DBB[#PUNT] //
f(n)
|
L
DBB[#PUNT_1] //
f(n+1)
|
+I
// f(n+1) +
f(n)
|
L
2
//
|
/I
// (f(n+1) +
f(n))/2
|
T
DBB[PUNT]
//
|
|
L
#CONT
//
|
LOOP
Loop
//
|
|
|
Come si è visto è molto semplice utilizzare i
puntatori, questo |
metodo ha ilvantaggio di essere semplice e con poche
variabili |
supplementari andar a fare divertenti giochetti ;-), certo
però |
che per una perfetta padronaza si devono utilizzare in
congiunta |
i registri ARR ... Ma questa è tutta un'altra
storia.
|
|
|
. Ultimi cenni sul
calcolo
|
|
La forma numerica di un classico pntatore in S7 300 è
dichiarata |
in questo modo secondo la classica
notazione:
|
|
L
P#5.6
// carichiamo bit 6 byte
5
|
T
#Temp_32_bit // usiamo una
temporanea
|
U M[#Temp_32_bit] //
interoghiamo il
bit
|
|
Tutte queste stramberie nascono dalla semplice notazione che
nel |
S7 300 possiamo rappresentare i puntatori come una
sequenza di |
dove alcuni gruppi hanno particolare
significato:
|
|
Indirizzo byte Indirizzo
bit
|
_____________________
___
|
Puntatore:
xxxxxxxxxxxxxxxxxxxxx.nnn
|
|
quindi l'indirizzo per esempio : 4.2 in forma a bit
viene
|
rappresentato
come
:
100.010
|
|
Puntatore | forma a
bit |
Altri esempi per comprendere meglio :
7.5 |
111.101 |
10.7 |
1010.111 |
15.1 |
1111.001 |
16.0 |
10000.000 |
|
Senza togliere suspance a nessuno
;-) la tabellina
indica |
chiaramente la base di numerazione dei puntaori, infatti come
già |
accennato prima la base è 8, infatti 8
sono i bit del byte e |
quindi per logica anche la base deve essere
otto.
|
|
In pratica lavorando in base 8 (Ottale per la
cronaca ;-)) i |
calcoli deventono molto semplici, ma senza scomodare labase
8 e |
uttilizzando la più famigliare notazione hexadecimale, i
calcoli |
vengono semplificati,
infatti:
|
|
Puntatore a bit : N_Byte * 8_hex +
Offset_Bit
|
Puntatore a byte : N_Byte *
8_hex
|
Puntatore a word : N_Byte * 10_hex (10_hex = 16_dec =
8_dec*2) |
|
Se l'esempio di prima ivece di byte fossere state 100
word, il |
calcolo del puntatore sarebbe stato modificato e convertito
circa |
in questo
modo:
|
|
L
#CONT
|
L
DW#16#10
|
*D
|
|
Esistono molti altri giochetti che si possono fare ma questi
ven= |
gono con la
pratica.
|
|
|
|
. Cenni sugli
ANY
|
|
Più che cenni solo 2
parole.
|
I parametri ANY sono pntatori di strutture, sono lunghi
più di 4 |
Byte e la loro struttura può memorizzare che tipo di dato
è,i che |
spiazzamento di memoria si rova
...
|
L'utilizzo di questi parametri è fatto spesso in congiunta con
la |
funzione BLOK_MOVE del S7
300.
|
|
|
|
|
|
Copy right : Federico Milan,
2002 / PLC Forum ®
|
milan1@interfree.it
|
|
Il materiale è concesso solo per uso
privato,
|
qualunque altro uso deve prima essere
chiesto
|
all'autore il quale del resto non si
reputa
|
e non può in alcun modo essere
responsabile
|
di errori, false citazioni, concetti o
altro
|
che possa ledere o danneggiare
persone,
|
animali o
cose.
|
------------------------------------------------------------------------+
Scarica il file in formato *.pdf