Fahrstuhl: Problem mit Ausgabe/unregelmäßigen Problemen im Code



  • Hallo zusammen,

    mein Quellcode für einen Aufzug steht soweit, allerdings habe ich das Problem, dass er am Simulator nicht immer die tatsächliche Eben ausgibt, sondern oftmals erst viel verzögert aktualisiert. Auch hat er andere unregelmäßige "Macken", z.B. fährt er manchmal nicht die geforderte Etage an, wartet nicht bevor die Türen zu gehen, fährt über den 4. Stock drüber oder unter den 1. Stock usw... Die Fehler treten aber total unregelmäßig auf, manchmal läuft das Modell wiederum einwandfrei...
    Ich habe keinerlei Ahnung an was es liegen könnte, deswegen hoffe ich, dass man mir hier helfen kann. Sorry für den unübersichtlichen Code, ich habe versucht alles zu kommentieren.

    Ich bin dankbar für jeden Hinweis oder Tipp!

    #include "model_client/model_client.h"
    #include <iostream>
    #include <array>
    #include <windows.h>
    #include <chrono>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
      cout << "startup\n";
      model_client elevator("127.0.0.1",33001);           //connect to the simulator
      //model_client elevator("129.217.219.104",33001);  //connect to the real elevator
    
    //std::queue<int> ElevatorQueue; //queue for the elevator button
    
      double CurrentPosition = 2.0;
      int DestinationPosition[4]={0,0,0,0};
      int TargetDestination = 1;
    
      //define current position
    while(true){
    
      if(elevator.read("TPM1")){
        CurrentPosition = 1.0;
      }
       else if(elevator.read("TPO1")){
        CurrentPosition = 1.3;
      }
      else if(elevator.read("TPU2")){
        CurrentPosition = 1.7;
      }
      else if(elevator.read("TPM2")){
        CurrentPosition = 2.0;
      }
       else if(elevator.read("TPO2")){
        CurrentPosition = 2.3;
      }
      else if(elevator.read("TPU3")){
        CurrentPosition = 2.7;
      }
      else if(elevator.read("TPM3")){
        CurrentPosition = 3.0;
      }
      else if(elevator.read("TPO3")){
        CurrentPosition = 3.3;
      }
      else if(elevator.read("TPU4")){
        CurrentPosition = 3.7;
      }
      else if(elevator.read("TPM4")){
        CurrentPosition = 4.0;
      }
    
    
      //define destination as an Array
    
       if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
      }
      else if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
      }
      else if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
      }
      else if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
      }
    
    
      cout << "Dest[1]" << "    "<< DestinationPosition[0] <<  endl;
      cout << "Dest[2]" << "    "<< DestinationPosition[1] <<  endl;
      cout << "Dest[3]" << "    "<< DestinationPosition[2] <<  endl;
      cout << "Dest[4]" << "    "<< DestinationPosition[3] <<  endl;
    
    // Set TargetDestination to compile the CurrentPosition and DestinationPosition and if-function for opening the doors when current DestinationPosition is arrived
    
        if (DestinationPosition[0]==1){
        TargetDestination = 1;
      }
        else if (DestinationPosition[1]==1){
        TargetDestination = 2;
      }
        else if (DestinationPosition[2]==1){
        TargetDestination = 3;
      }
        else if (DestinationPosition[3]==1){
        TargetDestination = 4;
      }
    
    
      //define the elevator movements and direction arrows
          if (CurrentPosition < TargetDestination){
                 if (elevator.read("TTZ1") && elevator.read("TTZ2") && elevator.read("TTZ3") && elevator.read("TTZ4")){
        elevator.write("MKB",1);
        elevator.write("MKE",1);
        elevator.write("MKA",0);
    //direction arrows up
            elevator.write("LRH1",1);
            elevator.write("LRH2",1);
            elevator.write("LRH3",1);
        }}
        else if (CurrentPosition > TargetDestination){
                 if (elevator.read("TTZ1") && elevator.read("TTZ2") && elevator.read("TTZ3") && elevator.read("TTZ4")){
                elevator.write("MKA",1);
                elevator.write("MKE",1);
                elevator.write("MKB",0);
    // direction arrows down
            elevator.write("LRR2",1);
            elevator.write("LRR3",1);
            elevator.write("LRR4",1);
        }}
        else {
                elevator.write("MKE",0);
                elevator.write("MKB",0);
                elevator.write("MKA",0);
                DestinationPosition[TargetDestination-1]=0;
    //set directions arrows to 0
                elevator.write("LRR2",0);
                elevator.write("LRR3",0);
                elevator.write("LRR4",0);
                elevator.write("LRH1",0);
                elevator.write("LRH2",0);
                elevator.write("LRH3",0);
      }
    //cout the current var
            cout <<"Target:" <<TargetDestination << "    " << "Current:" <<CurrentPosition << endl;
    
    
    //Lampe in level 1
        if(elevator.read("TRA1")){
          elevator.write("LP1",1);
        }else{
          elevator.write("LP1",0);
        }
    //Lampe in Level 2
         if(elevator.read("TRA2")){
          elevator.write("LP2",1);
        }else{
          elevator.write("LP2",0);
        }
    //Lampe in Level 3
         if(elevator.read("TRA3")){
          elevator.write("LP3",1);
        }else{
          elevator.write("LP3",0);
        }
     //Lampe in Level 4
         if(elevator.read("TRA4")){
          elevator.write("LP4",1);
        }else{
          elevator.write("LP4",0);
        }
    
    
    //floor 1 condition to open and close the door
            if ((CurrentPosition==1 && elevator.read("TTA1")!=1 && TargetDestination==1 && elevator.read("TPM1")) || (elevator.read("PS1")!=1 && elevator.read("TTA1"))){
                    while(elevator.read("TTA1")!=1){
            elevator.write("MTE1",1);
            elevator.write("MTA1",1);
            elevator.write("MTB1",0);
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
        }} else if (elevator.read("TTZ1")!=1 && TargetDestination!=1){
            elevator.write("MTE1",1);
            elevator.write("MTB1",1);
            elevator.write("MTA1",0);
            } else{
            elevator.write("MTE1",0);
            elevator.write("MTA1",0);
            elevator.write("MTB1",0);
        }
    
    //floor 2
            if ((CurrentPosition==2 && TargetDestination==2 && elevator.read("TTA2")!=1 && elevator.read("TPM2")) || (elevator.read("PS2")!=1 && elevator.read("TTA2"))){
                    while(elevator.read("TTA2")!=1){
            elevator.write("MTE2",1);
            elevator.write("MTA2",1);
            elevator.write("MTB2",0);
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
        }}   else if (elevator.read("TTZ2")!=1 && TargetDestination!=2){
             while(elevator.read("PS2")){
            elevator.write("MTE2",1);
            elevator.write("MTB2",1);
            elevator.write("MTA2",0);
             }
            } else{
                elevator.write("MTB2",0);
                elevator.write("MTE2",0);
                elevator.write("MTA2",0);
            }
    
    //floor 3
            if ((CurrentPosition==3 && TargetDestination==3 && elevator.read("TTA3")!=1 && elevator.read("TPM3")) || (elevator.read("PS3")!=1 && elevator.read("TTA3"))){
                    while(elevator.read("TTA3")!=1){
            elevator.write("MTE3",1);
            elevator.write("MTA3",1);
            elevator.write("MTB3",0);
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
        }}   else if (elevator.read("TTZ3")!=1 && TargetDestination!=3){
            elevator.write("MTE3",1);
            elevator.write("MTB3",1);
            elevator.write("MTA3",0);
            } else{
                elevator.write("MTB3",0);
                elevator.write("MTE3",0);
                elevator.write("MTA3",0);
            }
    
    //floor 4
            if ((CurrentPosition==4 && TargetDestination==4 && elevator.read("TTA4")!=1 && elevator.read("TPM4")) || (elevator.read("PS4")!=1 && elevator.read("TTA4"))){
                    while(elevator.read("TTA4")!=1){
            elevator.write("MTE4",1);
            elevator.write("MTA4",1);
            elevator.write("MTB4",0);
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
        }}   else if (elevator.read("TTZ4")!=1 && TargetDestination!=4){
            elevator.write("MTE4",1);
            elevator.write("MTB4",1);
            elevator.write("MTA4",0);
            } else{
                elevator.write("MTB4",0);
                elevator.write("MTE4",0);
                elevator.write("MTA4",0);
        }
    
    
    //floor 1 - wait for 2 seconds if door is completely open
        if (elevator.read("TTA1") && (elevator.read("TRA2") || elevator.read("TRA3") || elevator.read("TRA4") || DestinationPosition[1]==1 || DestinationPosition[2]==1 || DestinationPosition[3]==1)){
            auto start_s = chrono::system_clock::now();
    
            auto stop_s = chrono::system_clock::now() - start_s;
    
         while(chrono::duration_cast<chrono::duration<double>>(stop_s).count() < 2.0) {
            stop_s = chrono::system_clock::now() - start_s;
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
         }}
    
    //floor 2 - wait for 2 seconds if door is completely open
        if (elevator.read("TTA2") && (elevator.read("TRA1") || elevator.read("TRA3") || elevator.read("TRA4") || DestinationPosition[0]==1 || DestinationPosition[2]==1 || DestinationPosition[3]==1)){
            auto start_s = chrono::system_clock::now();
    
            auto stop_s = chrono::system_clock::now() - start_s;
    
         while(chrono::duration_cast<chrono::duration<double>>(stop_s).count() < 2.0) {
            stop_s = chrono::system_clock::now() - start_s;
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
         }}
    
    //floor 3 - wait for 2 seconds if door is completely open
        if (elevator.read("TTA3") && (elevator.read("TRA1") || elevator.read("TRA2") || elevator.read("TRA4") || DestinationPosition[1]==1 || DestinationPosition[0]==1 || DestinationPosition[3]==1)){
            auto start_s = chrono::system_clock::now();
    
            auto stop_s = chrono::system_clock::now() - start_s;
    
         while(chrono::duration_cast<chrono::duration<double>>(stop_s).count() < 2.0) {
            stop_s = chrono::system_clock::now() - start_s;
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
         }}
    
    //floor 4 - wait for 2 seconds if door is completely open
        if (elevator.read("TTA4") && (elevator.read("TRA2") || elevator.read("TRA3") || elevator.read("TRA1") || DestinationPosition[1]==1 || DestinationPosition[2]==1 || DestinationPosition[0]==1)){
            auto start_s = chrono::system_clock::now();
    
            auto stop_s = chrono::system_clock::now() - start_s;
    
         while(chrono::duration_cast<chrono::duration<double>>(stop_s).count() < 2.0) {
            stop_s = chrono::system_clock::now() - start_s;
        if(elevator.read("TRA1")){
        DestinationPosition[0]= 1;
        }
        if(elevator.read("TRA2")){
        DestinationPosition[1]= 1;
        }
        if(elevator.read("TRA3")){
        DestinationPosition[2]= 1;
        }
        if(elevator.read("TRA4")){
        DestinationPosition[3]= 1;
        }
         }}
    
    // activate actuators on each floor when the door is open
         if (elevator.read("TTA1")){
            elevator.write("PA1",1);
         } else{
         elevator.write("PA1",0);
         }
          if (elevator.read("TTA2")){
            elevator.write("PA2",1);
         } else{
         elevator.write("PA2",0);
         }
          if (elevator.read("TTA3")){
            elevator.write("PA3",1);
         } else{
         elevator.write("PA3",0);
         }
          if (elevator.read("TTA4")){
            elevator.write("PA4",1);
         } else{
         elevator.write("PA4",0);
         }
    }}
    


  • @usernameuser sagte in Fahrstuhl: Problem mit Ausgabe/unregelmäßigen Problemen im Code:

    Benutze einen Debugger und schau dir an, was dein Programm macht.

    int DestinationPosition[4]={0,0,0,0};

    Was soll das? Wenn du in deinem Programm mal einern Wert auf 1 gesetzt hast, wird er nie wieder 0,



  • Das ist Spagetticode, das wird sich sicher so niemand antun wollen. Warum gibt es keine Funktionen? Warum das DestinationPosition Array wenn der eh immer nur in einer Etage sein kann? nen einfacher int würde das gleiche ergeben. Dadurch bekommst du dann auch wenn das mehrfach läuft ab der Zeile 78 Probleme, denn das Ziel ist dann immer die 4 wenn der einmal in die 4. Etage gefahren ist. Das sind nur so sachen die ich beim Überfliegen deines Codes gefunden habe, das wird aber sicher nur die Spitze des Eisberges sein.



  • Diese zahlreichen if-else Kombinationen machen auf mich den Eindruck, als könnte man die mit ner Map erschlagen. Da mir aber nicht bekannt ist, was die elevator-Klasse tut, lässt sich das nicht mit letzter Sicherheit sagen.
    Vermutlich ist das am Ende ein 20-Zeiler 😉



  • @It0101 sagte in Fahrstuhl: Problem mit Ausgabe/unregelmäßigen Problemen im Code:

    als könnte man die mit ner Map erschlagen

    "State machine" scheint mir hier das perfekte Google-Stichwort.


Anmelden zum Antworten