Kopiert den Inhalt einer Adresse in eine Variable mit 32-Bit-Offset
Diese Funktion kopiert die durch die Größe der Variablen Var definierte Anzahl von Worten ab der durch Speicherbereich iArea und Adressenoffset diOffs bestimmten Adresse auf die Variable Var.
Eingang
Wert für den Speicherbereich1)
Falls iArea eine Variable ist, muss iArea einen Wert des Speicherbereichs für DT oder FL haben. Dies sollte mit einer der Funktionen der FP Tool-Bibliothek Is_AreaDT oder Is_AreaFL geprüft werden.
Offset zur 32-Bit-Anfangsadresse des Speicherbereichs
Ausgang
Variable, auf die der Inhalt der Adresse kopiert wird
Die Werte für iArea und diOffs können durch die Funktion GetPointer32 ermittelt werden. Der Wert für iArea muss im DT- oder FL-Bereich liegen.
Speicherbereiche für Merker Nur bei Typ FP7. |
SYS_MEMORY_AREA_R |
SYS_MEMORY_AREA_L |
|
SYS_MEMORY_AREA_X |
|
SYS_MEMORY_AREA_Y |
|
Merker |
SYS_MEMORY_AREA_WR |
Einstellwerte für Zeitgeber/Zähler |
SYS_MEMORY_AREA_SV |
Istwerte für Zeitgeber/Zähler |
SYS_MEMORY_AREA_EV |
Datenregister |
SYS_MEMORY_AREA_DT |
Koppelmerker |
SYS_MEMORY_AREA_WL |
Koppeldatenregister |
SYS_MEMORY_AREA_LD |
File-Register |
SYS_MEMORY_AREA_FL |
Eingangsregister |
SYS_MEMORY_AREA_WX |
Ausgangsregister |
SYS_MEMORY_AREA_WY |
In der globalen Variablenliste können Sie Variablen festlegen, die von allen POEs des Projekts verwendet werden können.
Hier wurden die Variablen RealArrayIn1 und RealArrayIn2 angelegt. Sie wurden absichtlich in verschiedenen Speicherbereichen deklariert, um die Wirksamkeit des Funktionsbausteins CalcSum_REAL zu zeigen. Genauso gut könnten diese Variablen im POE-Kopf des Programms Program_CalcSums deklariert werden.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
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
Wenn die Variable bSart auf TRUE gesetzt wird, wird der Funktionsbaustein CalcSum_REAL ausgeführt. Er berechnet die Summe aller Elemente des Datenfelds RealArrayIn1 und schreibt das Ergebnis in die Variable 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
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
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
Netzwerk 1:
Wenn das übergebene Datenfeld nicht im DT-Bereich oder FL-Bereich liegt, wird der ENO des Funktionsbausteins auf den Wert FALSE gesetzt und die Abarbeitung beendet.
Netzwerk 2: 4:
Hier werden Initialisierungen für die anschließende Berechnung der Summe vorgenommen. Da Variablen der Klasse VAR_INPUT nicht direkt verändert werden können, muss die Eingangsvariable In_Offset auf die interne Variable In_Offs_intern kopiert werden.
Siehe auch: Var_ToAreaOffs32
Netzwerk 5: 8:
Schleife über die Summenberechnung.
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
Weitere Beispiel-Projekte befinden sich im Installationsverzeichnis von Control FPWIN Pro unter "Samples":
Calculates the product of two-dimensional arrays