Sei sulla pagina 1di 7

Domina los punteros con formato

ANY
Una forma de leer y copiar informacin dinmica es realizarlo mediante
punteros con formato ANY.

Lo que vamos a ver es por un lado cmo se crean a mano los punteros, y
luego darle una aplicacin prctica.

Pero antes de eso, tenemos que ver un poco (o refrescar) qu es el formato


ANY.

Segn la documantacin de Siemens, [..] se utiliza cuando el tipo de datos


del parmetro actual no se conoce o cuando se puede utilizar cualquier
tipo de datos. [..]

STEP 7 almacena los datos del tipo de parmetro ANY en 10 bytes. Al


estructurar un parmetro del tipo ANY, los 10 bytes deben quedar
ocupados, ya que el bloque llamado evala todo el contenido del
parmetro. Si, por ejemplo, especifica un nmero de DB en el byte 4,
deber indicar tambin explcitamente el rea de la memoria en el byte 6.
STEP 7 gestiona los datos de los tipos de datos simples y compuestos de
forma diferente a la de los tipos de parmetros.[..]

A que ahora ya te has quedado ms tranquilo?

Bueno, pues en cristiano, lo que quiere venir a decir es que con un ANY lo
que defines es un rea de la memoria (marcas, entradas, db..) y defines la
longitud de ese rea. Adems, el puntero con formato ANY tiene
obligatoriamente 10 bytes de longitud y tienes que rellenar los 10 bytes
sean necesarios o no. As por ejemplo, puedes definir el rea definido en un
DB en concreto y que sea de un ancho de 24 bytes por poner un ejemplo.

Cmo creamos un puntero con formato ANY?

Bueno, vayamos por partes para entenderlo bien. En la siguiente figura


tienes un resumen de cmo hay que rellenar los 10 bytes que forman un
ANY en el caso de los tipos de datos simples y compuestos.

Vayamos por tanto a repasar cada byte:

Byte 0: Hay que cargar siempre un 10H. Una constante que le sirve a
Step 7 para indicar que es un ANY.

Byte 1: Tipo de datos .

Tendrs que cargar en hexadecimal en el byte 1 el nmero segn la tabla


para indicar qu tipo de datos quieres usar.

Word 2 (Byte 2 y 3): Factor de repeticin, es decir, la cantidad de items

Word 4 (Byte 4 y 5): nmero de DB. Si no es de un DB el rea de


memoria, pones un bonito 0.

Byte 6: rea de memoria. Es decir, el tipo. Lo indicamos en la siguiente


tabla:

Byte 7, 8 y 9: La direccin se almacena en formato byte.bit. La direccin


de byte se deposita en los bits 0 a 2 del byte 7, en los bits 0 a 7 del byte 8 y
en los bits 3 a 7 del byte 9, mientras que la direccin de bit se deposita en
los bits 0 a 2 del byte 9.
En el puntero nulo del tipo de datos NIL, todos los bytes estarn ocupados
con 0 a partir del byte 1.

Pero tambin se puede crear un puntero ANY con informacion sobre un


temporizador, contador o bloque. Es parecido pero no es del todo igual.
Vemoslo.

Formato ANY en los tipos de parmetros

En el caso de los tipos de parmetros, STEP 7 almacena el tipo de datos y la


direccin de los parmetros. El factor de repeticin es siempre 1. Los bytes
4, 5 y 7 son siempre 0. Los bytes 8 y 9 indican el nmero del temporizador,
del contador o del bloque.
La tabla siguiente muestra la codificacin de los tipos de datos para el
formato ANY en el caso de los tipos de parmetros.

Y para qu usamos un puntero con formato ANY?

Bueno, pues despus de todo este rollo (que est bien saber por otro lado)
vamos a ver si podemos darle una utilidad.

Lo que nos va a permitir esto es poder leer reas de los diferentes tipos de
memoria y poder escribirla en otro rea de memoria de forma dinmica.

Una aplicacin prctica para esto?

Pues por ejemplo, en los hornos de curvar parabrisas con los que trabajo,
la informacin de la pauta hay que volcarla en diferentes momentos sobre
la zona donde se est curvando. Es decir, en cada zona del horno, se lee la
informacin de potencias de esa potencia para un determinado cajn el
cual va cambiando. Es decir, tienes una zona que es dinmica y un carro
que es dinmico.
Como ves, aunque no lo vayas a aplicar todos los das, es bastante til
cuando toca.

