Você está na página 1de 18

Apndice: Acesso Indireto a Parmetros dos FCs e FBs

OB 1 FB1 FB5 Regler . . . FB1

Motor 1

FC10
Meas_Value ARRAY[1..20] REAL Sum REAL Mean_value REAL 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 . . . .

Motor 2

. . .

FB2

Ventilinsel

. . .

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

Passando Parmetros para Tipos de Dados Complexos


Parm. Atuais Complexos em:

1 configura
"POINTER" no L-Stack

L-Stack (OB1)

L-Stack Bloco de Dados

DB5: values Field ARRAY[1..10] INT

No. DB: 5 ponteiro de rea cruzada


...

LB 21

OB1 OB1 Execuo do Programa CALL FC10


On Off := Value.Field := A8.0 BLD = L T L T UC 1 L 20.0 5 LW 21 P#DBX0.0 LD23 FC 10 P#L 21 P#A 8.0 2

Funo FC10
in On out Off ... ARRAY[1..10] INT BOOL

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

BLD

Acesso Indireto para Tipos de Dados Complexos


Address
0.0 *4.0 32.0 36.0 0.0

Declaration Name
in out out in_out temp Meas_Val Sum Mean_Val DB_Num

Type
ARRAY[1..8] REAL REAL REAL 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;

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 // // // // // // // // // // 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

Passando Parmetros para Ponteiros


Parmetros "POINTER" e "ANY"
1 L Stack (OB1)
... 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 ... LB 21

OB1 OB1
BLD = L T L T L T L T L T AC 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

Funo FC10
in out ... On Off ANY BOOL

Execuo do Programa
CALL FC10
On Off := P#I0.0 10 INT := Q8.0

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

BLD

Passando Parmetros para Tipos de Parmetros


Parmetros de Bloco:

TIMER, COUNTER BLOCK_x


OB1 Execuo do Programa CALL FC10
On Off := DB35 := A8.0

OB1

Funo FC10
in On out Off ... BLD = AC 1 L 20.0 FC 10 P#4.3 P#A 8.0 2 BLOCK_DB BOOL

BLD

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

Construo Especial para Parmetros Atuais Elementares em DBs e Constantes


Parm. elementares atuais em:

L Stack (OB1)
1
...

Constantes Blocos de dados

DBB2 0 0 0 1 0 1 0 0

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

LB 20

DB5 OB1 OB1 Execuo do Programa CALL FC10


On_1 := I0.1 On_2 := DB5.DBX2.2 Off := DB6.DBX2.6 BLD = OPN A = AC 1 L DB DBX L FC P#I P#L P#L A L OPN DB = DBX BLD 2 20.0 5 2.2 20.1 10 0.1 20.1 20.2 20.2 5 2.6

Funo FC10
in in out ... On_1 On_2 Off BOOL BOOL BOOl

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

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

FC51
EN OB1_DATE_TIME IN_DT ENO Sec Min Hour QB13 QB12 QB8

Chamada de FB Call com Tipos de Dados Complexos


Exemplo: Passando ARRAYs para um Bloco de Funes
FB17

DB2 "Temperature"

Network 1:

Atribundo parmetros complexos somente possvel simbolicamente


CALL FB Meas_1 Sum_1 Sum_2 Meas_2 17, DB 30 :="Temperature".Cylinder :=MD20 :=MD30 :="Temperature".Shaft

Acesso Indireto a Parmetros de Entrada/Sada


Address
0.0 *4.0 40.0 44.0 48.0 *4.0 54.0

Declaration Name
in out out in_out in_out stat Meas_1 Sum_1 Sum_2 Meas_2 DB_Num

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

Start value
0.000000e+000 0.000000e+000

Comment

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] // // // // // // // // // // 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

P#4.0;
BEGN; #Sum_1

Acesso Indireto a Parmetros de Entrada/Sada


Address
0.0 *4.0 40.0 44.0 48.0 *4.0 54.0

Declaration Name
in out out in_out in_out stat Meas_1 Sum_1 Sum_2 Meas_2 DB_Num

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

Start value
0.000000e+000 0.000000e+000

Comment

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 Network 4: Access to Meas_2 L L BEGN: TAK ENT L +R ... 0.000000e+000 15 D[AR1,P#0.0] // // // // // // // 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 ... // // // // // // // // 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

"Passando" Parmetros
Tamanho do aninhamento:

S7-300: mx. 8

S7-400: mx. 16

OB

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 FB chama FC FC chama FB FB chama FB

P EC x x x x x -

P EC x x x x x x x -

P EC x x x x x x -

PE C x x x x x x x x -

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

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 DATE_AND_TIME DT#90-1-1-0:0:0.0

ARRAY[1..100] INT FB63

OB1_DATE_TIME

IN_DT EN IN_DT

FB63 ENO Sec Min Hour QB13 QB12 QB8

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 ... DATE_AND_TIME DT#90-1-1-0:0:0.0

ARRAY[1..100] INT FB64

OB1_DATE_TIME

IN_DT EN IO_DT

FB64 ENO Sec Min Hour QB13 QB12 QB8

Soluo do Exerccio A.1: Acesso a Parmetros DT em uma FC

Soluo do Exerccio A.2: Acesso a Parmetros DT em um 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)