PID 명령어 타이밍
PID 명령어 및 프로세스 변수의 샘플링은 주기적으로 업데이트해야 합니다. 이 업데이트 시간은 제어 중인 물리적 프로세스와 관계가 있습니다. 온도 루프와 같이 매우 느린 루프의 경우 일반적으로 초당 한 번 또는 그보다 더 긴 업데이트 시간이라도 좋은 제어를 얻기에 충분합니다. 압력 또는 흐름 루프와 같이 좀 더 빠른 루프는 매 250 ms마다 한 번과 같은 업데이트 시간이 필요할 수 있습니다. 언와인드 스풀에 대한 장력 제어와 같이 드문 경우에 매 10 ms 또는 그보다 짧은 시간마다 한 번의 루프 업데이트가 필요합니다.
PID 명령어는 해당 계산에 시간 기준을 사용하기 때문에 이 명령어 실행을 프로세스 변수(PV)의 샘플링과 동기화해야 합니다.
PID 명령어를 실행하는 가장 쉬운 방법은 PID 명령어를 주기 태스크에 넣는 것입니다. 루프 업데이트 시간(.UPD)을 주기 태스크 속도와 같게 설정하고 PID 명령어를 주기적 태스크 스캔마다 실행하도록 합니다.
PID 명령어를 실행하는 가장 쉬운 방법은 PID 명령어를 주기 태스크에 넣는 것입니다. 루프 업데이트 시간(.UPD)을 주기 태스크 속도와 같게 설정하고 PID 명령어를 주기적 태스크 스캔마다 실행하도록 합니다.
릴레이 래더

팁:
PID를 유효하지 않은 내부 부동 소수점 값으로 고정하는 것을 피하기 위해 다음과 같이 명령어를 호출하기 전에 PV가 INF 또는 NAN이 아닌지 확인합니다.
- XIC (PC_timer.DN)
- MOV(Local:0:1.Ch0Data, Local:0:1.Ch0Data)
- XIO(S:V)
- PID(...)
구조화된 텍스트
PID(TIC101,Local:0:I.Ch0Data,Local:0:I.Ch1Data, Local:1:O.Ch4Data,0,Local:1:I.Ch4InHold, Local:1:I.Ch4Data);
주기 태스크를 사용하는 경우 프로세스 변수에 사용하는 아날로그 입력을 주기적 태스크의 속도보다 훨씬 더 빠른 속도로 프로세서에 대해 업데이트해야 합니다. 이상적인 경우 프로세서 변수를 주기 태스크 속도보다 최소 5 ~ 10배 더 빠르게 프로세서에 보내야 합니다. 이렇게 하면 프로세스 변수의 실제 샘플과 PID 루프의 실행 간에 시간 차이는 최소화합니다. 예를 들어 PID 루프가 250 ms 주기 태스크 내에 있는 경우 250 ms(.UPD = .25)의 루프 업데이트 시간을 사용하고 아날로그 입력 모듈을 최소 약 25 ~ 50 ms마다 데이터를 생성하도록 구성합니다.
정확성이 다소 떨어지는 다른 PID 명령어 실행 방법은 명령어를 연속 태스크에 배치하고 타이머 완료 비트를 사용하여 PID 명령어의 실행을 트리거하는 것입니다.
릴레이 래더