Copiar reas de memoria usando los puntero con


formato ANY

Como ejemplo vamos a analizar un bloque para copiar dos reas de


memoria. De un DB a otro DB.

Te dejo la fuente AWL comentada para su mejor entendimiento y estudio:

[box type=shadow align=aligncenter class=clase1 width=]

FUNCTION Copiar areas MB>DB : VOID


TITLE =TRANSFER MB -> DB
VERSION : 0.0
VAR_INPUT
MBSOURCE : INT ; //DB ORIGEN
DBTARGET : INT ; //DB DESTINO
DBWTARGET : INT ; //DBW DESTINO
NBBYTE : INT ; //NUMBERO DE BYTES A TRANSFERIREND_VAR
VAR_TEMP
SOURCE : ANY ; //ANY ORIGEN
TARGET : ANY ; //ANY DESTINO
RET : INT ; //TEMPRAL RETURN
END_VAR
BEGIN
NETWORK
TITLE =COMPUTE ANY POINTER FOR SOURCE

LAR1 P##SOURCE; // CARGAMOS EN EL AR1 LA DIRECCION DEL


ORIGEN
L B#16#10; // SYNTAXIS PARA S7 (SIEMPRE ES IGUAL)
T LB [AR1,P#0.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 0

L B#16#2; // CARGAMOS EL TIPO DE DATO: BYTE


T LB [AR1,P#1.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 1
L #NBBYTE; // NUMBERO DE BYTES A TRANSFERIR
T LW [AR1,P#2.0]; // -> SE LO CARGAMOS AL ANY EN SU WORD 2

L 0; // COMO NO ES UN DB, CARGAMOS UN CERO


T LW [AR1,P#4.0]; // -> SE LO TRANSFERIMOS AL ANY EN EL WORD
4

L B#16#83; // CODIGO DE TIPO DE MEMORIA PARA MB


T LB [AR1,P#6.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 6

L B#16#0; // LA DIRECCION DE LOS 3 BITS SUPERIORES


T LB [AR1,P#7.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 7

L #MBSOURCE; // LEEMOS EL NMRO DE MB ORIGEN


SLW 3; // DESPLAZAMOS 3 POSICIONES A LA IZQUIERDA
T LW [AR1,P#8.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU WORD
8
NETWORK
TITLE =COMPUTE ANY POINTER FOR TARGET

LAR1 P##TARGET; // CARGAMOS EL DESTINO EN EL AR1

L B#16#10; // SYNTAXIS PARA S7 (SIEMPRE ES IGUAL)


T LB [AR1,P#0.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 0

L B#16#2; // CARGAMOS EL TIPO DE DATO: BYTE


T LB [AR1,P#1.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 1

L #NBBYTE; // NUMERO DE BYTES A TRANSFERIR


T LW [AR1,P#2.0]; // -> SE LO CARGAMOS AL ANY EN SU WORD 2

L #DBTARGET; // NUMERO DE DB DESTINO


T LW [AR1,P#4.0]; // -> SE LO TRANSFERIMOS AL ANY EN EL WORD
4

L B#16#85; // CODIGO DE TIPO DE MEMORIA PARA DB


T LB [AR1,P#6.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 6
L B#16#0; // LA DIRECCION DE LOS 3 BITS SUPERIORES
T LB [AR1,P#7.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 7

L #DBWTARGET; // DBW TARGET


SLW 3; // DESPLAZAMOS 3 POSICIONES A LA IZQUIERDA
T LW [AR1,P#8.0]; // -> ANY POINTER
NETWORK
TITLE =EXECUTE TRANSFER

CALL BLKMOV (// BLOCK MOVE


SRCBLK := #SOURCE,// ORIGEN
RET_VAL := #RET,// ERROR
DSTBLK := #TARGET);// DESTINO

NETWORK
TITLE =END OF BLOCK
BEA ;
END_FUNCTION

[/box]

Qu te ha parecido?

Ya s que este tipo de cosas no se usa todos los das, pero no est dems
conocerlas, saber que existe, y que es realmente potente dependiendo de lo
que necesites hacer.

lo has usado alguna vez?

Potrebbero piacerti anche