示例#1
0
        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");
        }
示例#2
0
        /// <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");
        }
示例#3
0
        // 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();
            }
        }
示例#4
0
        // 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();
            }
        }
示例#5
0
        // 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();
            }
        }
示例#6
0
        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();
            }
        }