Var_ToAreaOffs

Copier la valeur d’une variable dans une zone d’adresses

Cette fonction copie la valeur de la variable d’entrée Var sur la zone d’adresses définie par la zone mémoire Area et l’adresse offset Offs. La taille de la variable d’entrée Var détermine ainsi le nombre de données copiées.

Paramètres

Entrée

Var (ANY_SIMPLE_NOT_BOOL)

Variable dont la valeur est copiée sur une adresse

Sortie

iArea (INT)

Valeur pour la zone mémoire1)

Si iArea est une variable, sa valeur doit être dans la zone mémoire DT ou FL. Ceci doit être contrôlé à l’aide d’une des fonctions de la bibliothèque FP Tool Library Is_AreaDT ou Is_AreaFL.

Offs (INT)

Offset pour l’adresse de départ de 16 bits de la zone mémoire

Remarques

Les valeurs de iArea et diOffs peuvent être renvoyées via la fonction GetPointer32. La valeur de iArea doit être dans la zone mémoire DT ou FL.

Valeur pour la zone mémoire1)

Zones mémoire pour drapeaux

Disponibles pour le FP7 uniquement.

SYS_MEMORY_AREA_R

SYS_MEMORY_AREA_L

SYS_MEMORY_AREA_X

SYS_MEMORY_AREA_Y

Drapeaux

SYS_MEMORY_AREA_WR

Valeur de consigne temporisateur/compteur

SYS_MEMORY_AREA_SV

Valeur courante temporisateur/compteur

SYS_MEMORY_AREA_EV

Registres de données

SYS_MEMORY_AREA_DT

Drapeaux de liaison

SYS_MEMORY_AREA_WL

Registres de liaison

SYS_MEMORY_AREA_LD

Registres de fichiers

SYS_MEMORY_AREA_FL

Registres d’entrée

SYS_MEMORY_AREA_WX

Registres de sortie

SYS_MEMORY_AREA_WY

Exemple

En-tête du POU

Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.

	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

Corps du POU

Lorsque la variable bStart est sur TRUE, le bloc fonction CalcSum_REAL est exécuté. Il calcule la somme de tous les éléments de la zone de données g_arArrayIn1 et écrit le résultat sur la zone de données g_arArrayOut1. De cette façon, le premier élément de g_arArrayOut1 reçoit le premier élément de g_arArrayIn1. Le deuxième élément de g_arArrayOut1 contient les sommes du premier, deuxième et troisième élément de g_arArrayIn1.Le troisième élément de g_arArrayOut1 contient les sommes du premier, deuxième et troisième élément de g_arArrayIn1.....

Notez que le bloc fonction CalcSum_REAL peut calculer ses fonctions indépendamment des zones mémoires dans lesquelles les deux zones de données peuvent être sauvegardées et indépendamment du nombre d’éléments dans les zones de données. Si vous souhaitez affecter une adresse pour la zone de données, vous devez déclarer la zone de données dans la liste des variables globales. Les deux zones de données doivent avoir le même nombre d’éléments.

Corps en LD

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

Exemple : Programmation de la fonction utilisateur CalcSum_REAL

En-tête du POU

Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.

	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

Corps en LD

  • Réseaux 1–5 :

    Les initialisations pour le calcul de la somme sont exécutées dans ces réseaux.

  • Réseau 6 :

    Copie de la valeur d’un élément à partir de la zone des données d’entrée.

  • Réseau 7 :

    Valeur ajoutée à la somme actuelle.

  • Réseau 8 :

    Copie de la somme actuelle sur un élément de la zone des données de sortie.

  • Réseau 9 :

    Calcul de l’offset pour l’élément suivant des zones de données d’entrée et de sortie.

  • Réseau 10 : Saut vers l’étiquette (réseau 6) jusqu’à ce que tous les éléments de la zone de données aient été traités

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
Thèmes apparentés

Autres exemples de projets (répertoire "Samples" dans le répertoire d’installation de FPWIN Pro) :

Modifié le : 2021-08-09Feedback on this pagePanasonic hotline