사용자 정의 펑션으로 변환된 펑션블럭

펑션블럭을 사용자 정의 펑션으로 변환하여 프로그램 단계 저장

일반 용도

이러한 펑션의 주요 목적은 펑션블럭(FB)의 치환을 펑션(FUN)으로 단순화하는 것입니다. 별도의 서브루틴에 있는 여러 FB 인스턴스는 하나의 서브루틴에 있는 하나의 펑션으로 치환됩니다.

펑션블럭

변환된 펑션

제한:

모든 Panasonic 명령을 하나의 공통 펑션에 사용할 수 있는 것은 아닙니다. 하나의 공통 펑션에서 사용할 수 없는 명령의 예:

  • F166_HighSpeedCounter_Set, F165_HighSpeedCounter_Cam 등 일부 고속 카운터 명령

  • F166_PulseOutput_Set, F171_PulseOutput_Trapezoidal 등 일부 위치결정 명령

이것을 상세하게 체크해야 합니다.

이점:

  • 훨씬 적은 수의 프로그램 코드가 필요할 수 있음

  • 훨씬 적은 수의 릴레이가 필요할 수 있음 (R)

  • 메모리 DUT의 배열을 사용하여 루프에 사용할 수 있음

단점:

  • 추가 개발 및 유지 관리 작업 필요

  • 변환된 펑션을 매우 신중하게 테스트해야 함

  • 사용자의 더 많은 노력 필요

  • 모니터링할 수 있는 인스턴스가 없기 때문에 모니터링이 더 어려움. 마지막 호출만 모니터링됨.

  • 더 많은 데이터 레지스터(DT)가 필요할 수 있음

  • PLC 성능이 저하되고 스캔 시간이 늘어남

주석
  • 타이머 펑션의 동작이 타이머 FB와 약간 다를 수 있음

  • 특히 새 펑션이 여러 번 호출될 때 새 펑션의 동작이 FB의 동작과 일치하는지 매우 주의 깊게 테스트하십시오.

권장되는 용도:

  • 펑션블럭 대신 펑션은 꼭 필요한 경우에만 사용해야 합니다.

  • 펑션블럭 대신 펑션은 정말로 필요한 만큼만 사용해야 합니다.

  • 최소 작업으로 최대의 이점을 얻을 수 있도록 어떤 펑션블럭을 변환해야 하는지 매우 주의 깊게 분석하십시오.

  • 펑션블럭의 변환 여부를 결정하는 주요 기준은 다음과 같습니다. 펑션블럭은 얼마나 자주 호출되며, 펑션블럭에는 몇 개의 단계가 필요합니까?

저장된 프로그램 코드 스텝 추정

이것은 저장할 수 있는 프로그램 코드 스텝 수를 계산하는 공식입니다.

현재 상황은 다음과 같습니다.

  • 지정된 펑션블럭

  • X회 호출됨

  • Y 스텝 사용 => 총 스텝 수: X * Y 스텝

  • TON, SR, 펄스 플래그 사용

지정된 FB는 다음이 필요한 함수로 치환될 수 있습니다.

  • X 호출에서 메모리 DUT 데이터를 두 번 복사하는 추가 스텝(예: 대략 X * 2 * 7 스텝)(예: 2개의 FP10_BKMV에 대해)

  • 하나의 공통 펑션 호출에 대해 Y * 2 스텝(일부 추가 스텝이 가정됨)

  • 다음의 하나의 공통 호출:

    • TON_FUN(xxx 스텝 사용)

    • SR_FUN(xxx 스텝 사용)

    • R_TRIG_FUN(xxx 스텝 사용)

FP0H의 계산 예

이 계산 예는 대략적인 수치만 제공합니다.

  • 지정된 펑션블럭

  • 30회 호출됨

  • 750 스텝 사용 => 총 스텝 수: 30 * 750 스텝 = 22500 스텝

  • TON, SR, 펄스 플래그 사용

지정된 FB는 다음이 필요한 함수로 치환될 수 있습니다.

  • 30회 호출에서 메모리 DUT 데이터를 두 번 복사하는 추가 스텝(예: 30 * 2 * 7 스텝 = 420 스텝)(예: 2개의 FP10_BKMV에 대해)

  • 하나의 공통 펑션 호출에 대해 750 * 2 스텝 = 1500 스텝(일부 추가 스텝이 가정됨)

  • 다음의 하나의 공통 호출:

    • TON_FUN(200 스텝 사용)

    • SR_FUN(35 스텝 사용)

    • R_TRIG_FUN(35 스텝 사용)

총 스텝 수: 420 스텝 + 1500 스텝 + 200 스텝 + 35 스텝 + 35 스텝 = 2190 스텝

결과: 이 펑션을 사용하여 대략 22500 스텝 - 2190 스텝 = 20310 스텝을 줄일 수 있습니다.

펑션블럭을 사용자 정의 펑션으로 변환하는 방법

사용자 펑션블럭 XXX를 펑션 XXX_FUN으로 변환하는 절차

