Var_ToAreaOffs

Copia il valore di una variabile in un'area indirizzi

Questa funzione copia il valore della variabile all'ingresso Var nell'area indirizzi definita dall'area di memoria Area e dall'offset indirizzo Offs. La dimensione della variabile all'ingresso Var determina il numero di dati copiati.

Parametri

Ingresso

Var (ANY_SIMPLE_NOT_BOOL)

Variabile il cui valore viene copiato in un indirizzo

Uscita

iArea (INT)

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.

Offs (INT)

Offset per l'indirizzo a 16 bit iniziale dell'area di memoria

Note

I valori di iArea e diOffs possono essere forniti tramite la funzione GetPointer32. Il valore di iArea deve trovarsi nell'area DT oFL.

Valore per l'area di memoria1)

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

Esempio

Intestazione del POU

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

Corpo del POU

Quando la variabile bStart è impostata su TRUE, il Function Block CalcSum_REAL viene eseguito. Calcola la somma di tutti gli elementi dell'array di dati g_arArrayIn1 e scrive il risultato nell'array di dati g_arArrayOut1. In questo modo il primo elemento di g_arArrayOut1 riceve il primo elemento di g_arArrayIn1. Il secondo elemento di g_arArrayOut1 contiene le somme del primo e del secondo elemento di g_arArrayIn1.Il terzo elemento di g_arArrayOut1 contiene le somme del primo, del secondo e del terzo elemento di g_arArrayIn1.....

Ricordate che il Function Block CalcSum_REAL può calcolare la sua funzione indipendentemente dalle aree di memoria nelle quali è possibile memorizzare i due array di dati e indipendentemente dal numero di elementi degli array di dati. Se desiderate allocare un indirizzo per l'array di dati, dovete dichiarare l'array nella lista variabili globali. I due array di dati devono avere lo stesso numero di elementi.

Corpo 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

Esempio: programmazione del Function Block definito dall'utente CalcSum_REAL

Intestazione del POU

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

Corpo LD

  • Rete 1–5:

    Qui si affrontano le inizializzazioni per il calcolo della somma che segue.

  • Rete 6:

    Copia il valore di un elemento dall'array di dati di ingresso.

  • Rete 7:

    Aggiunge questo valore alla somma corrente.

  • Rete 8:

    Copia la somma corrente in un elemento dall'array di dati di uscita.

  • Rete 9:

    Calcolo dell'offset per l'elemento successivo dell'array di dati di ingresso e di uscita.

  • Rete 10: salto all'etichetta (rete 6) finché tutti gli elementi dell'array di dati sono stati elaborati.

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
Argomenti correlati

Altri progetti d'esempio (directory "Esempi" dell'installazione di FPWIN Pro):

L'ultima revisione: 2021-06-29Feedback su questa paginaPanasonic hotline