private void Discharge() { TilaVaihtui handler = tilaVaihtui; handler?.Invoke("Discharge"); Trace.WriteLine("Aloitetaan vaihe 5"); bool LS300N = mitattavatBool["LS-300"]; // EM5_OP2, EM3_OP5 EM5_OP2(); EM3_OP5(); // Seurataan LS-300 tilaa, jatketaan tyhjäystä niin kauan kun tavaraa riittää while (LS300N && sekvenssiKaynnissa == true) { LS300N = mitattavatBool["LS-300"]; // Pidetään viive vain jos alarajaa ei ole saavutettu if (LS300N) { Thread.Sleep(500); } } // LS-300 deaktivoituu // EM5_OP4, EM3_OP7 EM5_OP4(); EM3_OP7(); // Muutetaan prosessin tila takaisin arvoon 1 tila = 1; // Nostetaan event ja ilmoitetaan käyttöliittymälle invokella siitä, että prosessi on jälleen idlessä TilaVaihtui handler1 = tilaVaihtui; handler1?.Invoke("Idle"); }
/// <summary> /// Metodi sulkee kaikki venttiilit, pysäyttää pumput ja sammuttaa lämmitysvastuksen. Prosessin tila palautetaan alkutilaan. /// Lopuksi ilmoitetaan käyttöliittymälle invokella prosessin tilan muuttumisesta. /// </summary> public void PysaytaSekvenssi() { // Lämmittimen sammuttaminen on tällä hetkellä mukana vain testaustarkoituksessa // prosessi.MuutaOnOff("E100", false); // Muutetaan sekvenssin tilaksi false ja palautetaan prosessin tila kohtaan 1 sekvenssiKaynnissa = false; tila = 1; // Kaikkien venttiilien, pumppujen ja lämmittimien sulkeminen välittömästi EM1_OP3(); EM1_OP4(); EM2_OP2(); EM3_OP1(); EM3_OP6(); EM3_OP7(); EM4_OP2(); EM5_OP3(); EM5_OP4(); U1_OP3(); U1_OP4(); // Digesterin paineen poistaminen tässä vaiheessa? Jätän sen komennon vielä kommentteihin //EM3_OP8(); TilaVaihtui handler = tilaVaihtui; handler?.Invoke("Idle"); }
// Sekvenssin runko, operaatiot ovat omissa metodeissaan // Sekvenssin eri vaiheet on toteutettu tehtävänannon kanssa annetun PFC-kaavion mukaisesti, käyttäen PFC-kaavion mukaisia operaatioita // Sekvenssin vaiheiden nimet ja eri operaatioiden nimet noudattavat PFC-kaaviota // Jokaisen sekvenssin vaiheen aluksi nostetaan event sekvenssin tilan muuttumisesta ja ilmoitetaan siitä invokella käyttöliittymälle // Metodilla toteutetaan Impregration PFC-kaavion mukaisesti private void Impregnation() { TilaVaihtui handler = tilaVaihtui; handler?.Invoke("Impregnation"); // Luetaan kyllästysaika metodin sisäiseen muuttujaan double impregnationTime = kyllastysaika; bool LS300P = mitattavatBool["LS+300"]; // EM2_OP1, EM5_OP1, EM3_OP2 EM2_OP1(); EM5_OP1(); EM3_OP2(); // if (!LS300P) { while (!LS300P && sekvenssiKaynnissa == true) { LS300P = mitattavatBool["LS+300"]; // Pidetään yhden jaksonajan viive vain siinä tapauksessa, että ylärajaa ei ole vielä saavutettu if (!LS300P) { Thread.Sleep(500); } } } // EM3_OP1 EM3_OP1(); Trace.WriteLine("Käynnistetään kyllästysajan laskuri"); Trace.WriteLine(impregnationTime); // Pistetään laskuri rullaamaan, kun yläraja on saavutettu while (impregnationTime >= 0.5 && sekvenssiKaynnissa == true) { impregnationTime -= 0.5; Thread.Sleep(500); } // Time Ti tulee täyteen // EM2_OP2, EM5_OP3, EM3_OP6 EM2_OP2(); EM5_OP3(); EM3_OP6(); // EM3_OP8 EM3_OP8(); // Muutetaan sekvenssin tila seuraavaan vaiheeseen vain siinä tapauksessa, että sekvenssiä ei ole keskeytetty if (sekvenssiKaynnissa) { // Lopuksi muutetaan tilaa isommaksi ja kutsutaan uudestaan sekvenssin käynnistämistä tila += 1; Kaynnista(); } }
// Metodilla toteutetaan White Liquor Fill PFC-kaavion mukaisesti private void WhiteLiquorFill() { TilaVaihtui handler = tilaVaihtui; handler?.Invoke("White Liquor Fill"); Trace.WriteLine("Aloitetaan vaihe 3"); int LI400 = mitattavatInt["LI400"]; // LI400 rajana on LI400 > 80 mm // EM1_OP2 LI100 safety level = 100 mm // EM3_OP3, EM1_OP2 EM3_OP3(); EM1_OP2(); // Tarkastetaan syklin välein nestepintojen taso, pysäytetään kaikki jos LI100 pinta laskee liian alas while (LI400 < 80 && sekvenssiKaynnissa == true) { LI100Safety(); LI400 = mitattavatInt["LI400"]; if (LI400 < 80) { Thread.Sleep(500); } } // LI400 // EM3_OP6, EM1_OP4 EM3_OP6(); EM1_OP4(); // Muutetaan sekvenssin tila seuraavaan vaiheeseen vain siinä tapauksessa, että sekvenssiä ei ole keskeytetty if (sekvenssiKaynnissa) { // Lopuksi muutetaan tilaa isommaksi ja kutsutaan uudestaan sekvenssin käynnistämistä tila += 1; Kaynnista(); } }
// Metodilla toteutetaan Black Liquor Fill PFC-kaavion mukaisesti. private void BlackLiquorFill() { TilaVaihtui handler = tilaVaihtui; handler?.Invoke("Black Liquor Fill"); int LI400 = mitattavatInt["LI400"]; // LI400 rajana on LI400 < 35 mm // EM3_OP2, EM5_OP1, EM4_OP1 EM3_OP2(); EM5_OP1(); EM4_OP1(); // Jatketaan pinnankorkeuden seuraamista ja edeltäviä operaatioita, kunnes LI400 on halutussa arvossa tai sekvenssi keskeytetään while (LI400 > 35 && sekvenssiKaynnissa == true) { LI400 = mitattavatInt["LI400"]; // Pidetään yhden syklin tauko vain siinä tapauksessa, että alarajaa ei ole vielä saavutetta if (LI400 > 35) { Thread.Sleep(500); } } // EM3_OP6, EM5_OP3, EM4_OP2 EM3_OP6(); EM5_OP3(); EM4_OP2(); // Muutetaan sekvenssin tila seuraavaan vaiheeseen vain siinä tapauksessa, että sekvenssiä ei ole keskeytetty if (sekvenssiKaynnissa) { // Lopuksi muutetaan tilaa isommaksi ja kutsutaan uudestaan sekvenssin käynnistämistä tila += 1; Kaynnista(); } }
private void Cooking() { TilaVaihtui handler = tilaVaihtui; handler?.Invoke("Cooking"); Trace.WriteLine("Aloitetaan vaihe 4"); double cookingTime = keittoaika; double TI300 = mitattavatDouble["TI300"]; // EM1_OP1 LI100 safety level = 100 mm // EM3_OP4, EM1_OP1 EM3_OP4(); EM1_OP1(); // Nostetaan lämpötilaa ja tarkastellaan turvarajaa, kunnes lämpötila on saavutettu while (TI300 < keittolampotila && sekvenssiKaynnissa == true) { LI100Safety(); TI300 = mitattavatDouble["TI300"]; // Pidetään viive vain siinä tapauksessa, että keittolämpötilaa ei ole vielä saavutettu if (TI300 < keittolampotila) { Thread.Sleep(500); } } // TI300 lämpenee tarpeeksi // EM3_OP1, EM1_OP2 EM3_OP1(); EM1_OP2(); // U1_OP1, U1_OP2 while (cookingTime >= 0.5 && sekvenssiKaynnissa == true) { // Käynnistetään paineen ja lämpötilan säätö. Keittoaika ei kuitenkaan lähde laskemaan, ennen kun keittopaine on saavutettu bool saavutettu = U1_OP1(); U1_OP2(); if (saavutettu) { cookingTime -= 0.5; } Thread.Sleep(500); } // Time tc tulee täyteen // U1_OP3, U1_OP4 U1_OP3(); U1_OP4(); // EM3_OP6, EM1_OP4 EM3_OP6(); EM1_OP4(); // EM3_OP8 EM3_OP8(); // Muutetaan sekvenssin tila seuraavaan vaiheeseen vain siinä tapauksessa, että sekvenssiä ei ole keskeytetty if (sekvenssiKaynnissa) { // Lopuksi muutetaan tilaa isommaksi ja kutsutaan uudestaan sekvenssin käynnistämistä tila += 1; Kaynnista(); } }