F116_FIFR

FIFO 버퍼에서 읽기

F116_FIFR은 데이터 d1을 FIFO(선입 선출) 버퍼에서 읽고 d2에서 지정한 영역에 데이터를 저장합니다.

파라미터

입력

d1_Start (WORD, INT, UINT)

FIFO 버퍼의 시작 16비트 영역

출력

d2 (WORD, INT, UINT)

FIFO 버퍼에서 읽은 데이터를 저장하는 16비트 영역

주석

  • F 명령을 사용하는 대신 해당 FP7 명령을 사용하는 것이 좋습니다.FP_FIFO_READ, FP_LIFO_READ

  • 명령을 실행하면 데이터 읽기는 읽기 포인터에서 지정한 어드레스부터 시작됩니다.

    1.  (1) FIFO 버퍼 메모리 크기(n)
    2.  (2) 작성됐지만 읽지 않은 저장된 데이터 항목 수(워드)
    3.  (3) 상위 바이트에서의 읽기 포인터
    4.  (4) 읽기 포인터
    5.  (5) 데이터 저장 영역(워드 n개)
  • (0), (n-2) 및 (n-1)은 데이터 저장 영역에 할당된 주소입니다.

  • n은 F115_FIFT 명령에서 지정한 값입니다.

  • 읽기 포인터는 FIFO 버퍼 영역의 세 번째 워드의 사위 8비트에 저장됩니다. 실제 어드레스는 읽기 포인터 값을 더한 d1+3에서 지정한 FIFO 버퍼 영역의 선행 어드레스 값입니다(첫 바이트만 10진수인 값).

  • 읽기가 실행되면 저장된 데이터 항목 수에서 1이 차감되거나, 읽기 포인터가 1씩 증가하거나, 읽기 포인터가 마지막 요소를 가리키면 0으로 초기화됩니다.

주석
  • 저장된 데이터 항목 수가 0이거나 읽기 포인터가 쓰기 포인터와 같은 경우에 실행하면 에러가 발생합니다.

  • 읽기 포인터가 쓰기 포인터와 같이 않으면 읽기만 수행됩니다.

  • 읽기 포인터가 FIFO 버퍼의 최종 어드레스를 나타내는 경우에 실행하면(FIFO 명령-1에서 정의한 n), 읽기 포인터는 0으로 설정됩니다.

에러 플래그

sys_bIsOperationErrorHold(TRUE로 전환되어 TRUE로 유지됨)
  • d1에서 지정한 FIFO 크기(n)가 n = 0 또는 n > 256인 경우.

  • 저장된 FIFO 데이터 항목 수가 0인 경우.

  • 저장된 FIFO 데이터 항목 수가 FIFO 크기(n)보다 큰 경우.

  • FIFO 크기(n)를 기준으로 FIFO의 최종 주소가 영역을 초과하는 경우.

  • FIFO 읽기 포인터가 FIFO 크기(n)보다 큰 경우.

  • 데이터를 읽은 후 FIFO 읽기 포인터가 256(16#100) 이상인 경우.

sys_bIsOperationErrorNonHold(스캔 1회에 대해 TRUE로 전환)
  • d1에서 지정한 FIFO 크기(n)가 n = 0 또는 n > 256인 경우.

  • 저장된 FIFO 데이터 항목 수가 0인 경우.

  • 저장된 FIFO 데이터 항목 수가 FIFO 크기(n)보다 큰 경우.

  • FIFO 크기(n)를 기준으로 FIFO의 최종 주소가 영역을 초과하는 경우.

  • FIFO 읽기 포인터가 FIFO 크기(n)보다 큰 경우.

  • 데이터를 읽은 후 FIFO 읽기 포인터가 256(16#100) 이상인 경우.

DUT

이 예에서는 함수 F115_FIFT, F116_FIFRF117_FIFW을 통합하여 FIFO 버퍼를 보여줍니다.

POU 헤더

이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 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

POU 본문

다음 예에서는 bFIFO_Write가 두 번, bFIFO_Read가 한 번 활성화된 후의 버퍼 상태를 보여줍니다. bFIFO_Write가 처음 활성화되었으면 값 1은 FIFO.awData[0]에 작성되었습니다. bFIFO_Read가 활성화되었으면 iRead_Data는 이 값을 읽습니다. 다음으로 bFIFO_Write가 활성화되었으면 쓰기 포인터는 1씩 증가하고 값 2는 FIFO.awData[1]에 작성됩니다. 입력 데이터 모니터 1을 참조하십시오.

LD 본문

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

ST 본문

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;

최종 수정일: 2021-01-08이 페이지에 대한 피드백Panasonic 직통 전화