F117_FIFW

FIFO 버퍼에 쓰기

F/P117d1에서 지정한 FIFO 버퍼 내 s에서 지정한 데이터를 씁니다.

파라미터

입력

s (WORD, INT, UINT)

FIFO 버퍼에 작성되는 데이터를 저장하는 16비트 영역 또는 해당 정수

출력

d1_Start (WORD, INT, UINT)

FIFO 버퍼의 시작 16비트 영역

주석

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

  • 명령을 실행하면 지정된 데이터는 쓰기 포인터에서 나타낸 주소에 작성됩니다.

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

  • nF115_FIFT 명령에서 지정한 값입니다.

  • 쓰기 포인터는 FIFO 버퍼 영역의 세 번째 워드의 하위 8비트에 저장되고 데이터 저장 영역에서 상대적 위치로 표시됩니다. 데이터가 작성되는 실제 어드레스는 d1 + 오프셋 3 + 쓰기 포인터 값(하위 바이트만 10진수인 값)에서 지정됩니다.

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

  • 변수 sd1_Start의 데이터 형식은 같아야 합니다.

주석
  • FIFO 버퍼가 가득 찬 경우에(저장된 데이터 항목 수 = FIFT 명령에서 정의한 FIFO 크기 n) 실행하면 에러가 발생합니다. 쓰기는 금지됩니다.

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

에러 플래그

sys_bIsOperationErrorHold(TRUE로 전환되어 TRUE로 유지됨)
  • d1_Start에서 지정한 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_Start에서 지정한 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;

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