FIFO 버퍼에 쓰기
F/P117은 d1에서 지정한 FIFO 버퍼 내 s에서 지정한 데이터를 씁니다.
입력
FIFO 버퍼에 작성되는 데이터를 저장하는 16비트 영역 또는 해당 정수
출력
FIFO 버퍼의 시작 16비트 영역
F 명령을 사용하는 대신 해당 FP7 명령을 사용하는 것이 좋습니다.FP_FIFO_WRITE, FP_LIFO_WRITE
명령을 실행하면 지정된 데이터는 쓰기 포인터에서 나타낸 주소에 작성됩니다.
(0), (n-2) 및 (n-1)은 데이터 저장 영역에 할당된 주소입니다.
n은 F115_FIFT 명령에서 지정한 값입니다.
쓰기 포인터는 FIFO 버퍼 영역의 세 번째 워드의 하위 8비트에 저장되고 데이터 저장 영역에서 상대적 위치로 표시됩니다. 데이터가 작성되는 실제 어드레스는 d1 + 오프셋 3 + 쓰기 포인터 값(하위 바이트만 10진수인 값)에서 지정됩니다.
쓰기가 실행되면 1이 저장된 데이터 항목 수에 더해지거나, 쓰기 포인터가 1씩 증가하거나, 쓰기 포인터가 마지막 요소를 가리키면 0으로 초기화됩니다.
변수 s 및 d1_Start의 데이터 형식은 같아야 합니다.
FIFO 버퍼가 가득 찬 경우에(저장된 데이터 항목 수 = FIFT 명령에서 정의한 FIFO 크기 n) 실행하면 에러가 발생합니다. 쓰기는 금지됩니다.
쓰기 포인터가 FIFO 버퍼의 최종 어드레스를 나타내는 경우에 실행하면(FIFT 명령에서 정의한 "n" 값), 쓰기 포인터는 0으로 설정됩니다.
d1_Start에서 지정한 FIFO 크기(n)가 n = 0 또는 n > 256인 경우.
저장된 FIFO 데이터 항목 수가 0인 경우.
저장된 FIFO 데이터 항목 수가 FIFO 크기(n)보다 큰 경우.
FIFO 크기(n)를 기준으로 FIFO의 최종 주소가 영역을 초과하는 경우.
FIFO 쓰기 포인터가 FIFO 크기(n)보다 큰 경우.
데이터를 쓴 후 FIFO 쓰기 포인터가 256(16#100) 이상인 경우.
d1_Start에서 지정한 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;