변수 값을 어드레스 영역에 복사
이 함수는 Var 입력의 변수 값을 iArea 메모리 영역과 diOffs 32비트 어드레스 오프셋에서 정의한 어드레스 영역에 복사합니다. 따라서 Var 입력의 변수 크기는 복사된 데이터 수를 결정합니다.
입력
값이 어드레스에 복사된 변수
출력
메모리 영역값1)
iArea가 변수이면 DT 또는 FL 메모리 영역에 있어야 합니다. FP 도구 라이브러리의 Is_AreaDT 또는 Is_AreaFL 함수를 통합한 함수를 사용하여 이를 확인해야 합니다.
메모리 영역의 시작 32비트 어드레스 오프셋
iArea 또는 diOffs 변수는 GetPointer32 함수를 통해 제공될 수 있습니다. iArea 값은 DT 또는 FL 영역에 있어야 합니다.
플래그 메모리 영역 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 헤더를 사용합니다.
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
변수 bStart가 TRUE로 설정되면 CalcSum_REAL 펑션블록이 실행됩니다. g_arArrayIn1 데이터 필드의 모든 요소 합계가 계산되고 g_arArrayOut1 데이터 필드에 결과를 씁니다. 이러한 방식으로 g_arArrayOut1의 첫 번째 요소는 g_arArrayIn1의 첫 번째 요소를 수신합니다. g_arArrayOut1의 두 번째 요소는 g_arArrayIn1의 첫 번째와 두 번째 요소의 합계를 포함합니다.g_arArrayOut1의 세 번째 요소는 g_arArrayIn1의 첫 번째, 두 번째 및 세 번째 요소 합계를 포함합니다.
CalcSum_REAL 펑션블록은 두 데이터 필드를 저장할 수 있는 메모리 영역과 데이터 필드의 요소 수와 독립적으로 함수를 계산할 수 있습니다. 데이터 필드의 어드레스를 할당하려면 전역 변수 목록에서 데이터 필드를 선언해야 합니다. 두 데이터 필드 모두 요소 수가 동일해야 합니다.
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
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 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
네트워크 1~5:
여기서 다음을 처리하는 합계 계산이 초기화됩니다.
입력 데이터 필드의 요소 값을 복사합니다.
네트워크 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" 디렉토리):