PROGRAM _CYCLIC (* Insert code here *) // IV1 Valve Condition Change IV1_SET_CLOSE;// := gPM.IO.AI.EXH_VG2_MONITOR > 1.33; //IV7 // Gauge VG1 / V22 gPM.IO.AI.EXH_VG1_MONITOR := ChangeRange(AI_EXH_BOX1[1], 0, 32767.0, 0, 0.4); // P1 gPM.IO.AI.EXH_VG2_MONITOR := ChangeRange(AI_EXH_BOX1[2], 0, 32767.0, 0, 133.0); // P2 gPM.IO.AI.EXH_VG3_MONITOR := ChangeRange(AI_EXH_BOX1[3], 0, 32767.0 ,0, 1.33); // P.SW11 // Read gAPC[0].Read.Remote := DI_EXH_BOX2[7]; // gPM.IO.DI.EXH_CKD_REMOTE_STATUS; : 1: remote gAPC[0].Read.Alarm := NOT DI_EXH_BOX2[8]; // gPM.IO.DI.EXH_CKD_ALARM_STATUS; : 1: normal gAPC[0].Read.Position := ChangeRange(AI_EXH_BOX1[0],0,32767,0,100); (* Change Position : 0~ 100% *) gAPC[0].Read.Pressure := SEL(gAPC[0].Write.RangeSel = TRUE, gPM.IO.AI.EXH_VG1_MONITOR, gPM.IO.AI.EXH_VG2_MONITOR); gAPC[0].Write.RangeSel := (gPM.IO.AI.EXH_VG2_MONITOR > 0.4); // All Reset gAPC[0].Write.Close := FALSE; gAPC[0].Write.Open := FALSE; gAPC[0].Write.SlowVac := FALSE; gAPC[0].Write.Pressure := FALSE; gAPC[0].Write.Position := FALSE; gAPC[0].Write.OpeningHold := FALSE; CASE gAPC[0].Set.ControlMode OF 0: // CLOSE gAPC[0].Write.Close := TRUE; 1: // OPEN gAPC[0].Write.Open := TRUE; 2: // SLOW VAC gAPC[0].Write.SlowVac := TRUE; 3: // PRESSURE gAPC[0].Write.Pressure := TRUE; 4: // POSITION gAPC[0].Write.Position := TRUE; END_CASE; DO_EXH_BOX2[0] := NOT gAPC[0].Write.Close; // Close = false , OtherCommand = true DO_EXH_BOX2[1] := gAPC[0].Write.Open; DO_EXH_BOX2[2] := gAPC[0].Write.SlowVac; DO_EXH_BOX2[3] := gAPC[0].Write.Pressure; DO_EXH_BOX2[9] := gAPC[0].Write.Position; DO_EXH_BOX2[4] := gAPC[0].Write.RangeSel; // Range Select P1 : false, P2 : true DO_EXH_BOX2[7] := gAPC[0].Write.OpeningHold; // Option // Table Selector // 1 : 0, 0 // 2 : 1, 0 // 3 : 0, 1 // 4 : 1, 1 TableSelect[0](Index := gAPC[0].Write.TableSelector); TableSelector[0].First := TableSelect[0].Selector1; TableSelector[0].Second := TableSelect[0].Selector2; DO_EXH_BOX2[5] := TableSelector[0].First; // gPM.IO.DV.EXH_CKD_TABLE_SELECT1_CMD; DO_EXH_BOX2[6] := TableSelector[0].Second; // gPM.IO.DV.EXH_CKD_TABLE_SELECT2_CMD; // Set Pressure or Position Target IF gAPC[0].Write.Pressure = TRUE THEN // Change P1/P2 Setting Range IF gAPC[0].Write.RangeSel = TRUE THEN AO_EXH_BOX1[0] := REAL_TO_INT(ChangeRange(gAPC[0].Write.PressureValue,0, 133.0, 0, (32767.0/2.0))); ELSE AO_EXH_BOX1[0] := REAL_TO_INT(ChangeRange(gAPC[0].Write.PressureValue,0, 0.4, 0, (32767.0/2.0))); END_IF ELSE IF gAPC[0].Write.Position = TRUE THEN // Valve Type Old AO_EXH_BOX1[0] := REAL_TO_INT(ChangeRange(gAPC[0].Write.PositionValue,0, 100.0, 0, (32767.0/2.0))); // Valve Type New //AO_EXH_BOX1[2] := REAL_TO_INT(gPM.IO.AV.EXH_CKD_OPE_SET / 100.0 * (32767.0/2.0)); END_IF END_IF (* Select 1~20 Torr *) IF gAPC[0].Write.SlowVacRate < 1 THEN gAPC[0].Write.SlowVacRate := 1; ELSIF gAPC[0].Write.SlowVacRate > 20 THEN gAPC[0].Write.SlowVacRate := 20; END_IF; AO_EXH_BOX1[1] := REAL_TO_INT(ChangeRange(gAPC[0].Write.SlowVacRate,0, 20.0, 0, (32767.0/2.0))); (* ============================================== *) (* APC Alarm Judgement Loop *) (* ============================================== *) FOR i := 0 TO 0 DO (* ===== 1. Stability Use Parameter ===== *) JudgeConfig[i].Stab[0].Use := gAPC[i].Set.UsingStability; JudgeConfig[i].Stab[1].Use := gAPC[i].Set.UsingStability; (* ===== 2. Pressure Stabilize ===== *) APC_PressStabilizes[i]( Enable := (gAPC[i].Set.UsingStability AND gAPC[i].Write.Pressure), SV := gAPC[i].Write.PressureValue, PV := gAPC[i].Read.Pressure, Param := JudgeConfig[i].Stab[0], CycleTime := CycleTime ); (* ===== 3. Position Stabilize *) APC_PosStabilizes[i]( Enable := (gAPC[i].Set.UsingStability AND gAPC[i].Write.Position), SV := gAPC[i].Write.PositionValue, PV := gAPC[i].Read.Position, Param := JudgeConfig[i].Stab[1], CycleTime := CycleTime ); // 0=Idle, 1=Delay, 2=Stabilizing, 3=Stable gAPC[i].State.StabStep := APC_PressStabilizes[i].State + APC_PosStabilizes[i].State; (* Stabilize *) gAPC[i].State.StabUpperAlarm := APC_PressStabilizes[i].AlarmUpper OR APC_PosStabilizes[i].AlarmUpper; gAPC[i].State.StabLowerAlarm := APC_PressStabilizes[i].AlarmLower OR APC_PosStabilizes[i].AlarmLower; (* ===== 4. Judge Use Parameter *) JudgeConfig[i].Judge[0].Use := gAPC[i].Set.UsingAlarmWatch; JudgeConfig[i].Judge[1].Use := gAPC[i].Set.UsingAlarmWatch; JudgeConfig[i].Judge[2].Use := gAPC[i].Set.UsingAlarmWatch; (* ===== 5. Pressure *) APC_PressJudges[i]( Enable := (gAPC[i].Set.JudgementType = 0 AND gAPC[i].Write.Pressure), SV := gAPC[i].Write.PressureValue, PV := gAPC[i].Read.Pressure, Param := JudgeConfig[i].Judge[0], CycleTime := CycleTime ); (* ===== 6. Position *) APC_PosJudges[i]( Enable := (gAPC[i].Set.JudgementType = 0 AND gAPC[i].Write.Position), SV := gAPC[i].Write.PositionValue, PV := gAPC[i].Read.Position, Param := JudgeConfig[i].Judge[2], CycleTime := CycleTime ); (* ===== 7. Leak ===== *) (* Enable Condition : JudgeType = Leak AND Valve State = Close *) APC_LeakJudges[i]( Enable := (gAPC[i].Set.JudgementType = 1 AND gAPC[i].Set.ControlMode = 0), PV := gAPC[i].Read.Pressure, Param := JudgeConfig[i].Judge[1], CycleTime := CycleTime ); gAPC[i].Read.LeakStartPressure := APC_LeakJudges[i].StartPressure; gAPC[i].State.JudgeStep := APC_LeakJudges[i].State + APC_PressJudges[i].State + APC_PosJudges[i].State; (* 8. Warning/Alarm *) gAPC[i].State.WarningValueState := APC_PressJudges[i].WarningHighState OR APC_PressJudges[i].WarningLowState OR APC_LeakJudges[i].WarningHighState OR APC_LeakJudges[i].WarningLowState OR APC_PosJudges[i].WarningHighState OR APC_PosJudges[i].WarningLowState; gAPC[i].State.AlarmValueState := APC_PressJudges[i].AlarmHighState OR APC_PressJudges[i].AlarmLowState OR APC_LeakJudges[i].AlarmHighState OR APC_LeakJudges[i].AlarmLowState OR APC_PosJudges[i].AlarmHighState OR APC_PosJudges[i].AlarmLowState; IF APC_PosStabilizes[i].AlarmLower THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 518 + (i*16)); END_IF IF APC_PosStabilizes[i].AlarmUpper THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 519 + (i*16)); END_IF IF APC_PressStabilizes[i].AlarmLower THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 520 + (i*16)); END_IF IF APC_PressStabilizes[i].AlarmUpper THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 521 + (i*16)); END_IF IF APC_PosJudges[i].WarningLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 522 + (i*16)); END_IF IF APC_PosJudges[i].WarningHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 523 + (i*16)); END_IF IF APC_LeakJudges[i].WarningLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 524 + (i*16)); END_IF IF APC_LeakJudges[i].WarningHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 525 + (i*16)); END_IF IF APC_PressJudges[i].WarningLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 526 + (i*16)); END_IF IF APC_PressJudges[i].WarningHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 527 + (i*16)); END_IF IF APC_PosJudges[i].AlarmLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 528 + (i*16)); END_IF IF APC_PosJudges[i].AlarmHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 529 + (i*16)); END_IF IF APC_LeakJudges[i].AlarmLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 530 + (i*16)); END_IF IF APC_LeakJudges[i].AlarmHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 531 + (i*16)); END_IF IF APC_PressJudges[i].AlarmLowState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 532 + (i*16)); END_IF IF APC_PressJudges[i].AlarmHighState THEN PostAlarm(gAlarmManager,gAlarmUseInfo[AlarmTableIndex].UseInfo, 533 + (i*16)); END_IF END_FOR; END_PROGRAM