Vous êtes sur la page 1sur 18

Apéndice 7: Acceso Indirecto a Parámetros de FCs y FBs

OB 1 FB1 FB5

Motor 1 Regulador en
Motor 1 Regulador
lazo cerradoen
lazo cerrado . . .

FB1 FC10
Valor_medido ARRAY[1..20]
REAL
Motor 2 Suma REAL
Motor 2 Valor_medioREAL . . .

L P##Valor_medido
LAR1
FB2 L W [AR1,P#0.0]
T #Num_DB
OPN DB[Num_DB]
L D [AR1,P#2.0]
LAR1
Isla de válvulas .
Isla de válvulas . . . .
.
.

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.1

Contenido Página
Llamada a Función con Tipos de Datos Compuestos ……………..................................................... 2
Paso de Parámetros para Tipos de Datos Compuestos ………........................................................ 3
Acceso Indirecto a Tipos de Datos Compuestos ……………............................................................ 4
Paso de Parámetros para Punteros …............................................................................................... 5
Paso de Parámetros para los Tipos de Parámetros ........................................................................... 6
Características Especiales para Parámetros Actuales Elementales en DBs y Constantes .............. 7
Ejercicio A7.1: Evaluar el Parámetro Date-and-Time en una FC ....................................................... 8
Llamada a FB con Tipos de Datos Compuestos ……………............................................................. 9
Acceso Indirecto a Parámetros de Entrada/Salida ............................................................................ 10
Acceso Indirecto a Parámetros In/Out ……….................................................................................. 11
”Pasando" Parámetros …….....…..................................................................................................... 12
Ejercicio A7.2: Evaluar el Parámetro Date-and-Time en un FB .................................................... 13
Ejercicio A7.3: Evaluar Parámetros In/Out en un FB ……............................................................ 14
Solución al Ejercicio A7.1: Acceso a Parámetros DT en una FC ........................................................ 15
Solución al Ejercicio A7.2: Acceso a Parámetros DT en un FB ...................................................... 16
Solución al Ejercicio A7.3: Acceso a Parámetros In/Out en un FB (Parte 1) .................................. 17
Solución al Ejercicio A7.3: Acceso a Parámetros In/Out en un FB (Parte 2) .................................. 18

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-1 Apéndice 7: Acceso Indirecto a Parámetros
Llamada a Función con Tipos de Datos Compuestos
Ejemplo: Pasar un ARRAY a una Función
FC21

DB5 "Temperatura"

La asignación de los parámetros sólo es posible simbólicamente


Segm. 1: Valores_medidos está declarado como una matriz (array) en la FC21

CALL FC 21
Valores_medidos:="Temperatura".secuencia

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.2

Visión General Los parámetros del tipo de datos compuestos (ARRAY y STRUCT) ofrecen un
modo claro y eficiente para transferir grandes cantidades de datos relacionales
entre el bloque llamante y el llamado y así acomodar el concepto de
“Programación Estructurada”.
Se puede pasar una matriz o una estructura a una función llamada como una
variable completa.

Asignar los Para el paso, se debe declarar en la función llamada un parámetro del mismo
Parámetros tipo de datos que el parámetro actual que se debe pasar. Un parámetro como
este (tipo de dato: ARRAY, STRUCT, DATE_AND_TIME y STRING) sólo puede
ser asignado simbólicamente.
Ya que las variables del tipo de datos compuesto sólo pueden crearse en
bloques de datos o en pilas de datos locales, el parámetro actual debe estar
situado en un bloque de datos (global o DB de instancia) o en la pila de datos
locales del bloque llamante.
Después de que el Editor KOP/AWL/FUP ha comprobado la compatibilidad de
los tipos de datos del parámetro actual y el parámetro de bloque en el paso de
parámetros a una FC, sólo se pasa a la FC llamada un puntero POINTER con
el número de DB y un puntero interárea al parámetro actual.
Este puntero POINTER se crea en la Pila L Stack del bloque llamante (área V)
mediante la macro CALL. Este puntero POINTER es entonces de gran
importancia para el programador, en particular cuando se debe acceder al
parámetro pasado indirectamente (ver apéndice).

Notas • El número de datos locales ocupados puede determinarse seleccionando las


opciones de menú Edición -> Propiedades del objeto.
• Los componentes de ARRAYs o STRUCTs también pueden pasarse a un
parámetro de un bloque si el parámetro del bloque y los componentes del
ARRAY o STRUCT son del mismo tipo de datos.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-2 Apéndice 7: Acceso Indirecto a Parámetros
Paso de Parámetros para Tipos de Datos Compuestos
Pila L Stack (OB1)
Parám. actuales 1 Crear puntero
Compuestos en: POINTER
DB5: “Valor" en pila L Stack LW 21
Nº DB: 5
 Pila L Stack
CampoARRAY[1..10] puntero
 Bloque de datos INT interárea

...

OB1 Function FC10


OB1 in On ARRAY[1..10]
Ejecución del BLD 1
INT
programa out Off BOOL
= L 20.0 ...
L 5
T LW 21
CALL FC10 L P#DBX0.0
On := “Valor".Campo T LD23 ...
Off := A8.0 L #On[8]
UC FC 10 2 ...
P#L 21.0 = #Off
P#A 8.0 ...
BLD 2

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.3

Paso de Parámetros Con los tipos de datos compuestos (DT, STRING, ARRAY, STRUCT y UDT) los
parámetros actuales residen en un bloque de datos o en la pila L Stack del
bloque llamante (área V).
Ya que un puntero interárea de 32-bit no puede alcanzar un parámetro actual
en un DB, el Editor KOP/FUP/AWL guarda un "POINTER” de 48-bit que apunta
al parámetro actual en la pila L Stack del bloque llamado.
Durante una llamada, se pasa un puntero interárea de 32-bit a este "POINTER".
Dentro de la FC tiene entonces lugar un acceso al parámetro de los parámetros
actuales por medio de una ramificación doble.
La creación del puntero "POINTER" en la pila L Stack del bloque llamante tiene
lugar antes de la conexión actual con la FC llamada.

Consecuencias Los parámetros del tipo de datos compuesto son “más fáciles de llevar” que los
tipos de parámetros elementales. Los parámetros de entrada del tipo de datos
compuesto pueden ser escritos en la FC llamada sin pensarlo dos veces.
De la misma forma, los parámetros de salida pueden ser leídos sin pensarlo
dos veces.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-3 Apéndice 7: Acceso Indirecto a Parámetros
Acceso Indirecto a Tipos de Datos Compuestos
Dirección Declaración Nombre Tipo Valor inicial Comentario
0.0 in Valores_medidos ARRAY[1..8]
*4.0 REAL
32.0 out Suma REAL
36.0 out Valor_medio REAL
in_out
0.0 temp Num_DB WORD
Segm. 1: Determinar el NºDB y la dirección de comienzo

L P## Valores_medidos // Carga la dirección del POINTER en el ACCU1


LAR1 // y de allí cárgala en el AR1;
L W [AR1,P#0.0] // Determina el número de DB
T #Num_DB // y cárgalo en la variable temporal;
OPN DB[Num_DB] // Abre el DB
L D [AR1,P#2.0] // Determina el puntero de área
LAR1 // y cárgalo en AR1;

Segm. 2: Cálculo de la suma

L 0.000000e+000 // 0 al ACCU1 (suma =0.0)


L 8 // Contador al ACCU1; Suma=0 al ACCU2
BEGN: TAK // Suma al ACCU1, Contador al ACCU2
ENT // Contador al ACCU3
L D[AR1,P#0.0] // Componentes de campo al ACCU1
+R // Suma al ACCU1, contador ACCU2
+AR1 P#4.0; // Incrementa AR1 en 4 bytes
TAK // Contador de bucle al ACCU1, suma al ACCU2
LOOP BEGN; // Decrementa contador bucle y salta si necesario
T #Suma // Transfiere la suma a #Suma

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.4

Acceso Indirecto Cuando se pasan tipos de datos compuestos tales como ARRAYs y STRUCTs,
sólo puede explotarse toda la potencia si el paso de parámetros se combina con
del acceso indirecto en el bloque llamado.
Un acceso indirecto a los parámetros actuales pasados del tipo de datos
compuestos se realiza en dos pasos:
1. Primero, se determina un puntero interárea al puntero POINTER que ha sido
pasado en la pila de datos locales del llamante por medio de la operación:
L P##Valores_medidos.
2. Para el acceso actual a los parámetros actuales, es necesario entonces
evaluar la información del puntero POINTER, que hace referencia a los
actuales operandos actuales, como:
L P##Valores_medidos // devuelve un puntero interárea a POINTER
LAR1 // carga el puntero interárea en el registro de direcciones
L W[AR1,P#0.0] // devuelve el número de DB del parámetro actual, si está
// guardado en un DB, en caso contrario 0
L D[AR1,P#2.0] // devuelve punteros interárea al parámetro actual
El resultado se calcula entonces de la forma habitual.

Nota Para obtener acceso en el ejemplo superior, el programador debe establecer el


contenido del registro DB y del registro AR1 de forma que se direccione el primer
componente del campo transferido.
La instrucción
L Valores_medidos[0]
también asegura que el bloque de datos necesario se abre por medio del registro
DB y que el registro AR1 se establece al comienzo del ARRAY transferido.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-4 Apéndice 7: Acceso Indirecto a Parámetros
Paso de Parámetros para Punteros

Parámetro Pila L Stack (OB1)


POINTER y ANY ...
10H Tipo Dato: 05 LW 21
Crear puntero F.repetición.: 10
1 ANY en la Nº-DB: 0
pila L Stack puntero
interárea: P#E0.0
...
OB1

OB1 Function FC10


BLD 1
= L 20.0 in On ANY
Ejecución del L W#16#1005 out Off BOOL
programa ...
T LW 21
L 10
T LW 23
CALL FC10 L 0
On := P#E 0.0 INT 10 T LW25 ...
Off := A8.0 L P#E 0.0 2 L P##On
T LD27 ...
= #Off
UC FC 10
...
P#L 21
P#A 8.0
BLD 2

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.5

Paso de Parámetros Si se pasa un parámetro del tipo de datos "POINTER" o "ANY" a una FC,
entonces el Editor KOP/AWL/FUP crea la estructura de datos correspondiente
en la pila de datos L-Stack del bloque llamante.
Con la llamada a la FC, se pasa entonces a la FC llamada un puntero interárea
de 32-bit que apunta a esta estructura de datos ("POINTER" o "ANY").
Dentro de la FC llamada no es posible acceder a los parámetros directamente
debido a la falta de información del tipo referenciado a través este puntero
"POINTER" o "ANY".
La evaluación del contenido del "POINTER"- o - "ANY" debe llevarse a cabo por
el usuario dentro de la FC llamada.
La creación del la estructura "POINTER" o "ANY" en la pila L-Stack del bloque
llamante tiene lugar antes de la conexión actual con la FC llamada.

Excepción Una excepción de la regla anterior es el Editor KOP/AWL/FUP, cuando se crea


un parámetro actual adicional del tipo de datos “ANY” en un parámetro de
bloque del tipo “ANY”, que se guarda en la pila L-Stack del bloque llamante.
En este caso el Editor KOP/AWL/FUP no crea un puntero “ANY” adicional en la
pila L-Stack del llamante, sino que pasa directamente un puntero interárea de
32-bit al puntero “ANY” ya existente (en la pila L-Stack del llamante) en la
llamada a la FC.
Así, en ejecución, este puntero “ANY” puede ser manipulado por el bloque
llamante y así implementar una asignación “indirecta” de los parámetros
actuales a la FC.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-5 Apéndice 7: Acceso Indirecto a Parámetros
Paso de Parámetros para los Tipos Parámetro

Parámetro de bloque:
 TIMER, COUNTER
OB1
 BLOCK_xx

OB1 Function FC10


in On BLOCK_DB
Ejecución del out Off BOOL
programa ...
BLD 1
= L 20.0
CALL FC10 UC FC 10
On := DB35 P#4.3 ...
Off := A8.0 P#A 8.0 OPN #On
BLD 2 ...
= #Off
...

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.6

Paso de Parámetros El paso de parámetros del tipo: TIMER, COUNTER y BLOCK_x es el más
sencillo. En este caso, en lugar de un puntero interárea de 32-bit, simplemente
se pasa a la FC llamada el número del TIMER, o COUNTER o BLOCK_xx
actual.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-6 Apéndice 7: Acceso Indirecto a Parámetros
Características Especiales para Parámetros Actuales Elementales
en DBs y Constantes
Param. actual elemental: Pila L Stack (OB1)
 constantes DB5 1 ...
 en bloque de datos
DBB2 0 0 0 0 1 0 1 0 0 .. .. .. .. .. 0 1 .. LB 20
3 ...

OB1 Function FC10


OB1
in On_1 BOOL
Ejecución del BLD 1 in On_2 BOOL
programa = L 20.0 out Off BOOl
...
AUF DB 5
U DBX 2.2
CALL FC10 = L 20.1
On_1 := E 0.1 UC FC 10 ...
On_2 := DB5.DBX2.2 U #On_1
P#E 0.1 2
Off := DB5.DBX2.4 U #On_2
P#L 20.1 = #Off
P#L 20.2 ...
U L 20.2
AUF DB 5
= DBX 2.4
BLD 2

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.7

Paso de Parámetros Si a un parámetro de entrada, salida, o de entrada/salida de un FB se le asigna


una constante o un parámetro que está guardado en un DB, entonces el Editor
KOP/AWL/FUP reserva en primer lugar la memoria necesaria en la pila L-Stack
del llamante y copia entonces - con el parámetro de entrada y de entrada/salida
- el valor del parámetro actual en la pila L-Stack.
Para el parámetro de salida tiene lugar una reserva de memoria en la pila L-
Stack pero no una inicialización.
Sólo después de eso tiene lugar la conexión actual con la FC llamada, donde el
Editor KOP/AWL/FUP pasa, en cada caso, un puntero interárea a las zonas de
memoria de la pila L-Stack de la FC llamada.
Después de un salto de regreso al bloque llamante, los resultados - con
parámetros de salida y de entrada/salida - se copiarán de nuevo en los
parámetros actuales.

Consecuencias Este mecanismo muestra que dentro de una FC llamada sólo se pueden leer
los parámetros de entrada y sólo se puede escribir en los parámetros de salida.
Si se escribe en un parámetro de entrada, el valor correspondiente se guarda
en la pila L-Stack. Sin embargo, no se copia en los parámetros actuales
después de la ejecución de la FC.
Del mismo modo, sólo se puede escribir y no leer en los parámetros de salida.
En la lectura de un parámetro de salida se lee un valor indefinido de la pila L-
Stack debido a una falta de inicialización.
Los parámetros de entrada/salida causan los menores problemas. Se les
asignan los valores de los parámetros actuales antes de la llamada a la FC así
como se le retiran después de la llamada.

Notas Los parámetros de salida se deben escribir en la FC llamada (evitar


instrucciones como "S" y "R"), en caso contrario se copiará un valor indefinido
desde la pila L-Stack en el parámetro actual.
Si no puede asegurar que los parámetros de salida serán escritos, entonces
tiene que usar en su lugar parámetros de entrada/salida.
SITRAIN Formación en S7 NIVEL 2
Automatización y Accionamientos AP07-7 Apéndice 7: Acceso Indirecto a Parámetros
Ejercicio A7.1: Evaluar el Parámetro Date-and-Time en una FC

FC51
EN ENO

OB1_DATE_TIME IN_DT Seg AB13

Min AB12

Hora AB8

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.8

Visión General El siguiente ejercicio debería mostrarle como puede acceder indirectamente a
parámetros de entrada, salida y entrada/salida del tipo de datos compuestos
dentro de una función.
Debe usar la misma técnica si tiene que acceder indirectamente a otros tipos de
datos compuestos, como ARRAYs, STRUCTs o STRINGs.

Tarea Cree una FC51 con las siguientes propiedades:


• La FC51 tiene un parámetro de entrada #IN_DT del tipo de datos:
DATE_AND_TIME
• En sus 3 parámetros de salida #Seg, #Min and #Hora, la FC51 devuelve los
componentes segundos, minutos y horas del parámetro DT que se le pasa.

Procedimiento 1. Cree una FC51 con las propiedades requeridas.


2. Llame a la FC51 en el OB1. Provea al parámetro #IN_DT con la variable
OB1_DATE_TIME de la información inicial del OB1.
3. Cargue los bloques en la CPU y compruebe el programa.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-8 Apéndice 7: Acceso Indirecto a Parámetros
Llamada a FB con Tipos de Datos Compuestos
Ejemplo: Pasar un ARRAY a un Bloque de Función

FB17

DB2 "Temperature"

La asignación de parámetros compuestos


sólo es posible simbólicamente
Segm. 1:

CALL FB 17, DB 30
Medida_1 :="Temperatura".Cilindro
Suma_1 :=MD20
Suma_2 :=MD30
Medida_2 :="Temperatura".Eje

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.9

Tipos de Datos Como en las funciones, los operandos del tipo de datos compuestos (ARRAY,
Compuestos STRUCT, DATE_AND_TIME, y STRING) se puede pasar completamente a un
bloque de función llamado.
Para el paso, debe declararse en el bloque de función llamado un parámetro del
mismo tipo de datos que el parámetro actual que se le va a pasar.
La asignación de un parámetro de este tipo sólo es posible simbólicamente.

Parámetros de Para los parámetros de entrada y salida del tipo de datos compuestos se crean
Entrada y Salida áreas correspondientes a los valores de los parámetros individuales en el DB
de instancia. Cuando se llama al FB, los parámetros actuales del parámetro de
entrada se copian en el DB de instancia usando la SFC 20 (BLKMOV) (”paso
por valor "), antes de la conexión actual con la zona de instrucciones del FB.
De la misma manera, los valores del parámetro de salida se copian del DB de
instancia en el parámetro actual después de que el FB se haya ejecutado.
Como resultado, puede ocurrir una significante cantidad de copias (tiempo de
ejecución) en la asignación de parámetros de entrada y salida. Esta cantidad de
copias se soslaya con parámetros de entrada/salida.

Parámetros de Con los parámetros de entrada/salida del tipo de datos compuestos no ocurre
Entrada/Salida “paso por valor”. Simplemente se reservan seis bytes para cada parámetro de
entrada/salida en la zona de datos de instancia. En estos bytes se introduce un
puntero POINTER a los parámetros actuales (”paso por referencia").

Notas Los parámetros de entrada y salida del tipo de datos compuestos pueden
inicializarse en la tabla de declaración de un FB, pero no los parámetros de
entrada/salida.
Los parámetros de entrada y de salida del tipo de datos compuestos no tienen
porqué ser asignados en una llamada a un FB. Los parámetros de
entrada/salida sí tienen que ser asignados.
El acceso indirecto por memoria o por registro a parámetros de entrada/salida o
a parámetros in/out del tipo de datos compuestos es diferente al de los
parámetros del tipo de datos simples (elementales).

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-9 Apéndice 7: Acceso Indirecto a Parámetros
Acceso Indirecto a Parámetros de Entrada/Salida
Dirección Declaración Nombre Tipo Valor inicial Comentario
0.0 in Medida_1 ARRAY[1..10]
*4.0 REAL
40.0 out Suma_1 REAL 0.000000e+000
44.0 out Suma_2 REAL 0.000000e+000
48.0 in_out Medida_2 ARRAY[1..15]
*4.0 in_out REAL
54.0 stat Num_DB INT 0
Segm. 1: Determinación de la dirección inicial de Medida_1

LAR1 P##Medida_1 // carga el puntero interárea al parámetro sin


// desfase de dirección (multi-instancias) en el AR1
TAR2 // Carga el desfase de dirección en el ACCU1
+AR1 // Suma el desfase de dirección a AR1;
// AR1 apunta ahora al parámetro en el DB de instancia
// El DB de instancia ya está abierto

Segm. 2: Acceso a Medida_1

L 0.000000e+000 // 0 al ACCU1 (Suma =0.0)


L 10 // Contador al ACCU1; Suma=0 al ACCU2
BEGN: TAK // Suma al ACCU1, contador al ACCU2
ENT // Contador al ACCU3
L D[AR1,P#0.0] // Componente del campo al ACCU1
+R // Suma al ACCU1, contador al ACCU2
+AR1 P#4.0; // Incrementar AR1 en 4 bytes
TAK // contador de bucle al ACCU1, suma al ACCU2
LOOP BEGN; // Decrementar contador de bucle y saltar si necesario
T #Suma_1 // Transferir la suma a #Suma_1

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.10

Acceso Indirecto Cuando se pasan tipos de datos compuestos como ARRAYs y STRUCTs, sólo
puede explotarse toda la potencia si el paso de parámetros se combina con el
acceso indirecto dentro del bloque llamado.
Una acceso indirecto a los parámetros de entrada o salida del tipo de datos
compuestos se hace en dos pasos:
1. Primero, por medio de una instrucción:
LAR1 P##Medida_1 // envía puntero interárea al parámetro
// sin desfase de dirección
se carga en AR1 un puntero interárea a los parámetros en el DB de instancia.
El puntero determinado de esta manera contiene el identificador de área (DI)
y la misma dirección de byte.bit que también es mostrada por el Editor en la
declaración de parámetros en la primera columna de la declaración de
variables.
En el caso de una instancia múltiple, éste no corresponde con la dirección
actual del parámetro de entrada/salida en el DB de instancia. El desfase de
dirección de AR2 que identifica el comienzo del área de datos de instancia en
el caso de instancia múltiple debe sumarse al puntero en AR1.
TAR2 // Carga el desfase de dirección en ACCU1
+AR1 // Suma el desfase de dirección a AR1;
2. Después de esto, puede tener lugar el acceso actual al parámetro de
entrada/salida.
El DB de instancia no tiene que ser abierto separádamente ya que ya ha sido
abierto por la macro CALL en la llamada al FB.
L D[AR1,P#0.0] // Carga el 1º componente de Medida_1 etc.

Nota El acceso indirecto a los parámetros de entrada, salida y entrada/salida del tipo
de datos simples o a variables estáticas se realiza de la misma manera ya que
en este caso los valores de las direcciones también se guardan en el DB de
instancia.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-10 Apéndice 7: Acceso Indirecto a Parámetros
Acceso Indirecto a Parámetros In/Out
Dirección Declaración Nombre Tipo Valor inicial Comentario
0.0 in Medida_1 ARRAY[1..10]
*4.0 REAL
40.0 out Suma_1 REAL 0.000000e+000
44.0 out Suma_2 REAL 0.000000e+000
48.0 in_out Medida_2 ARRAY[1..15]
*4.0 in_out REAL
54.0 stat Num_DB INT 0
Segm. 3: Determinación de la dirección de comienzo de Medida_2

LAR1 P##Medida_2 // Carga el puntero interárea en POINTER sin desfase de


// dirección
TAR2 // cargar desfase de dirección en ACCU1, sumar a AR1;
+AR1 // AR1 apunta ahora a POINTER en el DB de instancia
L W [AR1,P#0.0] // Carga número-DB de POINTER en ACCU1
T #Num_DB // Transfiere número-DB (ó 0) a variable estática
AUF DB [#Num_DB] // Abre DB
L D [AR1,P#2.0] // Carga puntero interárea al parámetro
LAR1 // Carga puntero en AR1, AR1 apunta al parámetro

Segm. 4: Acceso a Medida_2

L 0.000000e+000 // 0 a ACCU1 (Suma =0.0)


L 15 // Contador al ACCU1; Suma=0 al ACCU2
BEGN: TAK // Suma al ACCU1, contador al ACCU2
ENT // Contador al ACCU3
L D[AR1,P#0.0] // Componentes del campo en ACCU1
+R // Suma al ACCU1, contaor al ACCU2
... // ...

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.11

Acceso Indirecto El acceso indirecto a parámetros in/out del tipo de datos compuestos difiere en
cuanto a estructura cuando se compara con el acceso a los parámetros de entrada
y salida.
Con los parámetros in/out del tipo de datos compuestos, no es el valor el que se
copia, sino sólo un POINTER al parámetro in/out en el DB de instancia.
El acceso actual tiene lugar en tres pasos:
1. Primero, por medio de la instrucción:
LAR1 P## Medida_2 // envía un puntero interárea al POINTER
un puntero interárea que es pasado al POINTER se carga en el registro AR1.
Como en el caso anterior, la dirección de byte.bit del puntero en AR1no identifica
la dirección actual del POINTER en el DB de instancia.
En el caso de una instancia múltiple, aún debe sumarse el desplazamiento de
AR2 al puntero en el Registro AR1:
TAR2 // Carga el desplazamiento de dirección en ACCU1,
// súmalo a AR1;
+AR1 // AR1 apunta ahora al POINTER en el DB de instancia;
2. En el siguiente paso, se evalúa la información del POINTER; si es necesario, se
abre el DB en el cual está situado el parámetro actual y se carga un puntero
interárea a la dirección actual en el registro AR1:
L W [AR1,P#0.0] // Carga el número de DB del POINTER al ACCU1
T #Num_DB // Transfiere el número de DB (ó 0) a la variable
AUF DB [#Num_DB] // Abre el DB
L D [AR1,P#2.0] // Carga puntero interárea al parámetro
LAR1 // Carga el puntero en AR1, AR1 apunta al parámetro
3. Después de esto, puede tener lugar el acceso actual al parámetro actual:
L D[AR1,P#0.0] // Carga el 1º componente de Medida_2 etc.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-11 Apéndice 7: Acceso Indirecto a Parámetros
“Pasando" Parámetros
Profundidad de anidamiento:
 S7-300: máx. 8 S7-400: máx. 16

OB FBs FBs FCs


...

El paso de pende del bloque, del dato y del tipo de parámetro:


Llamada FC llama FC FB llama FC FC llama FB FB llama FB
Tipo de dato E CP E CP E CP EC P
Entrada -> Entrada x - - x x - x - x x x x
Salida -> Salida x - - x x - x - - x x -
In/Out -> Entrada x - - x - - x - - x - -
In/Out -> Salida x - - x - - x - - x - -
In/Out -> In/Out x - - x - - x - - x - -

E: Tipo de dato simple (elemental)


C: Tipo de dato compuesto
P: Tipo parámetro (Temporizador, Contador, Bloque_x)

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.12

Visión General El ”paso" de parámetros de bloque es una forma especial de acceso o


asignación de parámetros de bloque. “Paso” significa que el parámetro formal
del bloque llamante se convierte en el parámetro actual del bloque llamado.

Restricciones Como regla general, el parámetro actual debe ser del mismo tipo de dato que el
Referentes al parámetro formal. Aún más, los parámetros de entrada del bloque llamante sólo
Tipo de Parámetro pueden ser creados en un párametro de entrada del bloque llamado y los
parámetros de salida sólo en parámetros de salida.
Un parámetro in/out del bloque llamante puede ser creado en principio en
parámetros de entrada, salida, y entrada/salida (in/out) del bloque llamado.

Restricciones Con respecto a los tipos de datos, hay restricciones dependiendo del diferente
Referentes al almacenamiento de los parámetros del bloque en las llamadas a la FC o FB.
Tipo de Dato Los parámetros de bloque del tipo de datos simple (elemental) pueden pasarse
sin restricciones. Los tipos de datos compuestos en parámetros de entrada y
salida sólo pueden pasarse entonces si el bloque llamante es un FB.
Los parámetros de bloque con los tipos de parámetro: TIMER, COUNTER y
BLOCK_x pueden entonces pasarse solamente de un parámetro de entrada a
un parámetro de salida, si el bloque llamado es un FB.

Nota El ”paso" de los tipos de parámetro: TIMER, COUNTER y BLOCK_x puede


implementarse en FCs con la ayuda del direccionamiento indirecto. El número
del TIMER, COUNTER o BLOCK_x deseado es pasado como un parámetro del
tipo de dato WORD desde el bloque llamante al bloque llamado, por ejemplo.
Dentro del último bloque llamado, este parámetro puede entonces ser
transferido a una variable temporal y el TIMER, COUNTER o BLOCK_x
correspondiente puede ser procesado entonces a través de esta variable.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-12 Apéndice 7: Acceso Indirecto a Parámetros
Ejercicio A7.2: Evaluar Parámetros Date-and-Time en un FB

FB83

0.0 in IN_DT DATE_AND_TIME DT#90-1-1-0:0:0.0


out
in_out
8.0 stat DUMMY ARRAY[1..100]
*2.0 stat INT
208.0 stat FB63_DT FB63

OB1_DATE_TIME IN_DT FB63


EN ENO

IN_DT Seg AB13

Min AB12

Hora AB8

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.13

Visión General El siguiente ejercicio debería mostrarle como puede acceder indirectamente a un
parámetro de entrada o salida del tipo de datos compuesto dentro de un bloque de
función con capacidad para múltiples intancias.
Debe usar la misma técnica si tiene que acceder indirectamente a otros tipos de
datos compuestos, tales como ARRAYs, STRUCTs o STRINGs.

Tarea Cree un FB63 con las propiedades siguientes:


• El FB63 tiene un parámetro de entrada #IN_DT del tipo de datos:
DATE_AND_TIME
• En sus 3 parámetros de salida #Seg, #Min and #Hora, el FB63 devuelve los
segundos, minutos y hora componentes del parámetro DT que se le pasa.

Procedimiento 1. Cree un FB63 con las propiedades requeridas.


2. Para comprobar si el FB63 generado es también realmente capaz de múltiples
instancias, llame a una instancia del FB63 en un FB de más alto nivel.
Cree un FB83 de más alto nivel. Primero, declare un parámetro de entrada
#IN_DT del tipo DT en el FB83. Entonces declare una variable estática
#DUMMY del tipo ARRAY[1..100] OF INT y una instancia del FB63 con el
nombre #FB63_DT.
3. Llame a la instancia #FB63_DT dentro del FB83 y suministre el parámetro de
entrada #IN_DT de esta instancia con el parámetro de entrada #IN_DT del
FB83.
Suministre el parámetro de salida de la instancia FB63_DT con los bytes de
salida AB8, AB12 y AB13.
4. Llame al FB83 con el DB83 de instancia en el OB1. Suministre el parámetro de
entrada #IN_DT con la variable OB1_DATE_TIME de la información de
inicio del OB1.
5. Cargue los bloques en la CPU y compruebe su programa.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-13 Apéndice 7: Acceso Indirecto a Parámetros
Ejercicio A7.3: Evaluar Parámetros In/Out en un FB

FB84

0.0 in IN_DT DATE_AND_TIME DT#90-1-1-0:0:0.0


out
in_out
8.0 stat DUMMY ARRAY[1..100]
*2.0 stat INT
208.0 stat FB64_DT FB64
...

OB1_DATE_TIME IN_DT FB64


EN ENO

IO_DT Seg AB13

Min AB12

Hora AB8

SIMATIC S7 Date: 21.11.2005


SITRAIN Formación en
Automatización y Accionamientos
Siemens S.A. 2002. Todos los derechos reservados. File: S7N2_AP07.14

Visión General El siguiente ejercicio debería mostrarle cómo puede acceder indirectamente a
parámetros in/out del tipo de datos compuestos en un blouque de función con
capacidad de múltiples instancias.
Debe usar la misma técnica si tiene que acceder indirectamente a otros tipos de
datos compuestos, tales como ARRAYs, STRUCTs o STRINGs.

Definición de la Tarea Cree un FB64 con las siguientes propiedades:


• El FB64 tiene un parámetro in/out #IO_DT del tipo de datos: DT
• En sus 3 parámetros de salida #Seg, #Min y #Hora, el FB64 devuelve los
componentes segundos, minutos y hora del parámetro DT que se le pasa.

Ejecución 1. Cree un FB64 con las propiedades requeridas.


2. Cree un FB84. Primero, declare un parámetro de entrada #IN_DT del tipo
DT en el FB84. Entonces declare una variable estática #DUMMY del tipo
ARRAY[1..100] OF INT y una instancia del FB64 con el nombre #FB64_DT
3. Llame a la instancia #FB64_DT dentro del FB84 y suministre el parámetro
in/out #IO_DT de esta instancia con el valor del parámetro de entrada
#IN_DT del FB84. Nótese que no estám permitido el paso directo de un
parámetro de entrada a un parámetro in/out. ¿Qué solución se recomienda?
Suministre el parámetro de salida de la instancia FB64_DT con los bytes de
salida AB8, AB12 y AB13, como en la tarea previa.
4. Llame al FB84 con el DB84 de instancia en el OB1. Suministre el parámetro
de entrada #IN_DT del FB84 con la variable OB1_DATE_TIME de la
información de inicio del OB1.
5. Cargue los bloques a la CPU y compruebe el programa.

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-14 Apéndice 7: Acceso Indirecto a Parámetros
Solución al Ejercicio A7.1: Acceso a Parámetros DT en una FC
FUNCTION FC 51 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR_OUTPUT
Seg : BYTE ;
Min : BYTE ;
Hora : BYTE ;
END_VAR
VAR_TEMP
Num_DB : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =
// En el caso de un parámetro de entrada, salida, o in/out del tipo de datos compuestos, para el
// paso de parámetros se transfiere a la función llamada un puntero interárea a una
// variable POINTER (6 bytes), que es creada en la pila L-Stack del llamante por la macro CALL.
// El contenido de la variable POINTER apunta a los operandos actuales. Para el acceso indirecto,
// se crea primero un puntero interárea a ester POINTER.
// En la siguiente etapa, se lee el contenido de la variable POINTER y se realiza el acceso a los
// operandos actuales a través de esta información.
//
L P##IN_DT; // Carga puntero interárea a POINTER en el ACCU1
LAR1 ; // Carga el puntero en AR1, AR1 apunta ahora al POINTER
L W [AR1,P#0.0]; // Carga el número de DB del POINTER en el ACCU1
T #Num_DB; // Transfiere el número de DB (ó 0) a la variable temporal
OPN DB [#Num_DB]; // Abre el DB
L D [AR1,P#2.0]; // Carga el puntero interárea a la variable DT del
// POINTER
LAR1 ; // Carga el puntero en AR1, AR1 apunta ahora a la variable DT
L B [AR1,P#3.0]; // Carga la componente horas de la variable DT
T #Hora; // Transfiere al parámetro de salida #Hora
L B [AR1,P#4.0]; // Carga la componente minutos de la variable DT
T #Min; // Transfiere al parámetro de salida #Min
L B [AR1,P#5.0]; // Carga la componente segundos de la variable DT
T #Seg; // Transfiere al parámetro de salida #Seg
SET ;
SAVE ; // Activa el bit BR a 1
END_FUNCTION

ORGANIZATION_BLOCK OB1
TITLE =
VERSION : 0.1
VAR_TEMP
OB1_TEMP: ARRAY[1..20] OF BYTE; //Información de inicio del OB1
BEGIN
NETWORK
TITLE =
CALL FC 51 (
IN_DT := #OB1_DATE_TIME,
Seg := AB 13,
Min := AB 12,
Hora := AB 8);
END_ORGANIZATION_BLOCK

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-15 Apéndice 7: Acceso Indirecto a Parámetros
Solución al Ejercicio A7.2: Acceso a Parámetros DT en FBs
FUNCTION_BLOCK FB 63
TITLE =
VERSION : 0.1
VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR_OUTPUT
Seg : BYTE ;
Min : BYTE ;
Hora : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =
// En el caso de un parámetro de entrada, salida del tipo de datos compuestos, el valor de
// la variable compuesta se copia en el DB de instancia.
// Para el acceso indirecto, se crea primero un puntero interárea incluyendo el desplazamiento
// de dirección AR2, lo que ocurre en el caso de una multi-instancia.
//
LAR1 P##IN_DT; // Carga el puntero interárea en #IN_DT sin el
// desplazamiento de dirección adicional en el AR2
TAR2 ; // Transfiere el desplazamiento de dirección al ACCU1 (el
// desplazamiento de dirección en el AR2 es hecho por la macro CALL)
+AR1 ; // Carga el contenido del ACCU1 (desplazamiento de dirección AR2)
// en AR1, AR1 apunta ahora a #IN_DT
L B [AR1,P#3.0]; // Carga la componente horas de la variable DT
T #Hora; // Transfiere al parámetro de salida #Hora
L B [AR1,P#4.0]; // Carga la componente minutos de la variable DT
T #Min; // Transfiere al parámetro de salida #Min
L B [AR1,P#5.0]; // Carga la componente segundos de la variable DT
T #Seg; // Transfiere al parámetro de salida #Seg
SET ;
SAVE ; // Activa el bit BR a 1
END_FUNCTION_BLOCK

FUNCTION_BLOCK FB 83
TITLE =
VERSION : 0.1

VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR
DUMMY : ARRAY [1 .. 100 ] OF INT ;
FB63_DT : FB 63;
END_VAR
BEGIN
NETWORK
TITLE =

CALL #FB63_DT (
IN_DT := #IN_DT,
Seg := AB 13,
Min := AB 12,
Hora := AB 8);

END_FUNCTION_BLOCK

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-16 Apéndice 7: Acceso Indirecto a Parámetros
Solución al Ejercicio A7.3: Acceso a Parámetros DT en FBs (1)
FUNCTION_BLOCK FB 64
TITLE =
VERSION : 0.1
VAR_OUTPUT
Seg : BYTE ;
Min : BYTE ;
Hora : BYTE ;
END_VAR
VAR_IN_OUT
IO_DT : DATE_AND_TIME ;
END_VAR
VAR_TEMP
Num_DB : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =

// En el caso de un parámetro in/out del tipo de datos compuestos, el valor de la variable


// compuesta no se copia en el DB de instancia, pero en su lugar se guarda un POINTER a los
// operandos actuales en el DB de instancia. Para el acceso indirecto, se crea primero un puntero
// interárea a este POINTER, incluyendo el desplazamiento de dirección AR2, lo cual ocurre en el
// caso de una multi-instancia.
// Después de esto, se hace el acceso a los operandos actuales de la forma habitual.

LAR1 P##IO_DT; // Carga el puntero interárea al POINTER


// sin el desplazamiento de dirección
TAR2 ; // Transfiere el desplazamiento de dirección del AR2 al ACCU1
+AR1 ; // Suma el desplazamiento de dirección al AR1, AR1 apunta ahora al
// POINTER
L W [AR1,P#0.0]; // Carga el número de DB del POINTER al ACCU1
T #Num_DB; // Transfiere el número de DB (ó 0) a la variable temporal
OPN DB [#Num_DB]; // Abre el DB
L D [AR1,P#2.0]; // Carga el puntero interárea a la variable DT desde el POINTER
LAR1 ; // Carga el puntero al AR1, AR1 apunta a la variable DT
T #Hora; // Transfiere al parámetro de salida #Hora
L B [AR1,P#4.0]; // Carga la componente minutos de la variable DT
T #Min; // Transfiere al parámetro de salida #Min
L B [AR1,P#5.0]; // Carga la componente segundos de la variable DT
T #Seg; // Transfiere al parámetro de salida #Seg
SET ;
SAVE ; // Activa el bit BR a 1

END_FUNCTION_BLOCK

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-17 Apéndice 7: Acceso Indirecto a Parámetros
Solución al Ejercicio A7.3: Acceso a Parámetros DT en FBs (2)
FUNCTION_BLOCK FB 84
TITLE =
VERSION : 0.1
VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR
DUMMY : ARRAY [1 .. 100 ] OF INT ;
FB64_DT : FB 64;
END_VAR
VAR_TEMP
DT_TEMP : DATE_AND_TIME ;
I_VAL_Ret : INT ;
END_VAR
BEGIN
NETWORK
TITLE =

CALL SFC 20 (
SRCBLK := #IN_DT,
RET_VAL := #I_VAL_Ret,
DSTBLK := #DT_TEMP);

CALL #FB64_DT (
Seg := AB 13,
Min := AB 12,
Hora := AB 8,
IO_DT := #DT_TEMP);

END_FUNCTION_BLOCK

ORGANIZATION_BLOCK OB1
TITLE =
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Evento entrante), Bits 4-7 = 1 (Clase de evento 1)
OB1_SCAN_1 : BYTE ; //1 (Ciclo de arranque en frío 1 del OB 1), 3 (Ciclo 2-n del OB 1)
OB1_PRIORITY : BYTE ; //1 (La prioridad es la más baja)
OB1_OB_NUMBR : BYTE ; //1 (Bloque de organización 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reservado para el sistema
OB1_RESERVED_2 : BYTE ; //Reservado para el sistema
OB1_PREV_CYCLE : INT ; //Tiempo de ejecución del ciclo anterior del OB1 (milisegundos)
OB1_MIN_CYCLE : INT ; //Tiempo de ciclo mínimo del OB1 (milisegundos)
OB1_MAX_CYCLE : INT ; //Tiempo de ciclo máximo del OB1 (milisegundos)
OB1_DATE_TIME : DATE_AND_TIME ; //Fecha y hora a la que arrancó el OB1
END_VAR

BEGIN
NETWORK
TITLE =

CALL FB 84 , DB 84 (
IN_DT := #OB1_DATE_TIME);

END_ORGANIZATION_BLOCK

SITRAIN Formación en S7 NIVEL 2


Automatización y Accionamientos AP07-18 Apéndice 7: Acceso Indirecto a Parámetros

Vous aimerez peut-être aussi