팁:
PID를 유효하지 않은 내부 부동 소수점 값으로 고정하는 것을 피하기 위해 다음과 같이 명령어를 호출하기 전에 PV가 INF 또는 NAN이 아닌지 확인합니다.
- XIC (PC_timer.DN)
- MOV(Local:0:1.Ch0Data, Local:0:1.Ch0Data)
- XIO(S:V)
- PID(...)
구조화된 텍스트
PID_timer.pre := 1000
TONR(PID_timer);
IF PID_timer.DN THEN PID(TIC101,Local:0:I.Ch0Data,Local:0:I.Ch1Data,
Local:1:O.Ch0Data,0,Local:1:I.Ch0InHold,
Local:1:I.Ch0Data);
END_IF;
팁:
PID를 유효하지 않은 내부 부동 소수점 값으로 고정하는 것을 피하기 위해 다음과 같이 명령어를 호출하기 전에 PV가 INF 또는 NAN이 아닌지 확인합니다.
- XIC (PC_timer.DN)
- MOV(Local:0:1.Ch0Data, Local:0:1.Ch0Data)
- XIO(S:V)
- PID(...)
이 방법에서 PID 명령어의 루프 업데이트 시간은 타이머 미리 설정 값과 같도록 설정해야 합니다. 주기 태스크를 사용하는 경우와 같이 아날로그 입력 모듈을 루프 업데이트 시간보다 훨씬 더 빠른 속도로 프로세스 변수를 생성하도록 설정해야 합니다. PID 실행의 타이머 방법은 연속 태스크에 대한 최악의 경우의 실행 시간보다 최소 몇 배 더 긴 루프 업데이트 시간을 가진 루프에만 사용해야 합니다.
PID 명령어를 실행하는 가장 정확한 방법은 1756 아날로그 입력 모듈의 실시간 샘플링(RTS) 기능을 사용하는 것입니다. 아날로그 입력 모듈은 모듈을 설정할 때 구성한 실시간 샘플링 속도로 해당 입력을 샘플링합니다. 모듈의 실시간 샘플링 기간이 만료하면 입력을 업데이트하고 모듈이 생성한 롤링 타임스탬프(아날로그 입력 데이터 구조의 .RollingTimestamp 구성원에 의해 표시)를 업데이트합니다.
타임스탬프 범위는 0 ~ 32,767 ms입니다. 타임스탬프를 모니터합니다. 변경되면 새로운 프로세스 변수 샘플이 수신됩니다. 타임스탬프가 변경될 때마다 PID 명령어를 한 번 실행하십시오. 프로세스 변수 샘플은 아날로그 입력 Module에 의해 구동되므로 입력 샘플 시간은 매우 정확하며 PID 명령어에 사용되는 루프 업데이트 시간은 아날로그 입력 모듈의 RTS 시간과 동일하게 설정해야 합니다.
프로세스 변수 샘플을 누락하지 않으려면 RTS 시간보다 빠른 속도로 로직을 실행하십시오. 예를 들어, RTS 시간이 250 ms일 경우 샘플이 누락되지 않도록 PID 로직을 100 ms마다 실행되는 주기적 태스크에 배치할 수 있습니다. 로직이 250 ms마다 두 번 이상 자주 업데이트되도록 하는 한 PID 로직을 연속 태스크에 배치할 수도 있습니다.
RTS 실행 방법의 예는 아래와 같습니다. PID 명령어의 실행은 새로운 아날로그 입력 데이터 수신에 따라 다릅니다. 아날로그 입력 모듈이 실패하거나 제거되면 컨트롤러는 롤링 타임스탬프 수신을 중지하고 PID 루프 실행이 중지됩니다. PV 아날로그 입력의 상태 비트를 모니터링하고 상태가 좋지 않으면 루프를 소프트웨어 수동 모드로 강제 실행하고 매 스캔마다 루프를 실행해야 합니다. 이를 통해 조작자는 PID 루프의 출력을 수동으로 변경할 수 있습니다.
릴레이 래더

구조화된 텍스트
IF (Local:0:I.Ch0Fault) THEN TIC101.SWM [:=] 1;
ELSE TIC101.SWM := 0; END_IF;
IF (Local:0:I.RollingTimestamp<>PreviousTimestamp) OR (Local:0:I.Ch0Fault) THEN
PreviousTimestamp := Local:0:I.RollingTimestamp; PID(TIC101,Local:0:I.Ch0Data,Local:0:I.Ch1Data,
Local:1:O.Ch0Data,0,Local:1:I.Ch0InHold,
Local:1:I.Ch0Data);
END_IF;
의견을 작성 부탁드립니다.