16비트 오프셋을 사용하여 어드레스 콘텐츠를 변수에 복사
이 함수는 Var 변수 크기로 정의한 워드 수를 Area 메모리 영역과 Offs 어드레스 오프셋으로 결정한 어드레스의 Var 변수에 복사합니다.
입력
메모리 영역값1)
Area가 변수이면 DT 또는 FL 메모리 영역에 있어야 합니다. FP 도구 라이브러리의 Is_AreaDT 또는 Is_AreaFL 함수를 통합한 함수를 사용하여 이를 확인해야 합니다.
메모리 영역의 시작 16비트 어드레스 오프셋
출력
어드레스의 콘텐츠가 복사된 변수
Area 또는 Offs 변수는 GetPointer 함수를 통해 제공될 수 있습니다. Area 값은 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에서 액세스할 수 있는 변수를 정의합니다.
여기서 g_arArrayIn1 변수가 할당됩니다. 변수는 Program_CalcSums 프로그램의 POU 헤더에서도 선언될 수 있습니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
R_EXTERNAL
WrongAreaArray: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
END_VAR
VAR
start: BOOL:=FALSE;
RealArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
RealArrayIn2: ARRAY [0..3,1..4] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,110.0,120.0,130.0,140.0,150.0,160.0];
RealArrayIn3: ARRAY [0..2,1..3,2..5] OF REAL:=[10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0];
RealSum1: REAL:=0.0;
(*Result: 210*)
RealSum2: REAL:=0.0;
(*Result: 1360*)
RealSum3: REAL:=0.0;
(*Result: 180*)
IsWrongArea: BOOL:=FALSE;
WrongAreaSum: REAL:=0.0;
CalcSum_Real1: CalcSum_REAL;
END_VAR
변수 bStart가 TRUE로 설정되면 CalcSum_REAL 펑션블록이 실행됩니다. g_arArrayIn1 데이터 필드의 모든 요소 합계가 계산되고 rRealSum1 변수에 결과를 씁니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_COMMENT,,This program calculates the sum of all array elements of the input array In,3,1,38,2,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum1,36,4,38,6,);
B(B_VARIN,,RealArrayIn1,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,AreaOffs_OfVar,,10,1,22,5,,?D@'Var'?CArea?COffs);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+50+60,26,8,35,9,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,210.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,3,24,3);
L(22,4,23,4);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,10);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 13 ;
NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum2,36,4,38,6,);
B(B_VARIN,,RealArrayIn2,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+ø^50+60+70+80+ø^90+100+110+120+ø^130+140+150+160,26,8,35,12,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,1360.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,13);
L(10,3,24,3);
L(10,4,23,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
R_EXTERNAL
WrongAreaArray: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
END_VAR
VAR
start: BOOL:=FALSE;
RealArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
RealArrayIn2: ARRAY [0..3,1..4] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,110.0,120.0,130.0,140.0,150.0,160.0];
RealArrayIn3: ARRAY [0..2,1..3,2..5] OF REAL:=[10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0];
RealSum1: REAL:=0.0;
(*Result: 210*)
RealSum2: REAL:=0.0;
(*Result: 1360*)
RealSum3: REAL:=0.0;
(*Result: 180*)
IsWrongArea: BOOL:=FALSE;
WrongAreaSum: REAL:=0.0;
CalcSum_Real1: CalcSum_REAL;
END_VAR
네트워크 1:
전달된 데이터 필드가 DT 또는 FL 영역에 없으면 펑션블록의 ENO가 FALSE로 설정되고 처리가 종료됩니다.
네트워크 2: 4:
여기서 다음을 처리하는 합계 계산이 초기화됩니다. VAR_INPUT 등급 변수를 직접 변경할 수 없으므로, In_Offset 입력 변수를 In_Offs_intern 내부 변수에 복사해야 합니다.
다음 참조: Var_ToAreaOffs
네트워크 5: 8:
합계 계산 루프입니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_COMMENT,,This program calculates the sum of all array elements of the input array In,3,1,38,2,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum1,36,4,38,6,);
B(B_VARIN,,RealArrayIn1,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,AreaOffs_OfVar,,10,1,22,5,,?D@'Var'?CArea?COffs);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+50+60,26,8,35,9,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,210.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,3,24,3);
L(22,4,23,4);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,10);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 13 ;
NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum2,36,4,38,6,);
B(B_VARIN,,RealArrayIn2,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+ø^50+60+70+80+ø^90+100+110+120+ø^130+140+150+160,26,8,35,12,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,1360.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,13);
L(10,3,24,3);
L(10,4,23,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY
추가 예 프로젝트(FPWIN Pro 설치의 "Samples" 디렉토리):
Var_ToAreaOffs 변수 값을 어드레스 영역에 복사
Calculates the product of two-dimensional arrays