Var_ToAreaOffs

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.

Parameter

Eingang

Var (ANY_SIMPLE_NOT_BOOL)

Variable, deren Wert auf eine Adresse kopiert wird

Ausgang

iArea (INT)

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.

Offs (INT)

Offset zur 16-Bit-Anfangsadresse des Speicherbereichs

Anmerkungen

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.

Wert für den Speicherbereich1)

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

Beispiel

POE-Kopf

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

POE-Rumpf

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.

KOP-Rumpf

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

Beispiel: Programmieren des benutzerdefinierten Funktionsbausteins CalcSum_REAL:

POE-Kopf

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

KOP-Rumpf

  • Netzwerk 1–5:

    Hier werden Initialisierungen für die anschließende Berechnung der Summe vorgenommen.

  • Netzwerk 6:

    Wert eines Elements aus dem Eingangs-Datenfeld kopieren.

  • Netzwerk 7:

    Diesen Wert zur aktuellen Summe addieren.

  • Netzwerk 8:

    Aktuelle Summe in ein Element des Ausgangs-Datenfelds kopieren.

  • Netzwerk 9:

    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
Verwandte Themen

Weitere Beispiel-Projekte befinden sich im Installationsverzeichnis von Control FPWIN Pro unter "Samples":

Letzte Änderung am: 2021-07-28Feedback zu dieser SeitePanasonic Hotline