Var_ToAreaOffs32

변수 값을 어드레스 영역에 복사

이 함수는 Var 입력의 변수 값을 iArea 메모리 영역과 diOffs 32비트 어드레스 오프셋에서 정의한 어드레스 영역에 복사합니다. 따라서 Var 입력의 변수 크기는 복사된 데이터 수를 결정합니다.

파라미터

입력

Var (ANY_SIMPLE_NOT_BOOL)

값이 어드레스에 복사된 변수

출력

iArea (INT)

메모리 영역값1)

iArea가 변수이면 DT 또는 FL 메모리 영역에 있어야 합니다. FP 도구 라이브러리의 Is_AreaDT 또는 Is_AreaFL 함수를 통합한 함수를 사용하여 이를 확인해야 합니다.

diOffs (DINT)

메모리 영역의 시작 32비트 어드레스 오프셋

주석

iArea 또는 diOffs 변수는 GetPointer32 함수를 통해 제공될 수 있습니다. iArea 값은 DT 또는 FL 영역에 있어야 합니다.

메모리 영역값1)

플래그 메모리 영역

FP7에만 사용할 수 있습니다.

SYS_MEMORY_AREA_R

SYS_MEMORY_AREA_L

SYS_MEMORY_AREA_X

SYS_MEMORY_AREA_Y

플래그

SYS_MEMORY_AREA_WR

설정값 타이머/카운터

SYS_MEMORY_AREA_SV

경과값 타이머/카운터

SYS_MEMORY_AREA_EV

데이터 레지스터

SYS_MEMORY_AREA_DT

링크 플래그

SYS_MEMORY_AREA_WL

링크 레지스터

SYS_MEMORY_AREA_LD

파일 레지스터

SYS_MEMORY_AREA_FL

입력 레지스터

SYS_MEMORY_AREA_WX

출력 레지스터

SYS_MEMORY_AREA_WY

POU 헤더

이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.

	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

POU 본문

변수 bStartTRUE로 설정되면 CalcSum_REAL 펑션블록이 실행됩니다. g_arArrayIn1 데이터 필드의 모든 요소 합계가 계산되고 g_arArrayOut1 데이터 필드에 결과를 씁니다. 이러한 방식으로 g_arArrayOut1의 첫 번째 요소는 g_arArrayIn1의 첫 번째 요소를 수신합니다. g_arArrayOut1의 두 번째 요소는 g_arArrayIn1의 첫 번째와 두 번째 요소의 합계를 포함합니다.g_arArrayOut1의 세 번째 요소는 g_arArrayIn1의 첫 번째, 두 번째 및 세 번째 요소 합계를 포함합니다.

CalcSum_REAL 펑션블록은 두 데이터 필드를 저장할 수 있는 메모리 영역과 데이터 필드의 요소 수와 독립적으로 함수를 계산할 수 있습니다. 데이터 필드의 어드레스를 할당하려면 전역 변수 목록에서 데이터 필드를 선언해야 합니다. 두 데이터 필드 모두 요소 수가 동일해야 합니다.

LD 본문

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 7 ;
        NETWORK_BODY
B(B_VARIN,,g_arArrayIn1,10,4,12,6,);
B(B_VARIN,,g_arArrayOut1,10,5,12,7,);
B(B_F,GetPointer32!,,12,4,19,6,,?D?C);
B(B_F,GetPointer32!,,12,5,19,7,,?D?C);
B(B_CONTACT,,bStart,5,3,7,5,);
B(B_FB,CalcSum_Real!,CalcSum_Real1,19,2,29,7,,?BEN?Bp32InputArray?Bp32OutputArray?AENO);
L(7,4,19,4);
L(1,4,5,4);
L(1,0,1,7);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

예: CalcSum_REAL 사용자 정의 펑션블록 프로그래밍

POU 헤더

이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.

	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

LD 본문

  • 네트워크 1~5:

    여기서 다음을 처리하는 합계 계산이 초기화됩니다.

  • 네트워크 6:

    입력 데이터 필드의 요소 값을 복사합니다.

  • 네트워크 7:

    이 값을 현재 합계에 추가합니다.

  • 네트워크 8:

    현재 합계를 출력 데이터 필드의 요소에 복사합니다.

  • 네트워크 9:

    입력 데이터 필드와 출력 데이터 필드의 다음 데이터 필드 요소의 오프셋을 계산합니다.

  • 네트워크 10:

    데이터 필드의 모든 요소가 처리될 때까지 라벨(네트워크 6)로 이동합니다.

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
관련 항목

추가 예 프로젝트(FPWIN Pro 설치의 "Samples" 디렉토리):

최종 수정일: 2020-11-05이 페이지에 대한 피드백Panasonic 직통 전화