Datenstrukturen richtig anlegen



  • Hallo mein Name ist André,

    beruflich programmiere ich viel in der SPS Welt hauptsächlich in AWL. In der Techniker Schule habe ich C# kennengelernt und dort bin ich auch "relativ" fit drin.
    Naja C++ ist zwar sehr ähnlich, aber das sind die Programmiersprachen ja alle irgendwie.

    Ich arbeitet seit längeren an einen Arduino Projekt, welches auch eigentlich gut funktioniert vom Programm her, aber es ist halt schlecht geschrieben (quick and dirty).

    Dieses will ich jetzt ändern und Ordnung rein bringen.

    In der SPS Welt bei uns in der Firma wird als erstes immer eine Datenstruktur angelegt bevor es mit der eigentlichen Programmierung los geht. Diese will ich eigentlich bei meinen Projekt auch anlegen, leider weiß ich nicht so genau wie ich das am besten realisieren kann.

    Ich mache mal ein Beispiel von ein Behälter welcher z.B. gefüllt, geleert werden kann und zudem noch ein Füllstandsensor besitzt.

    Die Datenstruktur in der würde jetzt in der SPS Welt wie folgt aussehen.

    in(struct)
         peripherie(struct) 
              fuellstand(real)     //Eingangswert z.B.4-20mA
    inOut(struct)
         steuerung(struct)
              befüllen(bool)     //Steuerbefehl zum öffnen eines Einlassventil
              entleeren(bool)     //Steuerbefehl zum öffnen eines Auslassventil
    out(struct)
         status(struct)    
              leer(bool)     //Statusmeldung Behälter leer
              voll(bool)      //Statusmeldung Behälter voll
              fuellstand(real)       //Anzeige Füllstand 0-100%
    

    Diese Datenstruktur ist natürlich nur ein kleines Beispiel und würde bei mir im Programm viel mehr Variablen beinhalten.

    Wenn ich jetzt eine Variable von der Struktur Behaelter anlegen würde dann könnte ich so auf die einzelnen Elemente zugreifen:

    behaelter[1].out.status.fuellstand

    naja das ist die SPS Welt nur wie wird so etwas in C++ realisiert.
    Klar ich weiß wie man eine Struktur schreibt und wie diese aufgebaut wird. Wäre das hier die richtige Lösung?

      struct stuctPeripherie{ float fuellstand; };
      struct stuctIn{ stuctPeripherie peripherie; };
      
      struct structSteuerung{ bool befuellen,entleeren; };
      struct structInOut{ structSteuerung steuerung ; };
    
      struct structStatus{ bool leer,voll; float fuellstand};
      struct structOut{ structStatus out; };
    
      struct structBehaelter{ stuctIn in; structInOut inOut, structOut out };
    
    


  • Da ist nicht viel zu sehen.

    Grundsätzlich muss man sich auf die konkrete Progarmmiersprache einlassen. Es ist selten sinnvoll es wie in X zu machen.



  • Sorry habe Strg + Enter gedrückt und dann war der Beitrag gepostet.

    Jetzt ist der Beitrag aber Fertig.

    Ja ich möchte mich ja auch auf die Sprache einlassen. Nur die frage ist wie man das "professionell" von der Datenstruktur her macht.

    Also ich habe ein Objekt (Behälter) das könnte ich in einer Struktur/Klasse abbilden. Aber dieses Objekt hat hunderte Parameter oder Variablen wie sortiert man diese in C++?

    In den Büchern sind immer nur kleine Beispiele realisiert wo dann im oberen teil der Klasse einfach ein paar Variablen für das jeweilige Beispiel angelegt werden. Aber in der Realität hat man doch nachher 100te Variablen, wenn man die alle in der Klasse anlegt dann weiß man doch nachher gar nicht mehr wozu die variable gehört.



  • du kannst auch klassen in klassen unterbringen. ein auto besteht aus einem motor, reifen, sitzen, lenkrad; der motor hat zylinder und ventile, die reifen einen bestimmten druck, die sitze bestimmte positionen usw.

    also wenn du literatur haben willst, such mal nach "objektorientierte programmierung".



  • Wenn du jetzt schon weißt, dass eine Struktur sehr groß wird, dann überlege dir gleich am Anfang wie du diese Struktur in weitere Unterstrukturen unterteilen kannst, wie es HansKlaus auch angedeutet hat.

    Suche nach logisch zusammenhängenden Daten und Funktionen die du als kleine Unterstruktur in deine Hauptstruktur eingliedern kannst. Deine Klasse sollte nicht aus 100 Variablen und dazu 100 gettern und 100 settern bestehen. Überlege welche Aufgaben für einzelne Variablen entstehen und lass dann die Klasse diese Aufgaben erledigen. Diese Gedanken machst du dir am besten bevor du richtig loslegst. Zumindest grob.



  • Ich sehe noch nicht so recht, warum man Unterstrukturen wie peripherie, steuerung und status haben sollte.

    Ich würde einfach mit einer Behälterklasse anfangen - eigentlich hat ein Behälter doch nur 2 Eigenschaften: ein Volumen und einen Füllstand (ggf. auch den Inhaltsstoff). Mir erschließt sich zum Beispiel der bool-Parameter von befuellen und entleeren noch nicht. Gehören die Ventile zum Behälter? Das kann man jetzt so direkt nicht beantworten, ohne das exakte Problem zu kennen, finde ich.

    Vielleicht brauchst du eine separate Steuerungsklasse - ggf. gehören die Ventile dieser Klasse. Aber vielleicht ist das auch overkill...



  • Ja, mir scheint hier soll unbedingt deas Antipattern einer Gottklasse angewendet werden. Das ist in C++ nicht sinnvoll. Wie jemand schon schrieb, ist es nicht gut einfach das machen zu wollen was in SPS gemacht wird. Die Herangehensweise ist schon sehr unterschiedlich.


Log in to reply