FIFO 버퍼에서 읽기
F116_FIFR은 데이터 d1을 FIFO(선입 선출) 버퍼에서 읽고 d2에서 지정한 영역에 데이터를 저장합니다.
입력
FIFO 버퍼의 시작 16비트 영역
출력
FIFO 버퍼에서 읽은 데이터를 저장하는 16비트 영역
F 명령을 사용하는 대신 해당 FP7 명령을 사용하는 것이 좋습니다.FP_FIFO_READ, FP_LIFO_READ
명령을 실행하면 데이터 읽기는 읽기 포인터에서 지정한 어드레스부터 시작됩니다.
(0), (n-2) 및 (n-1)은 데이터 저장 영역에 할당된 주소입니다.
n은 F115_FIFT 명령에서 지정한 값입니다.
읽기 포인터는 FIFO 버퍼 영역의 세 번째 워드의 사위 8비트에 저장됩니다. 실제 어드레스는 읽기 포인터 값을 더한 d1+3에서 지정한 FIFO 버퍼 영역의 선행 어드레스 값입니다(첫 바이트만 10진수인 값).
읽기가 실행되면 저장된 데이터 항목 수에서 1이 차감되거나, 읽기 포인터가 1씩 증가하거나, 읽기 포인터가 마지막 요소를 가리키면 0으로 초기화됩니다.
저장된 데이터 항목 수가 0이거나 읽기 포인터가 쓰기 포인터와 같은 경우에 실행하면 에러가 발생합니다.
읽기 포인터가 쓰기 포인터와 같이 않으면 읽기만 수행됩니다.
읽기 포인터가 FIFO 버퍼의 최종 어드레스를 나타내는 경우에 실행하면(FIFO 명령-1에서 정의한 n), 읽기 포인터는 0으로 설정됩니다.
d1에서 지정한 FIFO 크기(n)가 n = 0 또는 n > 256인 경우.
저장된 FIFO 데이터 항목 수가 0인 경우.
저장된 FIFO 데이터 항목 수가 FIFO 크기(n)보다 큰 경우.
FIFO 크기(n)를 기준으로 FIFO의 최종 주소가 영역을 초과하는 경우.
FIFO 읽기 포인터가 FIFO 크기(n)보다 큰 경우.
데이터를 읽은 후 FIFO 읽기 포인터가 256(16#100) 이상인 경우.
d1에서 지정한 FIFO 크기(n)가 n = 0 또는 n > 256인 경우.
저장된 FIFO 데이터 항목 수가 0인 경우.
저장된 FIFO 데이터 항목 수가 FIFO 크기(n)보다 큰 경우.
FIFO 크기(n)를 기준으로 FIFO의 최종 주소가 영역을 초과하는 경우.
FIFO 읽기 포인터가 FIFO 크기(n)보다 큰 경우.
데이터를 읽은 후 FIFO 읽기 포인터가 256(16#100) 이상인 경우.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
FIFO: FIFO_n_WORD;
iRead_Data: INT:=0;
iWrite_Data: INT:=1;
bFIFO_Initialize: BOOL:=FALSE;
bFIFO_Write: BOOL:=FALSE;
bFIFO_Read: BOOL:=FALSE;
bChange_Value: BOOL:=FALSE;
END_VAR
다음 예에서는 bFIFO_Write가 두 번, bFIFO_Read가 한 번 활성화된 후의 버퍼 상태를 보여줍니다. bFIFO_Write가 처음 활성화되었으면 값 1은 FIFO.awData[0]에 작성되었습니다. bFIFO_Read가 활성화되었으면 iRead_Data는 이 값을 읽습니다. 다음으로 bFIFO_Write가 활성화되었으면 쓰기 포인터는 1씩 증가하고 값 2는 FIFO.awData[1]에 작성됩니다. 입력 데이터 모니터 1을 참조하십시오.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_CONTACT,,bFIFO_Initialize,6,1,8,3,R);
B(B_F,F115_FIFT,,24,0,33,5,,?DEN?Dn?Dd1?AENO);
B(B_VARIN,,FIFO.awData,11,3,13,5,);
B(B_F,Size_Of_Var,,13,2,23,5,,?D@'Var'?CSize);
B(B_VARIN,,FIFO.iSize,11,5,13,7,);
L(1,0,1,7);
L(1,2,6,2);
L(8,2,24,2);
L(23,3,24,3);
L(23,3,23,4);
L(24,4,24,6);
L(13,6,24,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_COMMENT,,The LT (Lower Than) operator prevents a writing error from occurring.,3,1,33,2,);
B(B_VARIN,,FIFO.iNumber,8,4,10,6,);
B(B_F,@LT-2,,10,3,15,7,,?D?D?C);
B(B_CONTACT,,bFIFO_Write,17,4,19,6,R);
B(B_VARIN,,FIFO.iSize,8,5,10,7,);
B(B_F,F117_FIFW,,24,4,33,8,,?DEN?D@'s'?AENO?Cd1);
B(B_VARIN,,iWrite_Data,22,6,24,8,);
B(B_VAROUT,,FIFO.iSize,33,6,35,8,);
L(1,0,1,9);
L(15,5,17,5);
L(19,5,19,6);
L(19,6,24,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_COMMENT,,The GT (Greater Than) operator prevents a reading error from occurring.,3,1,34,2,);
B(B_VARIN,,FIFO.iNumber,7,4,9,6,);
B(B_F,@GT-2,,9,3,14,7,,?D?D?C);
B(B_CONTACT,,bFIFO_Read,16,4,18,6,R);
B(B_VARIN,,0,7,5,9,7,);
B(B_F,F116_FIFR,,24,4,33,8,,?DEN?Dd1?AENO?Cd2);
B(B_VARIN,,FIFO.iSize,22,6,24,8,);
B(B_VAROUT,,iRead_Data,33,6,35,8,);
L(1,0,1,9);
L(14,5,16,5);
L(18,5,18,6);
L(18,6,24,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_COMMENT,,The E_ADD function is for cosmetic purposes only. It increments the value for the variable iWrite_Data~ which you can more easily differentiate when it is written into the Array of the FIFO buffer.,3,1,34,4,);
B(B_CONTACT,,bChange_Value,9,5,11,7,R);
B(B_F,E_ADD-2,,22,4,28,9,,?DEN?Da_NumN?Da_NumN?AENO?C);
B(B_VARIN,,iWrite_Data,20,6,22,8,);
B(B_VAROUT,,iWrite_Data,28,6,30,8,);
B(B_VARIN,,1,20,7,22,9,);
L(1,0,1,9);
L(1,6,9,6);
L(11,6,22,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(bFIFO_Initialize) THEN
(* Create the FIFO buffer *)
F115_FIFT(n_Number := Size_Of_Var(FIFO.awData), d1_Start := FIFO.iSize);
REPEAT
(* Initialize FIFO buffer with values *)
iWrite_Data:=iWrite_Data+1;
F117_FIFW(s := iWrite_Data, d1_Start => FIFO.iSize);
UNTIL(FIFO.iNumber>=FIFO.iSize)
END_REPEAT;
END_IF;
IF DF( bFIFO_Write) THEN
(* Write value of Write_Data to FIFO buffer *)
(* at leading edge of FIFO_Write *)
F117_FIFW(s := iWrite_Data, d1_Start => FIFO.iSize);
END_IF;
IF DF(bFIFO_Read) THEN
(* Read value from FIFO buffer *)
(* at leading edge of FIFO_Read *)
F116_FIFR(d1_Start := FIFO.iSize, d2 => iRead_Data);
END_IF;