Você está na página 1de 18

Apndice: Acesso Indireto a Parmetros dos FCs e FBs

OB 1

FB1

FB5

Motor 1
Motor 1

Regler
Regler

FB1

FC10
Meas_Value ARRAY[1..20]
REAL
Sum
REAL
Mean_value REAL

Motor 2
Motor 2

FB2

Ventilinsel
Ventilinsel

SIMATIC S7
Siemens AG 1999. All rights reserved.

. . .

Datum:
Datei:

L P##Meas_Value
LAR1
L
W [AR1,P#0.0]
T
#DB_Num
OPN DB[DB_Num]
L
D [AR1,P#2.0]
LAR1
.
.
.
.

04.10.2007
PRO2_15P.1

Contedo

. . .

. . .

Conhecimento em Automao
Trainings Center

Pg.

Chamada de Funes com Tipos de Dados Complexos ....................................................................


Passando Parmetros para Tipos de Dados Complexos ...................................................................
Acesso Indireto para Tipos de Dados Complexos ..............................................................................
Passando Parmetros para Ponteiros ................................................................................................
Passando Parmetros para Tipos de Parmetros ..............................................................................
Construo Especial para Parmetros Atuais Elementares em DBs e Constantes ...........................
Exerccio A.1: Avaliao do Parmetro Data e Horrio em uma FC .................................................
Chamada de FB Call com Tipos de Dados Complexos ....................................................................
Acesso Indireto a Parmetros de Entrada/Sada ................................................................................
Acesso Indireto a Parmetros de Entrada/Sada ................................................................................
"Passando" Parmetros ......................................................................................................................
Exerccio A.2: Avaliao de Parmetro Data e Horrio em um FB ....................................................
Exerccio A.3: Avaliao de Parmetros de Entrada/Sada em um FB ..............................................
Soluo do Exerccio A.1: Acesso a Parmetros DT em uma FC .....................................................
Soluo do Exerccio A.2: Acesso a Parmetros DT em uma FB ......................................................
Soluo do Exerccio A.3: Acesso a Parmetros Entrada/Sada em um FB (Parte 1) ......................
Soluo do Exerccio A.3: Acesso a Parmetros Entrada/Sada em um FB (Parte 2) ......................

Siemens Ltda.
Training Center

Pgina 1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Chamada de Funes com Tipos de Dados Complexos


Exemplo: Passando um ARRAY para uma Funo
FC21

DB5 "Temperatura"

A atribuio de parmetros somente possvel simbolicamente


Network 1: Meas_Val declarado como um array na FC21
CALL FC
21
Meas_Val:="Temperature".sequence

SIMATIC S7

Datum:
Datei:

Siemens AG 1999. All rights reserved.

04.10.2007
PRO2_15P.2

Conhecimento em Automao
Trainings Center

Vista Geral

Parmetros do tipo de dados complexos (ARRAY e STRUCT) oferecem um claro e


eficiente caminho para transferncia de grandes quantidades de dados
relacionados entre o chamado e o bloco chamado e que pode se entender pelo
conceito de "Programao Estruturada".
Um array ou uma estrutura pode ser passada para uma chamada de funo como
uma varivel completa.

Atribundo
Parmetros

Para a passagem, um parmetro do mesmo tipo de dado como o parmetro


atual a ser passado deve ser declarado na funo chamada. Como um parmetro
(tipo de dado: ARRAY, STRUCT, DATE_AND_TIME e STRING) somente pode ser
atribudo simbolicamente.
Desde que variveis do tipo de dados complexos somente podem ser configuradas
em blocos de dados ou em pilhas de dados locais, o parmetro atual deve deste
modo ser locado em um bloco de dados (DB global ou DB instance) ou na pilha de
dados local do bloco chamado.
Aps o editor STL/LAD/FBD ter verificado a compatibilidade dos tipos de dados do
parmetro atual e parmetros de bloco na passagem de parmetros de uma FC,
somente um ponteiro com o nmero do DB ou um ponteiro de rea cruzada
passado para a FC chamada para o parmetro atual.
Este POINTER configurado no L Stack do bloco chamado (rea V) atravs da
macro CALL. Este POINTER ento da maior importncia para o programador em
particular, quando o parmetro passado tem que ser acessa do indiretamente (ver
apndice).

Notas

Siemens Ltda.
Training Center

O nmero do dado local ocupado pode ser determinado pela seleo da


opo de menu View -> Block Properties.
Componentes dos ARRAYs ou STRUCTs podem tambm serem passados
para um parmetro de bloco se o parmetro de bloco e os componentes ARRAY
ou STRUCT so do mesmo tipo de dados.

Pgina 2

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Passando Parmetros para Tipos de Dados Complexos


L-Stack (OB1)

Parm. Atuais Complexos em:


z

L-Stack
z Bloco de Dados

1 configura

DB5: values

"POINTER"
no L-Stack

No. DB: 5
ponteiro de
rea cruzada

Field ARRAY[1..10]
INT

LB 21

...

Funo FC10

OB1
OB1
Execuo do
Programa
CALL FC10
On
Off

:= Value.Field
:= A8.0

BLD
=
L
T
L
T
UC

BLD

SIMATIC S7
Siemens AG 1999. All rights reserved.

in On

1
L
20.0
5
LW 21
P#DBX0.0
LD23
FC 10
P#L 21
P#A 8.0
2

Datum:
Datei:

04.10.2007
PRO2_15P.3

out Off
...

ARRAY[1..10]
INT
BOOL

...
L #On[8]
...
= #Off
...

Conhecimento em Automao
Trainings Center

Passagem de

Com tipos de dados complexos (DT, STRING, ARRAY, STRUCT e UDT) os

Parmetros

parmetros atuais dinamizam em um bloco de dados ou na pilha de dados Locais


(L-Stack) do bloco chamado (rea V).
Uma vez que um ponteiro de rea cruzada de 32 bits no pode achar um
parmetro atual em um DB, o Editor STL/LAD/FBD armazena na pilha local (LStack) do bloco chamado um "POINTER de 48 bits, que aponta para o parmetro
atual.
Durante uma chamada, um ponteiro de rea cruzada de 32 bits passado para o
"POINTER". Com a FC um acesso de parmetros de parmetros atuais ento
ocorre por meio de duplas aspas.
A configurao do "POINTER" na pilha L-Stack do bloco chamado ocorre antes do
atual chavear para o FC chamado.

Conseqncias

Os parmetros do tipo de dado complexo so mais poderosos de operar do que


tipos de parmetros elementares. Parmetros de entrada do tipo de dados
complexos podem ser escritos no FC chamado sem passos adicionais.
Deste modo, parmetros de sada podem ser processados sem passos adicionais.

Siemens Ltda.
Training Center

Pgina 3

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Acesso Indireto para Tipos de Dados Complexos


Address
0.0
*4.0
32.0
36.0
0.0

Declaration Name

Type

in

Meas_Val

out
out
in_out
temp

Sum
Mean_Val

ARRAY[1..8]
REAL
REAL
REAL

DB_Num

WORD

Start value

Comment

Network 1: Determining the DB-No. and the start address


L
LAR1
L
T
OPN
L
LAR1

P## Meas_Val
W [AR1,P#0.0]
#DB_Num
DB[DB_Num]
D [AR1,P#2.0]

//
//
//
//
//
//
//

Carrega endereo do POINTER no ACCU1


e de l carrega no AR1;
Determina o nmero do DB
e carrega na varivel temporria;
Abre DB
Determina rea pointer
e carrega no AR1;

//
//
//
//
//
//
//
//
//
//

0 no ACCU1 (sum =0.0)


Contador para ACCU1; Sum=0 p/ ACCU2
Sum p/ ACCU1, contador p/ ACCU2
Contador p/ ACCU3
Componentes do campo no ACCU1
Sum no ACCU1, contador p/ ACCU2
Incrementa AR1 de 4 bytes
Loop de contagem no ACCU1, sum no ACCU2
Decrementa loop contagem, salta se necessrio
Transfere sum para #Sum

Network 2: Clculo da soma (sum)


L
L
BEGN: TAK
ENT
L
+R
+AR1
TAK
LOOP
T

0.000000e+000
8
D[AR1,P#0.0]
P#4.0;
BEGN;
#Sum

SIMATIC S7
Siemens AG 1999. All rights reserved.

Acesso Indireto

Datum:
Datei:

Conhecimento em Automao
Trainings Center

04.10.2007
PRO2_15P.4

Quando passando tipos de dados complexos tais como ARRAYs e STRUCTs, a


potencialidade total somente pode ser alcanada se o parmetro passado
combinado com o acesso indireto com o bloco chamado.
Um acesso indireto para os parmetros atuais passados do tipo de dados
complexos feito em dois passos:
1. Primeiro, um ponteiro de rea cruzada para o POINTER que tenha sido
passado na pilha de dados locais determinado por meio da operao:
L P##Meas_Val no bloco de chamada.
2. Para o acesso atual para os parmetros atuais, este ento necessrio
avaliar a informao no POINTER, o qual referencia o operando corrente atual,
tal como:
L P##Meas_Val
// retorna ponteiro de rea cruzada para o POINTER
LAR1
// carrega ponteiro de rea cruzada no registrador de
// endereos
L W[AR1,P#0.0]
// retorna o nmero do DB do parmetro atual,se
// estiver
// armazenado em um DB, caso contrrio 0
L D[AR1,P#2.0]
// retorna ponteiro de rea cruzada para o parm.
// atual
O resultado ento calculado do modo usual.

Nota

Para obter acesso no exemplo acima, o programador deve ajustar os contedos do


registrador de DB e o registrador AR1 de forma que o primeiro componente do
campo transferrido seja endereado.
A instruo L Meas_Val[0] tambm significa que o bloco de dados requisitado est
aberto por meio do registrador de DBs e o registrador AR1 est ajustado para o
incio do ARRAY transferrido.

Siemens Ltda.
Training Center

Pgina 4

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Passando Parmetros para Ponteiros


Parmetros "POINTER"
e "ANY"

L Stack (OB1)
...

OB1
OB1
Execuo do
Programa
CALL FC10
On
Off

:= P#I0.0 10 INT
:= Q8.0

BLD
=
L
T
L
T
L
T
L
T
L
T
AC

BLD

SIMATIC S7
Siemens AG 1999. All rights reserved.

...

1
L
20.0
W#16#1005
LW 21
10
LW 23
0
LW25
P#I0.0
LD27
P#DBX0.0
LD23
FC 10
P#L 21
P#Q 8.0
2

Datum:
Datei:

LB 21

10H
Tipo dado: 05
Ajuste do
Fator repetio: 10
ponteiro "ANY"
No. DB: 0
na L Stack
Ponteiro de
(pilha Local)
rea cruzada: P#I0.0

04.10.2007
PRO2_15P.5

Funo FC10
in
out
...

On
Off

ANY
BOOL

...
L P##On
...
= #Off
...

Conhecimento em Automao
Trainings Center

Passagem de
Parmetros

Se um parmetro do tipo de dado "POINTER" ou "ANY" passado para uma


FC, ento o editor STL/LAD/FBD ajusta a estrutura de dados correspondente na
pilha Local (L-Stack) do bloco chamado.
Com a FC chamada, um ponteiro de rea cruzada 32 bits que aponta para esta
estrutura de dados ("POINTER" or "ANY") ento passada para a FC chamada.
Dentro da FC chamada no possvel acessar os parmetros diretamente devido a
perda do tipo de informao que so referenciadas atravs destes ponteiros
"POINTER" ou "ANY".
A avaliao do contedo do "POINTER" ou "ANY" deve ser executada pelo usurio
com comandos elementares STL dentro da FC chamada (ver Captulo 2).
O acentamento da estrutura "POINTER" ou "ANY" na pilha Local do bloco chamado
ocorre antes da mudana para a FC chamada.

Exceo

Uma exceo na regra acima o editor STL/LAD/FBD, quando em um parmetro


de bloco do tipo de dado ANY um parmetro atual adicional do tipo de dado
"ANY" ajustado o qual salvo na pilha L do bloco chamado.
Neste caso o editor STL/LAD/FBD no seta um ponteiro adicional "ANY" na pilha
Local do bloco que est chamando, mas passa diretamente para a FC um ponteiro
de rea cruzada para o ponteiro "ANY" j existente (na pilha L do bloco que
chama).
Ento, durante a execuo, este ponteiro "ANY" pode ser manipulado pela
chamada do bloco e ento implementa uma atribuio "indireta" da FC com
parmetros atuais.

Siemens Ltda.
Training Center

Pgina 5

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Passando Parmetros para Tipos de Parmetros


Parmetros de Bloco:
z

TIMER, COUNTER
z BLOCK_x

OB1

Funo FC10

OB1
Execuo do
Programa
CALL FC10
On
Off

:= DB35
:= A8.0

SIMATIC S7
Siemens AG 1999. All rights reserved.

Passagem de
Parmetros

Siemens Ltda.
Training Center

in On
out Off
...
BLD
=
AC

BLD

1
L
20.0
FC 10
P#4.3
P#A 8.0
2

Datum:
Datei:

04.10.2007
PRO2_15P.6

BLOCK_DB
BOOL

...
OPN #ON
...
= #Off
...

Conhecimento em Automao
Trainings Center

A passagem de parmetros do tipo: TIMER, COUNTER e BLOCK_x so


fceis. Neste caso, em vez de um ponteiro de rea cruzada de 32 bits, o nmero do
corrente TIMER ou COUNTER ou BLOCK_xs simplismente passado para a FC
chamada.

Pgina 6

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Construo Especial para Parmetros Atuais Elementares em DBs


e Constantes
Parm. elementares atuais em:

L Stack (OB1)

Constantes
z Blocos de dados

...

DBB2 0 0 0 1 0 1 0 0

.. .. .. .. .. 0 1 ..
3

LB 20

...

DB5
OB1

Funo FC10
OB1

Execuo do
Programa
CALL FC10
On_1 := I0.1
On_2 := DB5.DBX2.2
Off
:= DB6.DBX2.6

SIMATIC S7
Siemens AG 1999. All rights reserved.

BLD
=
OPN
A
=
AC

1
L
DB
DBX
L
FC
P#I
P#L
P#L
A
L
OPN
DB
= DBX
BLD
2

Datum:
Datei:

20.0
5
2.2
20.1
10
0.1
20.1
20.2
20.2
5
2.6

04.10.2007
PRO2_15P.7

in
in
out
...

On_1
On_2
Off

BOOL
BOOL
BOOl

...
A #On_1
A #On_2
= #Off
...

Conhecimento em Automao
Trainings Center

Passem de
Parmetros

Se um parmetro de entrada, sada ou entrada/sada atribudo com uma


constante ou com um parmetro, que est guardado em um DB, ento o editor
STL/LAD/FBD primeiro de tudo reserva a memria necessria na pilha L do bloco
que chama e ento copia (com o parmetro de entrada e entrada/sada) o valor do
parmetro atual na pilha local.
Para o parmetro de sada, uma reserva de rea de memria na pilha local ocorre
mas sem inicializao.
Somente depois disto, ocorre a troca do atual na FC chamada, deste modo o editor
STL/LAD/FBD passa em cada caso um ponteiro de rea cruzada para a rea de
memria na pilha local da FC chamada.
Aps um salto para trs no bloco chamado, o resultado (com parmetros de sada
e entrada/sada) ser copiado nos parmetros atuais.

Conseqncias

Este mecanismo mostra que dentro de uma FC chamada, parmetros de entrada


somente podem ter verificao de estado e parmetros de sada somente podem
ser escritos.
Se um parmetro de entrada escrito, ento atravs do valor correspondente
armazenado na pilha local, aps o processamento da FC nenhum dado
transferido para os parmetros atuais.
Do mesmo modo, parmetros de sada somente podem ser escritos e no lidos.
Com a leitura de um parmetro de sada um valor indefinido lido da pilha local
devido a perda da inicializao.
Parmetros in/out causam estes problemas. Eles so atribudos com os valores de
parmetros atuais antes da chamada bem como aps a chamada.

Importante

Parmetros de sada devem se escritos em uma FC chamada (atravs de


instrues como S e R), pelo contrrio um valor indefinido da pilha local ser
copiado no parmetro atual.
Se voc no pode se certificar que parmetros de sada sero escritos, voc ter
de usar parmetros in/out em seu lugar.

Siemens Ltda.
Training Center

Pgina 7

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Exerccio A.1: Avaliao do Parmetro Data e Horrio em uma FC

FC51
EN
OB1_DATE_TIME

SIMATIC S7

IN_DT

Datum:
Datei:

Siemens AG 1999. All rights reserved.

Vista Geral

ENO
Sec

QB13

Min

QB12

Hour

QB8

Conhecimento em Automao
Trainings Center

04.10.2007
PRO2_15P.8

O seguinte exerccio dever demonstrar como voc pode acessar indiretamente


parmetros de entrada, sada e transientes dos tipos de dados complexos dentro
de uma funo.
Voc deve usar a mesma tecnologia se voc tiver que acessar indiretamente outros
tipos de dados complexos, tais como ARRAYs, STRUCTs ou STRINGs.

Definio da Tarefa

Execuo

Criar uma FC51 com as seguintes propriedades:

A FC51 tem um parmetro de entrada #IN_DT do tipo de dado:


DATE_AND_TIME

Nestes 3 parmetros de sada #Sec, #Min e #Hour, a FC51 retorna


componentes segundos, minutos e horas do parmetro DT passado a ele.

1. Criar uma FC51 com as propriedades necessrias.


2. Chamar a FC51 no OB1. Alimentar o parmetro de bloco #IN_DT com a
varivel OB1_DATE_TIME das informaes de partida do OB1.
3. Carregar os blocos para a CPU e testar o programa.

Siemens Ltda.
Training Center

Pgina 8

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Chamada de FB Call com Tipos de Dados Complexos


Exemplo: Passando ARRAYs para um Bloco de Funes
FB17

DB2 "Temperature"

Atribundo parmetros complexos


somente possvel simbolicamente
Network 1:
CALL FB
Meas_1
Sum_1
Sum_2
Meas_2

17, DB 30
:="Temperature".Cylinder
:=MD20
:=MD30
:="Temperature".Shaft

SIMATIC S7
Siemens AG 1999. All rights reserved.

Datum:
Datei:

04.10.2007
PRO2_15P.9

Conhecimento em Automao
Trainings Center

Tipos de Dados
Complexos

Do mesmo modo que com as funes, endereamento de tipos de dados


complexos (ARRAY, STRUCT, DATE_AND_TIME e STRING) podem ser passados
completamente para um bloco de funes chamado.
Para a passagem, um parmetro do mesmo tipo de dado como um parmetro atual
a ser passado deve ser declarado no bloco de funes chamado.
A atribuio como um parmetro somente possvel simbolicamente.

Parmetros de
Entrada e Sada

Para parmetros de entrada e sada do tipo de dados complexos, reas


correspondentes para os valores dos parmetros atuais so acentadas no DB
instance. Quando chamando o FP, os parmetros atuais dos parmetros de
entrada so ento copiados no DB instance usando a SFC 20 (BLKMOV)
("passando pelo valor"), antes o atual chaveia para a seo de instrues do FP.
Do mesmo modo, os valores dos parmetros de sada so copiados do DB
instance de volta para os parmetros atuais aps o FP ter sido processado.
Como um resultado, uma quantidade no significante de cpias (tempo do
processamento) pode ocorrer na atribuio dos parmetros de entrada e sada.
Esta quantidade de cpias so baipassadas com parmetros in/out.
Nenhuma "passagem pelo valor" ocorre com parmetros in/out do tipo de dados
complexos. Seis bites so meramente reservados para cada parmetro in/out na
rea de dados instance. Um POINTER para os parmetros atuais inserido nestes
bites ("passagem por referncia").
Parmetros de entrada e sada do tipo de dados complexos podem ser inicializados
na seo de declaraes de um FP, mas no como parmetros in/out.
Parmetros de entrada e sada do tipo de dados complexos no tem que ser
atribudos na chamada de um FB, parmetros in/out tem que ser atribudos.
O acesso a memria ou registro indireto a parmetros entrada/sada ou parmetros
in/out do tipo de dados complexos diferente dos parmetros elementares.

Parmetros In/out

Notas

Siemens Ltda.
Training Center

Pgina 9

ST-7PRO2
Anexo: Acesso Indireto a Parmetros

Acesso Indireto a Parmetros de Entrada/Sada


Address
0.0
*4.0
40.0
44.0
48.0
*4.0
54.0

Declaration Name

Type

in

Meas_1

out
out
in_out
in_out
stat

Sum_1
Sum_2
Meas_2

ARRAY[1..10]
REAL
REAL
REAL
ARRAY[1..15]
REAL
INT

DB_Num

Start value

Comment

0.000000e+000
0.000000e+000

Network 1: Determinando o endereo de incio do Meas_1


LAR1 P##Meas_1
TAR2
+AR1

//
//
//
//
//
//

Carrega ponteiro de rea cruzada p/parmetro sem


offset de endereo (multi-instances) no AR1
Carrega offset de endereo no ACCU1
Soma offset de endereo no AR1;
AR1 agora aponta p/parmetros no DB instance
DB instance j est aberto

Network 2: Acesso para Meas_1


L
L
BEGN: TAK
ENT
L
+R
+AR1
TAK
LOOP
T

0.000000e+000
10
D[AR1,P#0.0]
P#4.0;
BEGN;
#Sum_1

//
//
//
//
//
//
//
//
//
//

0 no ACCU1 (Soma =0.0)


Contador para ACCU1; Sum=0 p/ ACCU2
Sum no ACCU1, contador no ACCU2
Contador p/ ACCU3
Campo de componente no ACCU1
Soma no ACCU1, contador p/ ACCU2
Incrementa AR1 em 4 bytes
Loop de contagem no ACCU1, soma no ACCU2
Decrementa loop de contagem e salta se necessrio
Transfere soma para #Sum_1

SIMATIC S7

Datum:
Datei:

Siemens AG 1999. All rights reserved.

Acesso Indireto

04.10.2007
PRO2_15P.10

Conhecimento em Automao
Trainings Center

Quando passando tipos de dados complexos tais como ARRAYs e STRUCTs, a


potncia total somente pode ser explorada se o parmetro passado combinado
com o acesso indireto dentro do bloco chamado.
Um acesso indireto ao parmetro atual passado feito em dois passos:
1. Primeiro, por meio da operao:
LAR1 P##Meas_1 // retorna ponteiro de rea cruzada p/parmetro
// sem offset de endereo
um ponteiro de rea cruzada para os parmetros no DB instance carregado
no AR1.
O ponteiro determinado deste modo contem o identificador de rea ID e o
mesmo endereo byte.bit que tambm mostrado pelo editor durante a
declarao de parmetros na primeira coluna da parte de declaraes.
No caso de um multi-instance, este no corresponde ao endereo atual
do
parmetro de entrada/sadano DB instance. Este tambm necessrio para
somar o offset de endereo do AR2, o qual identifica o
incio da rea de dados
instance no caso multi-instance, para o ponteiro no AR1.
TAR2
+AR1

// Carrega offset de endereo no ACCU1


// Soma offset de endereo p/ AR1;

2. Aps isto, o acesso atual aos parmetros entrada/sada podem ocorrer.


O DB instance no deve ser aberto especialmente, como ele j tinha sido
aberto pela macro CALL na chamada do FB.
L D[AR1,P#0.0]
Nota

Siemens Ltda.
Training Center

// Carrega primeiro componente do Meas_1 etc.

Acesso indireto aos parmetros entrada/sada e in/out dos tipos de dados


elementares ou para as variveis estticas feito do mesmo modo, como neste
caso tambm valores dos operandos so guardados no DB instance.

ST-7PRO2
Pgina 10 Anexo: Acesso Indireto a Parmetros

Acesso Indireto a Parmetros de Entrada/Sada


Address
0.0
*4.0
40.0
44.0
48.0
*4.0
54.0

Declaration Name

Type

in

Meas_1

out
out
in_out
in_out
stat

Sum_1
Sum_2
Meas_2

ARRAY[1..10]
REAL
REAL
REAL
ARRAY[1..15]
REAL
INT

DB_Num

Start value

Comment

0.000000e+000
0.000000e+000

Network 3: Determinando o endereo inicial do Meas_2


LAR1 P##Messung_2
TAR2
+AR1
L
W [AR1,P#0.0]
T
#DB_Num
OPN
DB [#DB_Num]
L
D [AR1,P#2.0]
LAR1

//
//
//
//
//
//
//
//

Carrega ponteiro de rea cruzada p/POINTER sem


Carrega offset de endereo no ACCU1, soma ao AR1;
AR1 agora aponta p/POINTER no DB instance
Carrega nmero do DB do POINTER no ACCU1
Transfere nmero do DB(ou 0) na varivel esttica
Abre DB
Carrega ponteiro de rea cruzada p/ parmetro
Carrega ponteiro no AR1, AR1 aponta p/parmetro

//
//
//
//
//
//
//

0 p/ ACCU1 (Soma =0.0)


Contador p/ ACCU1; Soma=0 p/ ACCU2
Soma no ACCU1, contador no ACCU2
Contador p/ ACCU3
Campo de componentes no ACCU1
Soma no ACCU1, contador p/ ACCU2
...

Network 4: Access to Meas_2


L
L
BEGN: TAK
ENT
L
+R
...

0.000000e+000
15
D[AR1,P#0.0]

SIMATIC S7

Datum:
Datei:

Siemens AG 1999. All rights reserved.

Acesso Indireto

04.10.2007
PRO2_15P.11

Conhecimento em Automao
Trainings Center

O acesso indireto aos parmetros in/out do tipo de dados complexos diferem em


estrutura comparados ao acesso aos parmetros de entrada e sada.
Com parmetros in/out do tipo de dados complexos, o valor no copiado, mas
somente um POINTER para o parmetro in/out no DB instance.
O acesso atual ocorre em trs passos:
1. Primeiro, por meio da operao:
LAR1 P## Meas_2 // retorna o ponteiro de rea cruzada p/ POINTER
um ponteiro de rea cruzada para o POINTER transferido carregado no
registrador AR1. Como no caso anterior, o endereo byte.bit do ponteiro no
AR1 no identifica o endereo atual do POINTER no DB instance.
No caso do multi-instance o offset do AR2 deve ainda ser somado ao ponteiro
do registrador AR1:
TAR2
+AR1

// Carrega endereo no ACCU1, soma ao AR1;


// AR1 agora aponta p/ POINTER no DB instance;

2. No prximo passo a informao no POINTER avaliada, se necessrio o DB,


no qual o parmetro atual est localizado, aberto e um ponteiro de rea
cruzada para os operandos atuais carregado no registrador AR1:
L

W [AR1,P#0.0] // Carrega nmero do DB do POINTER no


// ACCU1
T
#DB_Num
// Transfere nmero do DB (ou 0) na varivel
OPN DB [#DB_Num] // Abre DB
L
D [AR1,P#2.0] // Carrega ponteiro de rea cruzada p/ parmetro
LAR1
// Carrega ponteiro no AR1, AR1 aponta p/parm.
3. Aps isto, o acesso atual para o parmetro atual pode ocorrer:
L D[AR1,P#0.0]

Siemens Ltda.
Training Center

// Carrega primeiro componente do Meas_2 etc.

ST-7PRO2
Pgina 11 Anexo: Acesso Indireto a Parmetros

"Passando" Parmetros
Tamanho do aninhamento:
z

S7-300: mx. 8

OB

S7-400: mx. 16

...

FBs

FBs

FCs

A passagem depende do tipo de bloco, dado e parmetro:


Chamada
Tipo de dado
Input -> Input
Output -> Output
in/out -> Input
in/out -> Output
in/out -> in/out

FC chama FC

P
x
x
x
x
x

FB chama FC

EC
- - - - - -

P
x
x
x
x
x

E
x
x
-

C
-

FC chama FB

P
x
x
x
x
x

E
-

C
x
-

FB chama FB

P
x
x
x
x
x

E
x
x
-

C
x
-

E: Tipo de dado elementar


C: Tipo de dado complexo
P: Tipo parmetro (Timer, Counter, Block_x)

SIMATIC S7
Siemens AG 1999. All rights reserved.

Datum:
Datei:

04.10.2007
PRO2_15P.12

Conhecimento em Automao
Trainings Center

Vista Geral

A "passagem" de parmetros de bloco uma forma especial de acesso ou


atribuio de parmetros de bloco. "Passagem" significa que o parmetro formal do
bloco chamado recebe o parmetro atual do bloco chamado.

Restries com
Relao aos Tipos
de Parmetros

Como uma regra geral, o parmetro atual deve ser do mesmo tipo de dado
que o parmetro formal. Mais adiante, parmetros de entrada do bloco
chamado somente podem ser ajustados em um parmetro de entrada do bloco
chamado e parmetros de sada somente em parmetros de sada.
Um parmetro in/out do bloco chamado pode em princpio ser ajustado como
parmetros de entrada, sada e in/out do bloco chamado.

Restries com
Relao aos Tipos
de Dados

Com relao aos tipos de dados, existem restries dependendo das


diferentes armazenagens dos parmetros do bloco na chamada de FC ou
FB. Parmetros de blocos do tipo de dado elementar podem ser passados sem
restries. Tipos de dados complexos de parmetros de entrada e sada podem
ento ser passados se o bloco chamado um FB.
Parmetros de blocos com os tipos de par6ametros: formato TIMER, COUNTER e
BLOCK_x ento somente podem ser passados de um parmetro de entrada para
um parmetro de entrada, se o bloco chamado um FB.

Nota

A "passagem" dos tipos de parmetros: TIMER, COUNTER e BLOCK_x podem ser


implementados em FCs com a ajuda de endereamento indireto. O nmero
desejado de TIMER, COUNTER ou BLOCK_x , por exemplo, passado como um
parmetro do tipo de dado WORD do bloco que chama para o bloco chamado.
Com a ltima chamada de bloco, este parmetro pode ento ser transferido para
uma varivel temporria e atravs desta varivel o respectivo TIMER, COUNTER
ou BLOCK_x pode ento ser processado.

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 12 Anexo: Acesso Indireto a Parmetros

Exerccio A.2: Avaliao de Parmetro Data e Horrio em um FB


FB83
0.0 in
IN_DT
out
in_out
8.0 stat
DUMMY
*2.0 stat
208.0 stat
FB63_DT

OB1_DATE_TIME

SIMATIC S7
Siemens AG 1999. All rights reserved.

DATE_AND_TIME

DT#90-1-1-0:0:0.0

ARRAY[1..100]
INT
FB63

IN_DT

FB63
EN

ENO

IN_DT

Sec

QB13

Min

QB12

Hour

QB8

Datum:
Datei:

04.10.2007
PRO2_15P.13

Conhecimento em Automao
Trainings Center

Vista Geral

O exerccio seguinte deve demonstrar como voc pode acessar indiretamente um


parmetro de entrada ou sada do tipo de dado complexo dentro de um bloco de
funes com capacidade multi-instance.
Voc deve usar a mesma tecnologia se voc6e tem que acessar indiretamente
outros tipos de dados complexos, tais como ARRAYs, STRUCTs ou STRINGs.

Definio da Tarefa

Criar um FB63 com as seguintes propriedades:


O FB63 tem um parmetro de entrada #IN_DT do tipo de dado:
DATE_AND_TIME
Em seus 3 parmetros de sada #Sec, #Min e #Hour, o FB63 retorna os
componentes segundos, minutos e horas do parmetro DT passado a ele.

Execuo

1. Criar um FB63 com as propriedades requeridas.


2. Para testar se o FB63 gerado tambm est realmente com capacidade
multiinstances chamar um instance do FB63 em um FB de alto nvel.
Criar um FB83 de alto nvel. Primeiro, declare um parmetro de entrada
#IN_DT do tipo DT no FB83. Ento declare uma varivel esttica #DUMMY
do tipo ARRAY[1..100] OF INT e um instance do FB63 com o nome #FB63_DT.
3. Chame o instance #FB63_DT dentro do FB83 e alimente-o com o parmetro
de entrada #IN_DT deste instance com o parmetro de entrada #IN_DT do FB83.
Alimente o parmetro de entrada do instance FB63_DT com os bytes de sada
QB8, QB12 e QB13.
4. Chame o FB83 com o instance DB83 no OB1. Atribua o parmetro de entrada
#IN_DT com a varivel OB1_DATE_TIME das informaes iniciais do OB1.
5. Carregue os blocos para a CPU e teste seu programa.

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 13 Anexo: Acesso Indireto a Parmetros

Exerccio A.3: Avaliao de Parmetros de Entrada/Sada em um


FB
FB84
0.0 in
IN_DT
out
in_out
8.0 stat
DUMMY
*2.0 stat
208.0 stat
FB64_DT
...

OB1_DATE_TIME

SIMATIC S7
Siemens AG 1999. All rights reserved.

DATE_AND_TIME

DT#90-1-1-0:0:0.0

ARRAY[1..100]
INT
FB64

IN_DT

FB64
EN

ENO

IO_DT

Sec

QB13

Min

QB12

Hour

QB8

Datum:
Datei:

04.10.2007
PRO2_15P.14

Conhecimento em Automao
Trainings Center

Vista Geral

O exerccio seguinte deve demonstrar como voc pode acessar indiretamente um


parmetro in/out do tipo de dado complexo dentro de um bloco de funes com
capacidade multi-instance.
You must use the same technology if you have to indirectly access other complex
data types, such as ARRAYs, STRUCTs or STRINGs.

Definio de Tarefa

Criar um FB64 com as seguintes propriedades:


O FB64 tem um parmetro de in/out #IO_DT do tipo de dado DT.
Nos 3 parmetros de sada #Sec, #Min e #Hour, o FB64 retorna os
componentes segundos, minutos e horas do parmetro DT passado a ele.

Execuo

1. Criar um FB64 com as propriedades requisitadas.


2. Criar um FB84. Primeiro, declare um parmetro de entrada #IN_DT do tipo DT
no FB84. Ento declare uma varivel esttica #DUMMY do tipo ARRAY[1..100] OF
INT e um instance do FB64 com o nome #FB64_DT.
3. Chame o instance #FB64_DT dentro do FB84 e atribua o parmetro in/out
#IO_DT deste instance com o parmetro de entrada #IN_DT do FB84. Note que a
passagem direta do parmetro de entrada para um
parmetro in/out no est
permitido. Qual soluo recomendada.
Alimente o parmetro de sada do instance FB64_DT com os bytes de sada
QB8, QB12 e QB13, como na tarefa anterior.
4. Chame o FB84 com instance DB84 no OB1. Atribua o parmetro de
entrada
#IN_DT do FB84 com a varivel OB1_DATE_TIME das informaes iniciais do
OB1.
5. Carregue os blocos para a CPU e teste o programa.

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 14 Anexo: Acesso Indireto a Parmetros

Soluo do Exerccio A.1: Acesso aos parmetros DT em uma FC


FUNCTION FC 51 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR_OUTPUT
Sec : BYTE ;
Min : BYTE ;
Hour : BYTE ;
END_VAR
VAR_TEMP
DB_Num : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =
// No caso de um parmetro de entrada, sada ou in/out do tipo de dado complexo, um
// ponteiro de rea cruzada para uma varivel POINTER (6 bytes), que ajustado na pilha
// local do bloco que chama pela macro CALL, transferido p/ a funo chamada pela
// passagem de parmetro. O contedo da varivel POINTER aponta para o operando atual.
// Para acesso indireto, um ponteiro de rea cruzada para este POINTER criado primeiro.
// No prximo estgio, o contedo da varivel POINTER lida e o acesso feito para o
// operando atual atravs desta informao.
//
L P##IN_DT;
// Carrega ponteiro de rea cruzada p/ POINTER no ACCU1
LAR1 ;
// Carrega ponteiro no AR1, AR1 agora aponta p/ POINTER
L W [AR1,P#0.0];
// Carrega nmero do DB do POINTER no ACCU1
T #DB_Num;
// Transfer nmero do DB (ou 0) na varivel temporria
OPN DB [#DB_Num]; // Abre DB
L D [AR1,P#2.0];
// Carrega ponteiro de rea cruzada p/ varivel DT do
// POINTER
LAR1 ;
// Carrega ponteiro no AR1, AR1 agora aponta p/varivel DT
L B [AR1,P#3.0];
// Carrega componente horas da varivel DT
T #Hour;
// Transfere para parmetro de sada #Hour
L B [AR1,P#4.0];
// Carrega componente minutos da varivel DT
T #Min;
// Transfere para parmetro de sada #Min
L B [AR1,P#5.0];
// Carrega componente segundos da varivel DT
T #Sec;
// Transfere para parmetro de sada #Sec
SET ;
SAVE ;
// Seta o bit BR em 1
END_FUNCTION
ORGANIZATION_BLOCK OB1
TITLE =
VERSION : 0.1
VAR_TEMP
OB1_TEMP: ARRAY[1..20] OF BYTE;
BEGIN
NETWORK
TITLE =
CALL FC 51 (
IN_DT := #OB1_DATE_TIME,
Sec
:= QB 13,
Min
:= QB 12,
Hour
:= QB 8);
END_ORGANIZATION_BLOCK

Siemens Ltda.
Training Center

// Informaes iniciais do OB1

ST-7PRO2
Pgina 15 Anexo: Acesso Indireto a Parmetros

Soluo do Exerccio A.2: Acesso a Parmetros DT em um FB


FUNCTION_BLOCK FB 63
TITLE =
VERSION : 0.1
VAR_INPUT
IN_DT : DATE_AND_TIME ;
END_VAR
VAR_OUTPUT
Sec : BYTE ;
Min : BYTE ;
Hour : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =
// No caso de uma entrada, o parmetro de sada do tipo de dado complexo, o valor
// da varivel complexa copiada ou copiada de volta no DB instance.
// Para acesso indireto, um ponteiro de rea cruzada incluindo o offset de endereo AR2,
// o qual ocorre no caso de um multi-instance, criado primeiro.
//
LAR1 P##IN_DT;
// Carrega ponteiro de rea cruzada p/ #IN_DT sem o
// offset de endereo adicional no AR2
TAR2 ;
// Transfere offset de endereo no ACCU1-offset endereo no
// AR2
// feito pela macro CALL
+AR1 ;
// Carrega contedo do ACCU1 (offset endereo AR2) p/AR1,
// AR1 agora aponta p/ #IN_DT
L B [AR1,P#3.0];
// Carrega componente horas da varivel DT
T #Hour;
// Transfere p/ parmetro de sada #Hour
L B [AR1,P#4.0];
// Carrega componente minutos da varivel DT
T #Min;
// Transfere p/ parmetro de sada #Min
L B [AR1,P#5.0];
// Carrega componente segundos da varivel DT
T #Sec;
// Transfere p/ parmetro de sada #Sec
SET ;
SAVE ; // Seta o bit BR em 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,
Sec
:= QB 13,
Min
:= QB 12,
Hour
:= QB 8);
END_FUNCTION_BLOCK

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 16 Anexo: Acesso Indireto a Parmetros

Soluo do Exerccio A.3: Acesso a Parmetros Entrada/Sada em um FB (Parte 1)


FUNCTION_BLOCK FB 64
TITLE =
VERSION : 0.1
VAR_OUTPUT
Sec : BYTE ;
Min : BYTE ;
Hour : BYTE ;
END_VAR
VAR_IN_OUT
IO_DT : DATE_AND_TIME ;
END_VAR
VAR_TEMP
DB_Num : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =
// No caso de um parmetro in/out do tipo de dado complexo, o valor da varivel complexa
// no copiada no DB instance, mas ao contrrio um POINTER para o operando atual
// armazenado no DB instance. Para acesso indireto, um ponteiro de rea cruzada
// para este POINTER, incluindo o offset de endereo AR2, o qual ocorre no caso de um
// multi-instance, criado primeiro.
// Aps isto, o acesso feito para os operandos atuais no modo usual.
LAR1 P##IO_DT;

// Carrega ponteiro de rea cruzada para o POINTER


// sem offset de endereo
TAR2 ;
// Transfere o offset de endereo do AR2 no ACCU1
+AR1 ;
// Soma o offset de endereo para AR1, AR1 agora aponta para
// o POINTER
L W [AR1,P#0.0];
// Carrega nmero do DB do POINTER no ACCU1
T #DB_Num;
// Transfere o nmero do DB (ou 0) em varivel temporria
OPN DB [#DB_Num]; // Abre o DB
L D [AR1,P#2.0];
// Carrega ponteiro de rea cruzada para a varivel DT
doPOINTER
LAR1 ;
// Carrega ponteiro no AR1, AR1 aponta para a varivel DT
T #Hour;
// Transfere para o parmetro de sada #Hour
L B [AR1,P#4.0];
// Carrega componente minutos da varivel DT
T #Min;
// Transfere para o parmetro de sada #Min
L B [AR1,P#5.0];
// Carrega componente segundos da varivel DT
T #Sec;
// Transfere para o parmetro de sada #Sec
SET ;
SAVE ;
// Seta o bit BR em 1

//

END_FUNCTION_BLOCK

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 17 Anexo: Acesso Indireto a Parmetros

Soluo do Exerccio A.3: Acesso a Parmetros Entrada/Sada em um FB (Parte 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_Ret_VAL : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
CALL SFC 20 (
SRCBLK
:= #IN_DT,
RET_VAL
:= #I_Ret_VAL,
DSTBLK
:= #DT_TEMP);
CALL #FB64_DT (
Sec
:= AB 13,
Min
:= AB 12,
Hour
:= 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 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ;
//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ;
//1 (Priority of 1 is lowest)
OB1_OB_NUMBR : BYTE ;
//1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ;
//Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ;
//Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ;
//Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
CALL FB 84 , DB 84 (
IN_DT := #OB1_DATE_TIME);
END_ORGANIZATION_BLOCK

Siemens Ltda.
Training Center

ST-7PRO2
Pgina 18 Anexo: Acesso Indireto a Parmetros

Você também pode gostar