Kopiert den Wert einer Variablen auf einen Adressbereich
Diese Funktion kopiert den Wert der Variablen am Eingang Var auf den durch Speicherbereich Area und Adressenoffset Offs definierten Adressbereich. Die Größe der Variablen am Eingang Var legt dabei die Anzahl der kopierten Daten fest.
Eingang
Variable, deren Wert auf eine Adresse kopiert wird
Ausgang
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 16-Bit-Anfangsadresse des Speicherbereichs
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 |
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
bStart: BOOL:=FALSE;
(*activation*)
g_arArrayOut1: ARRAY [0..5] OF REAL:=[6(0.0)];
(*data field with cumulative sum*)
g_arArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
(*data field 1*)
CalcSum_Real1: CalcSum_Real;
(*instance of user function block*)
@'': @'';
END_VAR
Wenn die Variable bStart auf TRUE gesetzt wird, wird der Funktionsbaustein CalcSum_REAL ausgeführt. Er berechnet die Summe aller Elemente des Datenfelds g_arArrayIn1 und schreibt das Ergebnis in das Datenfeld g_arArrayOut1. Dabei enthält das erste Element von g_arArrayOut1 das erste Element von g_arArrayIn1. Das zweite Element von g_arArrayOut1 centhält die Summen des ersten und zweiten Elements von g_arArrayIn1.Das dritte Element von g_arArrayOut1 enthält die Summen des ersten, zweiten und dritten Elements von g_arArrayIn1.....
Beachten Sie, dass der Funktionsbaustein CalcSum_REAL seine Funktion unabhängig von den Speicherbereich(en), in dem die beiden Datenfelder gespeichert sein können, und unabhängig von der Anzahl der Elemente der Datenfelder berechnen kann. Möchten Sie eine Adresse für die Datenfelder vergeben, müssen Sie die Datenfelder in der globalen Variablenliste deklarieren. Beide Datenfelder müssen die gleiche Anzahl an Elementen besitzen.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_VARIN,,g_arArrayIn1,10,3,12,5,);
B(B_VARIN,,g_arArrayOut1,10,4,12,6,);
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_F,GetPointer!,,12,3,19,5,,?D?C);
B(B_F,GetPointer!,,12,4,19,6,,?D?C);
B(B_FB,CalcSum_Real!,CalcSum_Real1,19,1,28,6,,?BEN?BpInputArray?BpOutputArray?AENO);
L(7,3,19,3);
L(1,3,5,3);
L(1,0,1,6);
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
pToDatafield: POINTER;
(*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: INT:=0;
(*internal offset*)
Idx: INT:=0;
(*index*)
@'': @'';
END_VAR
Netzwerk 1–5:
Hier werden Initialisierungen für die anschließende Berechnung der Summe vorgenommen.
Wert eines Elements aus dem Eingangs-Datenfeld kopieren.
Diesen Wert zur aktuellen Summe addieren.
Aktuelle Summe in ein Element des Ausgangs-Datenfelds kopieren.
Berechnung des Offset für das nächste Datenfeld-Element von Eingangs-Datenfeld und Ausgangs-Datenfeld.
Netzwerk 10: Solange zur Sprungmarke (Netzwerk 6) springen, bis alle Elemente der Datenfelder durchlaufen sind.
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,,pToDatafield.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,,pToDatafield.iOffset,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_VARIN,,pToDatafield.iArea,15,1,17,3,);
B(B_VAROUT,,Sum_Operand,27,1,29,3,);
B(B_VARIN,,In_Offs_Intern,15,2,17,4,);
B(B_F,AreaOffs_ToVar!,,17,0,26,4,,?DArea?DOffs?C@'Var');
L(26,2,27,2);
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!,,24,0,29,3,,?D?D?C);
B(B_VARIN,,In_Offs_Intern,22,0,24,2,);
B(B_VAROUT,,In_Offs_Intern,29,0,31,2,);
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,,pToDatafield.iSize,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,11,1,13,3,);
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":