이름 규칙을 유지하는 것이 좋습니다.

  1. FB XXX를 복사하고 XXX_FUN이라고 부릅니다.

    FB XXX를 유지하고 삭제하지 마십시오!

  2. [POU 속성] 다이얼로그를 사용하여 FB의 사본을 펑션으로 변경합니다.
  3. 메모리 DUT 정의(예: 메모리가 있는 모든 변수와 FB 펑션의 기타 호출된 펑션의 모든 메모리 DUT가 포함된 XXX_FUN_INSTANCE_DUT)
  4. 이 메모리 DUT로 VAR_IN_OUT 입력/출력 변수 정의(예: 데이터 형식 XXX_FUN_INSTANCE_DUTdutXXX)
  5. 펑션 보디에서 메모리가 필요한 모든 변수에 대해 다음을 수행합니다(예: SET/RESET 코일, 조건 계산 또는 늘어나는/감소하는 변수 값에서 용도로 인해).
    1. 메모리 DUT XXX_FUN_INSTANCE_DUT에서 동일한 변수 정의
    2. 해당 메모리 DUT 멤버로 변수 치환
    3. 메모리 DUT에서 메모리 변수로 치환된 변수 중 일부가 펑션 끝에 있는 출력일 경우 해당 출력 변수에 지정되어야 합니다.
  6. 모든 FB 인스턴스를 해당 펑션의 메모리 DUT로 치환합니다. 이것은 메모리 DUT XXX_FUN_INSTANCE_DUT에 정의되어 있어야 합니다.
  7. 모든 FB 인스턴스 호출을 해당 메모리 DUT가 있는 해당 펑션 호출로 치환합니다

    EN/ENO가 있는 표준 FB를 치환해야 한다면 EN/ENO 펑션에 해당 펑션을 넣고 이 펑션을 호출합니다. 예를 들어 펑션 TON_FUNEN/ENO 펑션 E_TON_FUN에 넣고 호출합니다.

  8. 모든 펄스 플래그를 해당 RTRIG_FUN/FTRIG_FUN 호출로 치환합니다.
  9. 특히 새 펑션이 여러 번 호출될 때 새 펑션의 동작이 FB의 동작과 일치하는지 매우 주의 깊게 테스트하십시오.

변환 예 LD/FBD

가정: 데이터 형식이 XXX_FUN_INSTANCE_DUTVAR_IN_OUTdutXXX가 있는 펑션 XXX가 모든 예에 사용됩니다.

동작

원래 프로그래밍 예제

변환된 프로그래밍 예제

 

호출

 

FB POU 헤더

FUN POU 헤더

   

DUT XXX_FUN_INSTANCE_DUT

셋(S)

리셋(R)

KEEP

조건 할당, 계산

늘어나는/감소하는 변수 값

펄스 플래그

펑션의 끝에서: 필요한 경우 일부 메모리 변수를 해당 출력 변수에 할당:

SR

RS

TON

TM_100ms

변환 예 ST

가정: 데이터 형식이 XXX_FUN_INSTANCE_DUTVAR_IN_OUTdutXXX가 있는 펑션 XXX가 모든 예에 사용됩니다.

동작

원래 프로그래밍 예제

변환된 프로그래밍 예제

셋(S)

리셋(R)

if (bSet) then
	bSR1:=true;
elsif (bReset) then
	bSR1:=false;
end_if;
if (bSet) then
	dutInstance.bSR1:=true;
elsif (bReset) then
	dutInstance.bSR1:=false;
end_if;

KEEP

bRS1 := KEEP(SetTrigger := bSet,
             ResetTrigger := bReset);
dutInstance.bRS1 := KEEP(SetTrigger := bSet,
                         ResetTrigger := bReset);

조건 할당, 계산

if (bReset) then
	di1:=0;
end_if;
if (bTrig) then
	w1 := ROL(IN := w1, N := 1);
end_if;
if (bReset) then
	dutInstance.di1 :=0;
end_if;
if (bTrig) then
	dutInstance.w1 := ROL(IN := dutInstance.w1, N := 1);
end_if;

늘어나는/감소하는 변수 값

di1:=di1+1;
w2:=w2 OR w1;
dutInstance.di1:=dutInstance.di1+1;

dutInstance.w2:=dutInstance.w2 OR dutInstance.w1;

펄스 플래그

if (DF(bSet) OR DFN(bSet)) then
	di2:=di2+1;
end_if;
R_TRIG_FUN(CLK := bSet,
           dutInstance := dutInstance.dutRTrig1,
           Q => bQTemp1);
F_TRIG_FUN(CLK := bSet,
           dutInstance := dutInstance.dutFTrig1,
           Q => bQTemp2);
if (bQTemp1 OR bQTemp2) then
    dutInstance.di2:=dutInstance.di2+1;
end_if;

펑션의 끝에서: 필요한 경우 일부 메모리 변수를 해당 출력 변수에 할당:

bSR1:=dutInstance.bSR1;
bRS1:=dutInstance.bRS1;
di1:=dutInstance.di1;
di2:=dutInstance.di2;
w1:=dutInstance.w1;
w2:=dutInstance.w2;

SR

SR_1(S1 := bSet,
     R := bReset,
     Q1 => bSR2);
SR_FUN(Set := bSet,
        Reset := bReset,
        dutInstance := dutInstance.dutSR_1, Q1 => bSR2);

RS

RS_1(S := bSet,
      R1 := bReset,
      Q1 => bRS2);
RS_FUN(Set := bSet,
        Reset := bReset,
        dutInstance := dutInstance.dutRS_1,
        Q1 => bRS2);

TON

TON1(IN := bIN,
      PT := T#10S,
      Q => bQ1, ET => tET1);
TON_FUN(IN := bIN,
        PT := T#10s,
        dutInstance := dutInstance.dutTon1,
        Q => bQ1, ET => dutInstance.tET1);

TM_100ms

TM_100ms_1(start := bIN,
            SV := 100,
            T => bT1,
            EV => iEV1);
TM_100ms_FUN(start := bIN,
              SV := 100,
              dutInstance := dutInstance.dutTM_100ms_1,
              T => bT1, EV => dutInstance.iEV1);

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