Copia il contenuto di un indirizzo in una variabile con offset a 32 bit
Questa funzione copia il numero di word definito dalla dimensione della variabile Var nella variabile Var dall'indirizzo determinato dall'area di memoria iArea e dall'offset indirizzo diOffs.
Ingresso
Valore per l'area di memoria1)
Se iArea è una variabile, allora deve trovarsi nell'area di memoria DT o FL. Per controllare che sia così, utilizzate una funzione che incorpora le funzioni Is_AreaDT o Is_AreaFL della FP tool library.
Offset per l'indirizzo a 32 bit iniziale dell'area di memoria
Uscita
Variabile in cui viene copiato il contenuto dell'indirizzo
I valori di iArea e diOffs possono essere forniti tramite la funzione GetPointer32. Il valore di iArea deve trovarsi nell'area DT oFL.
Flag aree di memoria Disponibile solo per FP7. |
SYS_MEMORY_AREA_R |
SYS_MEMORY_AREA_L |
|
SYS_MEMORY_AREA_X |
|
SYS_MEMORY_AREA_Y |
|
Flag |
SYS_MEMORY_AREA_WR |
Valore di impostazione timer/counter |
SYS_MEMORY_AREA_SV |
Valore corrente timer/counter |
SYS_MEMORY_AREA_EV |
Registri dati |
SYS_MEMORY_AREA_DT |
Flag di link |
SYS_MEMORY_AREA_WL |
Registri di link |
SYS_MEMORY_AREA_LD |
Registri file |
SYS_MEMORY_AREA_FL |
Registri ingressi |
SYS_MEMORY_AREA_WX |
Registri di uscita |
SYS_MEMORY_AREA_WY |
Nella lista variabili globali si definiscono variabili alle quali possono accedere tutti i POU del progetto.
Qui vengono allocate le variabili RealArrayIn1 e RealArrayIn2. Sono state dichiarate in aree di memoria diverse allo scopo di illustrare l'efficacia del Function Block CalcSum_REAL. Sarebbe ugualmente possibile dichiarare le variabili nell'intestazione del POU del programma Program_CalcSums.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU.La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR_EXTERNAL
g_arArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
(*data field 1*)
END_VAR
VAR
bStart: BOOL:=FALSE;
(*activation*)
rRealSum1: REAL:=0.0;
(*sum of the elements of data field 1*)
CalcSum_Real1: CalcSum_Real;
(*instance of the user function block*)
@'': @'';
END_VAR
Quando la variabile bSart è impostata su TRUE, il Function Block CalcSum_REAL viene eseguito. Calcola la somma di tutti gli elementi dell'array di dati RealArrayIn1 e scrive il risultato nella variabile RealSum1.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_FB,CalcSum_Real!,CalcSum_Real1,22,1,32,5,,?BEN?Bp32ToDatafield?AENO?ArSum);
B(B_VARIN,,g_arArrayIn1,13,3,15,5,);
B(B_VAROUT,,rRealSum1,32,3,34,5,);
B(B_F,GetPointer32!,,15,3,22,5,,?D?C);
B(B_COMMENT,,10.0 + 20.0 + 30.0 + 40.0 + 50.0 + 60.0,21,5,32,7,);
B(B_COMMENT,,= 210.0,33,5,38,6,);
B(B_COMMENT,,if (bStart == TRUE):,2,5,13,6,);
L(7,3,22,3);
L(1,3,5,3);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU.La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR_INPUT
p32ToDatafield: POINTER32;
(*pointer on the data field for calculation*)
END_VAR
VAR_OUTPUT
rSum: REAL:=0.0;
(*calculate sum*)
END_VAR
VAR
Sum_Operand: REAL:=0.0;
(*inernal calculation of the sum*)
In_Offs_Intern: DINT:=0;
(*internal offset*)
Idx: INT:=0;
(*index*)
@'': @'';
END_VAR
Rete 1:
Se l'array di dati fornito non si trova nell'area DT o FL, l'abilitazione in uscita del Function Block viene impostata su FALSE e l'elaborazione di programma terminata.
Rete 2: 4:
Qui si affrontano le inizializzazioni per il calcolo della somma che segue. Poiché le variabili della classe VAR_INPUT non possono essere modificate direttamente, è necessario copiare la variabile di ingresso In_Offset nella variabile interna In_Offs_intern.
vedere anche: Var_ToAreaOffs32
Rete 5: 8:
Loop per il calcolo della somma.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,Is_AreaDT!,,12,0,18,2,,?D?C);
B(B_VARIN,,p32ToDatafield.iArea,9,1,11,3,);
B(B_F,Is_AreaFL!,,12,3,18,5,,?D?C);
B(B_F,@AND-2!,,19,1,24,4,NN,?D?D?C);
B(B_F,E_MOVE!,,29,0,35,4,,?DEN?D?AENO?C);
B(B_VARIN,,FALSE,27,2,29,4,);
B(B_VAROUT,,ENO,35,2,37,4,);
B(B_RETURN,,,36,1,38,3,);
L(12,2,12,4);
L(12,1,12,2);
L(11,2,12,2);
L(18,1,18,2);
L(18,2,19,2);
L(18,3,18,4);
L(18,3,19,3);
L(35,2,36,2);
L(24,2,29,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,p32ToDatafield.diOffset,18,0,20,2,);
B(B_VAROUT,,In_Offs_Intern,20,0,22,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,0.0,18,0,20,2,);
B(B_VAROUT,,rSum,20,0,22,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,1,18,0,20,2,);
B(B_VAROUT,,Idx,20,0,22,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := Lbl1: ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_F,AreaOffs32_ToVar!,,17,0,27,4,,?DiArea?DdiOffs?C@'Var');
B(B_VARIN,,p32ToDatafield.iArea,15,1,17,3,);
B(B_VAROUT,,Sum_Operand,27,1,29,3,);
B(B_VARIN,,In_Offs_Intern,15,2,17,4,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_F,@ADD-2!,,17,0,22,3,,?D?D?C);
B(B_VARIN,,rSum,15,0,17,2,);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_VAROUT,,rSum,22,0,24,2,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_F,Size_Of_Var!,,17,1,24,3,,?D?C);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_F,@ADD-2!,,32,0,37,3,,?D?D?C);
B(B_VARIN,,In_Offs_Intern,30,0,32,2,);
B(B_VAROUT,,In_Offs_Intern,37,0,39,2,);
B(B_F,INT_TO_DINT!,,24,1,32,3,,?D?C);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,@LT-2!,,13,1,18,4,,?D?D?C);
B(B_VARIN,,p32ToDatafield.diSize,11,2,13,4,);
B(B_F,E_ADD-2!,,22,0,28,5,,?DEN?D?D?AENO?C);
B(B_VARIN,,1,20,3,22,5,);
B(B_VAROUT,,Idx,28,2,30,4,);
B(B_VARIN,,Idx,20,2,22,4,);
B(B_JUMP,,Lbl1,28,1,30,3,);
B(B_VARIN,,Idx,3,1,5,3,);
B(B_F,INT_TO_DINT!,,5,1,13,3,,?D?C);
L(18,2,22,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
Altri progetti d'esempio (directory "Esempi" dell'installazione di FPWIN Pro):
Var_ToAreaOffs32 Copia il valore di una variabile in un'area indirizzi
Calculates the product of two-dimensional arrays