PID 처리 명령어
PID 처리 명령은 측정 값(예: 온도)과 사전 결정된 출력 값(예: 20°C)를 제공하는 프로세스(예: 히터)를 통제하는데 사용됩니다.
입력
파라미터의 자세한 내용은 PID_DUT_31을 참조해 주십시오.
F 명령을 사용하는 대신 해당 FP7 명령을 사용하는 것이 좋습니다.FP_PID_BASIC
이 명령은 파라미터가 s 입력에서 입력된 요소 30개를 사용하여 ARRAY 형태로 데이터 테이블에서 결정되는 PID 알고리즘을 계산합니다.
파라미터 설정이 허용 범위를 벗어나는 경우
파라미터 설정이 허용 범위를 벗어나는 경우
글로벌 변수 리스트에서 프로젝트의 모든 POU에서 액세스할 수 있는 변수를 정의합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR_EXTERNAL
EnableAutoTuning: BOOL:=FALSE;
(*Switch Auto Tuning On *)
Set_Value_SP: WORD:=0;
(*A/D CH0*)
Process_Value_PV: WORD:=0;
(*A/D CH1*)
Output_Value_MV: WORD:=0;
(*D/A*)
END_VAR
VAR
PidParameters: PID_DUT_31;
(*PID Parameters*)
END_VAR
PID_DUT_31 데이터 형식의 PidParameters 변수를 초기화하면 MV 상한값은 4000으로 설정됩니다. 처음에는 비례 게인 Kp는 80(8)으로, Ti와 Td는 200(20s)으로, 샘플링 시간 Ts는 100(1s)으로 설정됩니다.
EnableAutoTuning 변수가 FALSE에서 TRUE로 전환되면 표준 명령 MOVE는 16#8000 값을 DUT PidParameters의 멤버 Control에 복사합니다(예: F355_PID_DUT 함수에서 제어 모드 자동 조정이 활성화됨).
Set_Value_SP 및 Process_Value_PV 변수는 DUT PidParameters의 멤버 SP와 PV에 할당되고, A/D 컨버터 채널 0과 1에서 해당 값을 수신합니다.
F355_PID_DUT에는 전원 레일에 직접 연결된 EN 출력이 있으므로, PLC가 RUN 모드이면 함수가 실행됩니다. DUT PidParameters의 멤버 MV에 의해 저장된 계산된 컨트롤러 출력은 Output_Value_MV 변수에 할당됩니다. 이 값은 D/A 컨버터를 통해 PLC에서 시스템 출력으로 반환됩니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,E_MOVE,,10,2,17,6,,?DEN?Da_Num?AENO?C);
B(B_VAROUT,,PidParameters.Control,17,4,19,6,);
B(B_VARIN,,16#8000,8,4,10,6,);
B(B_CONTACT,,EnableAutoTuning,5,3,7,5,R);
B(B_COMMENT,,Enable Auto Tuning,2,1,12,2,);
L(1,4,5,4);
L(7,4,10,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,Set_Value_SP,9,2,11,4,);
B(B_VAROUT,,PidParameters.SP,11,2,13,4,);
B(B_COMMENT,,Fill the DUT PID_DUT_31 with the corresponding values,2,1,24,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,Process_Value_PV,9,0,11,2,);
B(B_VAROUT,,PidParameters.PV,11,0,13,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_VARIN,,PidParameters,8,5,10,7,);
B(B_F,F355_PID_DUT!,Instance,10,3,18,7,,?DEN?D@'s'?AENO);
B(B_COMMENT,,Carry out the PID arithmetic,2,1,21,2,);
L(1,5,10,5);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,PidParameters.MV,9,2,11,4,);
B(B_VAROUT,,Output_Value_MV,11,2,13,4,);
B(B_COMMENT,,Write manipulated value to the output,2,1,21,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(* Auto Tuning: *)
if DF(EnableAutoTuning) then
PidParameters.Control:=16#8000;
end_if;
(* Fill the DUT PidParameters with the corresponding input values: *)
PidParameters.SP:=Set_Value_SP;
PidParameters.PV:=Process_Value_PV;
(* Carry out the PID arithmetic: *)
F355_PID_DUT(PidParameters);
(* Write the manipulated value to the output: *)
Output_Value_MV:=PidParameters.MV;