Automatisches Tür schließen im Falle eines Hüllenbruchs

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Automatisches Tür schließen im Falle eines Hüllenbruchs

      Hallo Community,

      also ich habe folgendes vor:
      Wenn irgendein Lüfter "gelb" wird, sollen alle Türen oder Hangertore geschlossen werden.
      Das mit dem schließen ist nicht so das Problem, dafür habe ich bereits nen Timerblock (EMERG-AIR-LOOK).

      Nur der Code macht mir noch zu schaffen.

      Danke schon mal!

      Hier mal mein Versuch:

      C#-Quellcode

      1. List<IMyTerminalBlock> vents = new List<IMyTerminalBlock>();
      2. List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
      3. IMyTerminalBlock AirLook = GridTerminalSystem.GetBlockWithName("EMERG-AIR-LOOK");
      4. void Main()
      5. {
      6. if(checkAir()==1)
      7. {
      8. do{
      9. AirLook.Start;
      10. }while(checkDoorClose()==1);
      11. }
      12. }
      13. int checkDoorClose()
      14. {
      15. int merker = 0;
      16. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      17. for(int i = 0; i<blocks.count; i++)
      18. {
      19. if(blocks[i].Open == true)
      20. {
      21. merker = 1;
      22. }
      23. }
      24. if(merker == 0)
      25. {
      26. return 0;
      27. }
      28. else
      29. {
      30. return 1;
      31. }
      32. }
      33. int checkAir()
      34. {
      35. GridTerminalSystem.GetBlocksOfType<IMyAirVent>(vents);
      36. for(int i = 0; i<vents.count; i++)
      37. {
      38. if(vents[i].IsDepressuriesed())
      39. {
      40. return 1;
      41. }
      42. }
      43. return 0;
      44. }
      Alles anzeigen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Spacemarine ()

    • Ich hab mal das C# Tag beim [code] gesetzt.

      1. Statt nen int nen bool zurückzugeben würde mehr Sinn machen.
      2. Kommentare sind hilfreich, wenn dir jemand helfen soll, deinen Code zu debuggen.
      3. Die for-Schleife macht keinen Sinn. In merker steht am Ende 1, wenn die letzte Tür zu ist oder 0, wenn sie offen ist.
      4. Zeile 21: Das == true ist redundant.
      5. Nach Schlüsselwörtern wie if, for, else, etc. steht bei guten Code ein Leerzeichen.
    • Danke für deine Antwort.

      zu 1. ja gut ist richtig, dürfte aber beides gehen
      zu 2. auch richtig, habe ich leider vergessen
      zu 3. ich muss aber doch durch die einzelnen Blocks durch iterieren um dessen jeweiligen Wert abzufragen.
      Das einzige was man dort Optimieren könnte ist folgendes, da es egal ist ob einer oder mehrere offen sind.

      C#-Quellcode

      1. /*Funktion um zu überprüfen ob alle Türen geschlossen sind*/
      2. int checkDoorClose()
      3. {
      4. /*Alle Türen in "blocks" abspeichern*/
      5. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      6. /*Jede Tür abfragen, ob diese offen ist*/
      7. for(int i = 0; i<blocks.count; i++)
      8. {
      9. if(blocks[i].Open == true)
      10. {
      11. return 1;
      12. }
      13. }
      14. return 0;
      15. }
      Alles anzeigen
      zu 4. kann ich nicht nachvollziehen
      zu 5. damit ist es definitiv übersichtlicher ;)
    • achso... ja richtig... schreibe das nur immer aus... warum auch immer...

      so aber ich habe den Code (den ich übrigens frei zur Verfügung stelle, also nutzt ihn und macht was damit...) bisschen weiter "Optimiert" und es kommen nur noch 2 Fehler...
      Er kennt die Variablen "Open" und "IsPressurized" nicht...
      Also nach vielem Googlen weiß ich aber auch immer noch nicht wie ich die Werte eines Objects Abfragen kann... also jetzt hier in SE...

      Wenn mir das noch einer zeigen kann, dann würde es ja funktionieren.

      C#-Quellcode

      1. List<IMyTerminalBlock> vents = new List<IMyTerminalBlock>();
      2. List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
      3. void Main()
      4. {
      5. IMyTimerBlock AirLook = GridTerminalSystem.GetBlockWithName("EMERG-AIR-LOOK") as IMyTimerBlock;
      6. if (checkAir()==true)
      7. {
      8. do{
      9. AirLook.GetActionWithName("Start").Apply(AirLook);
      10. }
      11. while (checkDoorClose() == true);
      12. }
      13. }
      14. bool checkDoorClose()
      15. {
      16. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      17. for (int i = 0; i<blocks.Count; i++)
      18. {
      19. if (blocks[i].Open)
      20. {
      21. return true;
      22. }
      23. }
      24. return false;
      25. }
      26. bool checkAir()
      27. {
      28. GridTerminalSystem.GetBlocksOfType<IMyAirVent>(vents);
      29. for (int i = 0; i<vents.Count; i++)
      30. {
      31. if (vents[i].IsPressurized == true)
      32. {
      33. }
      34. else
      35. {
      36. return true;
      37. }
      38. }
      39. return false;
      40. }
      Alles anzeigen
    • So kommt zwar kein Fehler mehr, aber es funktioniert nicht...

      C#-Quellcode

      1. List<IMyTerminalBlock> vents = new List<IMyTerminalBlock>();
      2. List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
      3. void Main()
      4. {
      5. IMyTimerBlock AirLook = GridTerminalSystem.GetBlockWithName("EMERG-AIR-LOOK") as IMyTimerBlock;
      6. if (checkAir()==true)
      7. {
      8. do{
      9. AirLook.GetActionWithName("Start").Apply(AirLook);
      10. }
      11. while (checkDoorClose() == true);
      12. }
      13. }
      14. bool checkDoorClose()
      15. {
      16. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      17. for (int i = 0; i<blocks.Count; i++)
      18. {
      19. if (blocks[i].GetValueBool("Open"))
      20. {
      21. return true;
      22. }
      23. }
      24. return false;
      25. }
      26. bool checkAir()
      27. {
      28. GridTerminalSystem.GetBlocksOfType<IMyAirVent>(vents);
      29. for (int i = 0; i<vents.Count; i++)
      30. {
      31. if (vents[i].GetValueBool("IsPressurized") == false)
      32. {
      33. return true;
      34. }
      35. }
      36. return false;
      37. }
      Alles anzeigen
    • Ich würde es als extrem schlechten Programmierstil betrachten, aber funktionell hat es keine Auswirkung, das ist richtig. Deshalb merke ich es ja auch nur am Rande an und sage nicht "So geht das aber nicht! Total scheiße das Ganze, lass es besser gleich bleiben."

      Es ist und bleibt eine "Philosophie-Frage des Programmierens". Wenn man das Ziel hat eindeutig nachvollziehbaren, kurzen und effizienten Code zu schreiben, dann sollte man es schon anmerken. Für mich gehört das eben zur Lesbarkeit, wie das richtige Formatieren des Codes. Eine einzige Zeile Code mit 5.000 Zeichen kann und will ich nicht lesen (extremes Beispiel, ich weiß). ;)
    • Die while Schleife war dazu da um zu überprüfen das auch wirklich alles geschlossen ist, denn ich war mir nicht sicher ob hangertore sich weiterhin schließen auch wenn der Timerblock auf Stop gesetzt wurde. Naja das weiß ich jetzt... also JA das tun die...
      Daher habe ich das jetzt entfernt.


      Also so funktioniert es jetzt, wer will darf es gerne verwenden...:
      Ich habe nur schon eine Verbesserung möglichkeit entdeckt, wenn der Lüfter auf Entlüften steht, schaltet sich das ganze auch ein oder aber wenn der Lüfter aus ist, damit man nen Hanger öffnen kann auch...
      Das muss ich noch fixen...

      C#-Quellcode

      1. List<IMyTerminalBlock> vents = new List<IMyTerminalBlock>();
      2. List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
      3. void Main()
      4. {
      5. IMyTimerBlock AirLock = GridTerminalSystem.GetBlockWithName("EMERG-AIRLOCK") as IMyTimerBlock;
      6. if (checkAir()==true)
      7. {
      8. AirLock.GetActionWithName("TriggerNow").Apply(AirLock);
      9. }
      10. }
      11. bool checkDoorClose()
      12. {
      13. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      14. for (int i = 0; i<blocks.Count; i++)
      15. {
      16. if (blocks[i].GetValueBool("Open"))
      17. {
      18. return true;
      19. }
      20. }
      21. return false;
      22. }
      23. bool checkAir()
      24. {
      25. GridTerminalSystem.GetBlocksOfType<IMyAirVent>(vents);
      26. for (int i = 0; i<vents.Count; i++)
      27. {
      28. string pressureInfo = vents[i].DetailedInfo;
      29. if (pressureInfo.IndexOf("Not pressurized") != -1)
      30. {
      31. return true;
      32. }
      33. }
      34. return false;
      35. }
      Alles anzeigen
    • Das sollte die Lösung deiner Probleme sein, mit ein paar zusätzlichen Verbesserungen. Schau es dir einfach mal an. ^^

      C#-Quellcode

      1. List<IMyTerminalBlock> vents = new List<IMyTerminalBlock>();
      2. List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
      3. void Main()
      4. {
      5. IMyTimerBlock AirLock = GridTerminalSystem.GetBlockWithName("EMERG-AIRLOCK") as IMyTimerBlock;
      6. if (checkPressure() && !areDoorsClosed())
      7. {
      8. AirLock.GetActionWithName("TriggerNow").Apply(AirLock);
      9. }
      10. }
      11. bool areDoorsClosed()
      12. {
      13. GridTerminalSystem.GetBlocksOfType<IMyDoor>(blocks);
      14. for (int i = 0; i < blocks.Count; i++)
      15. {
      16. var door = blocks[i] as IMyDoor;
      17. if (door.Open)
      18. {
      19. return true;
      20. }
      21. }
      22. return false;
      23. }
      24. bool checkPressure()
      25. {
      26. GridTerminalSystem.GetBlocksOfType<IMyAirVent>(vents);
      27. for (int i = 0; i < vents.Count; i++)
      28. {
      29. var vent = vents[i] as IMyAirVent;
      30. if (!vent.CanPressurize)
      31. {
      32. return true;
      33. }
      34. }
      35. return false;
      36. }
      Alles anzeigen
      Übrigens könnte man auch, statt in areDoorsClosed() abzufragen ob die geschlossen sind, die Türen in der Methode schließen. Das wäre eine zusätzliche Optimierung, um den Timer loszuwerden, ich wollte das ursprüngliche Konzept aber nicht ganz verändern. ^^
    • Spcemarine schrieb:

      Ich würde es als extrem schlechten Programmierstil betrachten, aber funktionell hat es keine Auswirkung, das ist richtig. Deshalb merke ich es ja auch nur am Rande an und sage nicht "So geht das aber nicht! Total scheiße das Ganze, lass es besser gleich bleiben.
      Ich finde es gut, so etwas anzumerken. Sachliche Kritik führt dazu, dass man besser werden kann.
    • so ich habe deinen code mal getestet und habe da immer noch den Fehler, dass es auch ausschlägt wenn die Lüfter in einem Hanger zum Beispiel auf Entlüften stehen, bzw. aus sind.

      Klar, in dem Moment wenn die Hangertore aufgehen, ist keine Luft mehr im Hanger. Aber dort sind alle Lüfter auf Entlüften geschaltet. Zwischentüren oder der gleichen sind alle geschlossen.

      Gibt es dafür nicht eine Art abfrage wie zum Beispiel:

      C#-Quellcode

      1. //Auf Entlüften prüfen
      2. if (vent.IsDepressurizing)
      3. {
      4. ...
      5. }
      6. //auf ein aus überprüfen
      7. if (vent.OnOff == "On")
      8. {
      9. ...
      10. }
      Alles anzeigen
      Das würde das Problem lösen.
    • Moment, im Falle ich habe ein Hangar und öffne die Tore: Dann wird das als Hüllenbruch erkannt, außer ich stelle den AirVent vorher auf entlüften, oder nicht? Denn wenn mein Vent auf entlüften steht gibt !vent.CanPressurize zwar true zutück, aber !vent.IsDepressurizing false. Oder ist !vent.IsDepressurizing im Falle des abgeschlossenen Vorgangs schon wieder true?
    • mhm...
      also vent.IsDepressurizing kenne ich so nicht und damit habe ich das auch nicht getestet.

      mein Versuch war mit vent.Depressurized und damit ging es nicht denn folgende Prozedur

      Hanger und Türen geschlossen - Druck vorhanden (vent.CanPressurize = true)
      User Interaktion zum öffnen des Hangers
      -> Lüfter auf Entlüften
      -> Druck verringert sich
      -> Hangertore öffnen sich - kein Druck vorhanden (vent.Depressurized = true)
      -> Programm löst aus ( if(vent.CanPressurize && vent.Depressurized) )
      -> Hangertore und Türen schließen sich



      Wenn es "vent.IsDepressurizing" gibt, sollte es dann ja so funktionieren:

      Hanger und Türen geschlossen - Druck vorhanden (vent.CanPressurize = true)
      User Interaktion zum öffnen des Hangers
      -> Lüfter auf Entlüften (vent.IsDepressurizing = true)
      -> Druck verringert sich
      -> Hangertore öffnen sich - kein Druck vorhanden (vent.Depressurized = true)
      -> Programm löst nicht aus ( if(vent.CanPressurize && vent.Depressurized && !vent.IsDepressurizing) )

      Oder sehe ich das falsch?
      Das Problem ist halt nur das abfragen ob es entlüftet... Via Timerblock könnte man sonst noch den Vent auf dekativiert stellen. Gibt es eine Abfrage ob ein Block aktiviert oder deaktiviert ist?
    • vent.IsDepressurizing gibt es nicht. ^^

      AgentSmith schrieb:

      Hanger und Türen geschlossen - Druck vorhanden (vent.CanPressurize = true)
      User Interaktion zum öffnen des Hangers
      -> Lüfter auf Entlüften
      -> Druck verringert sich
      -> Hangertore öffnen sich - kein Druck vorhanden (vent.Depressurized = true)
      -> Programm löst aus ( if(vent.CanPressurize && vent.Depressurized) )
      -> Hangertore und Türen schließen sich

      Hö? Aber wir lösen bei if(!vent.CanPressurize && !vent.Depressurized) aus. Folglich also nur, wenn vent.Depressurized = false ist... Oo Nur wenn man während des Vorgangs des Entlüften könnte das Öffnen der Hangartore als Hüllenbruch erkannt werden. Oder nicht?