Schnittstellen in Programmen für Dumme erklärt
-
Hallo zusammen,
ich freue mich, Teil dieses Forums zu sein. Ein herzliches Dankeschön für die Aufnahme!
Vorab möchte ich kurz meine bisherige Erfahrung mit Programmierung teilen. Vor etwa 30 Jahren habe ich mit Qbasic begonnen, später in meiner Jugend etwas mit PHP, MySQL und Javascript experimentiert. Nach meiner Jugend habe ich jedoch keine Programmierprojekte mehr umgesetzt, und das, was ich damals gemacht habe, war eher "mehr schlecht als recht" ;-).
Aktuell plane und baue ich eine neue Anlage im privaten Bereich. Für dieses Vorhaben benötige ich eine maßgeschneiderte Software, die auf dem Markt nicht verfügbar ist. Daher überlege ich, wie ich dieses Projekt am besten angehen kann. Ich bin der Meinung, dass es nicht zielführend ist, alle Aspekte von einer Person abdecken zu lassen. Daher überlege ich, wie man die Software am besten strukturiert.
Ein Beispiel hierfür wäre die Implementierung von Schnittstellen in der Software, um verschiedene Teile weiterentwickeln zu können, ohne alles komplett neu machen zu müssen. Allerdings ist mir nicht klar, wie so etwas aussehen könnte oder in der Praxis umgesetzt werden kann.
Mir geht es hier weniger um den Code selbst, sondern eher um die grundlegenden Abläufe, die leicht verständlich erklärt werden. Hier sind die wichtigsten Schritte:
- Das Objekt wird unter 2 bis 3 3D-Scannern platziert.
- Das Objekt wird gedreht und dabei gescannt.
- Anhand seiner Struktur wird das Objekt auf "Fehler", "CNC Fräsbahnen", "Fremdkörper" usw. analysiert.
- Die Analyse wird dem Anwender präsentiert, inklusive Kamerabild und Rohdaten.
- Der Anwender kann Fehler automatisch beheben oder manuell korrigieren.
- Bei jeder Bewegung des Objekts erfassen die 3D-Scanner alle Daten und aktualisieren die Dokumentation.
- Der Anwender muss die "CNC Fräsbahnen" freigeben oder entsprechend anpassen und dann freigeben.
- Nach Freigabe wird das Objekt entsprechend gedreht und bearbeitet.
- Während aller Vorgänge kann sich das Objekt leicht bewegen, daher müssen die 3D-Scanner den Ursprung des Objekts erfassen und in der Software korrigieren.
In diesem Ablauf sind einige zeitkritische Schritte enthalten, insbesondere bei der Bewegung des Objekts während der Bearbeitung. Die Software sollte daher auf Geschwindigkeit und Ressourcenoptimierung ausgelegt sein.
Was ich in verschiedenen Blöcken der Software sehe:
1 Hauptsoftware (Ablauf, GUI, Schnittstellen)
2 3D-Scanner Rohdaten: Aufbereitung und Bereitstellung für die Weiterverarbeitung
3 3D-Scanner Daten: Aufbereitung, Analyse und Bereitstellung
4 Live-Prüfung und Korrektur des Ursprungs des Objekts anhand der Scandaten
5 Manuelle Bearbeitung bestimmter Positionen
6 Automatische Bearbeitung von "Fehlern" usw.
7 Ermittlung von CNC Fräsbahnen
8 Manuelle Nacharbeitung von CNC Fräsbahnen
9 Freigabe von CNC Fräsbahnen
10 Automatische Bearbeitung von CNC Fräsbahnen am Objekt
11 Dokumentation aller Daten im laufenden BetriebMir ist bewusst, dass dieses Projekt umfangreich ist und nicht von einer Person allein umgesetzt werden kann.
Allerdings habe ich Schwierigkeiten, mir die Schnittstellen in der Software vorzustellen. Es wäre großartig, wenn mir jemand, der es verständlich erklären kann, hier weiterhelfen könnte.
Kann man sich solche Schnittstellen als Funktionen vorstellen, die dann in den Programmcode implementiert werden können?
Vielen Dank für eure Unterstützung! Falls ich im falschen Forum gelandet bin, bitte ich um Verständnis und Verschiebung des Themas. Es war keine Absicht, und ich habe lange darüber nachgedacht, wo es am besten hineinpasst.
Herzliche Grüße,
Mücke
-
@Muecke82
Fangen wir erst einmal mit einem Software-Modul an. Ein Software-Modul ist ein in sich selbst abgeschlossener Code, welcher meistens an mehreren anderen Stellen verwendet wird, manchmal diverse austauschbare Ausprägungen anbietet und abwärtskompatibel sein sollte. Der öffentliche, für den Benutzer relevante Teil, nennt sich Schnittstelle.Ein Beispiel:
Du möchtest 3D Scanner nutzen. Doch welche Marke? Und was machst du, wenn du einen Scanner eingebaut und getestet hast, du aber einen anderen Scanner nutzen möchtest?
Die Lösung des Ganzen ist ein Software-Modul names Scanner. DIe Schnittstelle hierzu könnte man folgendermaßen definieren:
#include <string> #include <memory> class IScanner { public: using Result = int; ///< Rückgabecode typedef std::string PortString; ///< Portdefinition (COM = seriell, BT:ADDR = Bluetooth Adresse, WLAN:PSID = WLAN) /** * @brief Öffnet eine Verbindung zu einem Scanner. * * Der Code kann die folgenden Exceptions werfen: .... * * @param Port * * @return */ virtual Result OpenConnection(const PortString& Port); }; class Scanner_RPLIDAR_S2 : public IScanner { public: Result OpenConnection(const PortString& Port) override { // ... return 0; } }; class Scanner_RPLIDAR_S2L : public IScanner { public: Result OpenConnection(const PortString& Port) override { // ... return 0; } }; //... int main(int, char**) { std::unique_ptr<IScanner> Scanner = std::make_unique<Scanner_RPLIDAR_S2>(); //std::unique_ptr<IScanner> Scanner = std::make_unique<Scanner_RPLIDAR_S2L>(); // // Ab hier kommt Scanner->OpenConnection("COM1"); //... return 0; }
Die Schnittstelle ist
IScanner
, die Ausprägungen sindScanner_RPLIDAR_S2
undScanner_RPLIDAR_S2L
. Man kann diese problemlos austauschen. Wenn man einen neuen Scanner benötigt, so fügt man diesen einfach hinzu. Andere Teile des Codes, welche das Modul nutzen, funktionieren weiterhin. Es sehe anders aus, wenn z.B. die Schnittstellen-FunktionOpenConnection()
um einen Config-Parameter erweitern hätte. Man müsste dann nämlich alle Stellen anpassen, woOpenConnection()
verwendet wird.Und das ist die Kunst der Definition einer Schnittstelle. Sie sollte so definiert werden, dass diese möglichst abstrakt ist und alle Eventualitäten abdeckt, damit diese soweit wie möglich abwärtskompatibel ist.
Zwar unterstützen viele Programmiersprachen Schnittstellen-Definitionen (z.B. via Schlüsselwort
interface
), man kann diese aber auch von Hand als eine Reihe von Enums, Typedefs, Funktionen definieren. So entsprechend viele DLLs von Windows diesem Konzept. Ein Beispiel hierfür ist die WinAPI FunktionIsWindow
. Diese Funktion ist in Windows.h definiert (= Schnittstelle für WinAPI Funktion), die Ausprägung inUser32.dll
.So ich mache jetzt mal Schluss, bevor ich dich gänzlich überfordere.
-
Oha, ich habe das jetzt 4 oder 5 Mal gesehen und mein Kopf läuft auch auf Hochtouren, ich verstehe einen kleinen Teil und kann das nachvollziehen, aber ich bin mit meinem Denkprozess noch nicht ganz durch.
Ich muss das noch ein bisschen verarbeiten, wenn ich so weit bin, komme ich wieder auf dich / euch zu.
Vorerst mal danke für die erste Erklärung.
-
Bis du denn schon mit C++ soweit vertraut, daß du Projekte (Konsolenanwendung, GUI-Anwendung, ...) erstellen kannst?
Für die GUI mit C++ könntest du z.B. entweder Qt (für 3D s. Qt 3D Overview) oder gleich Dear ImGUI (welches komplett auf einer Grafikengine wie z.B. OpenGl oder DirectX läuft) verwenden.Ansonsten würde ich eher C# + .NET empfehlen, da der Einstieg dadrin deutlich einfacher ist: .NET-Dokumentation
Ich nehme an, du willst eine Desktop-App für Windows entwickeln? Dann ständen als GUIs Windows Forms und WPF zur Verfügung (es gibt aber auch Crossplattform-GUIs wie Avalonia UI, Uno Platform, ..).
-
Danke der Nachfrage Auf jeden Fall bin ich, bis auf die C-Altlasten, nach nunmehr gut 10 Tagen ganz gut in C++ angekommen. Des Weiteren bin ich Rentner (70) und von daher erfreue ich mich jeden Tag meines Web-Application Framework was ich nunmehr auch mit C++ weiterentwickeln kann. In Sachen OOP komme ich von Perl 5, von daher sieht die Weiterentwicklung meines WebFW mit C++ ganz ähnlich aus, denn mein FW ist schon immer objektorientiert und C++ kommt der OO-Philosophie wohl näher als jede andere PL mit der ich bisher zu tun hatte.
Auf jeden Fall ist es schon ein Erfolg, daß sich meine mit C++ erzeugten Webseiten nicht von den anderen Seiten unterscheiden die mit Perl oder PHP erzeugt werden, die fügen sich nahtlos ein samt Navigations-Menu.
Für Konsolenanwendungen bevorzuge ich Perl, da allein ich die benutze. Auch das ist ein richtiges Framework mit einer CLI und die Idee zu diesem Command Line Interface kam mir beim Arbeiten mit CISCO Routern und SwichesDie nächste Idee für mein Consolen FW: Ein HTTP-Client der mir auf Knopfdruck aus dem Editor heraus meine cpp-Datei auf den produktiven Server lädt und gleich kompiliert.
Honorarprogramme schreibe ich nicht mehr, aber so manche Idee gebe ich gerne weiterViele Grüße!
-
@_ro_ro: Du hast dich im Thema vertan - diesmal warst du nicht gemeint.
Aber danke für deine Beschreibung (jetzt weiß ich ein bißchen mehr, wozu dein Code in den anderen Themen von dir gehört).
Und guten Rutsch wünsche ich.
-
-
@Th69
Ich habe noch nie etwas in C++ geschrieben (stimmt nicht ganz kleine Arduino Projekte mit den Kindern hab, eich mal gemacht, da wird glaube ich auch C++ oder C verwendet) und werde es wahrscheinlich vorerst auch nicht tun.Es geht mir um das Grundverständnis, um zu verstehen, was ich brauche oder für mich in Betracht ziehen kann, aber programmieren muss es jemand anderes!
(deshalb suche ich noch hier im Forum, ob es eine Ecke gibt, woher wer kommt, eventuell für ein Treffen oder eine Zusammenarbeit).Mein Projekt ist zur Zeit ein privates Projekt, aber wenn es Erfolg hat (d.h. es ist realisierbar), wird es in ein kommerzielles Projekt umgewandelt.
Ich setze auf C++, da dies eine Sprache ist, die Koppelort wird (schnell), ich einen Haufen Rohdaten vom Scanner bearbeiten (analysieren) muss, und die Maschinensteuerung über eine Schnittstelle zu C++ verfügt.
Daher würde ich die Software gerne in C++ erstellen lassen.
Da es sich aktuell um ein Ein man Project handelt, sollte ich zumindest in der Theorie verstanden habe wie so was geht.
Damit ich dann, wenn ich etwas beauftragen würde, auch weis, was ich da machen lassen möchte.Die Erklärung von @Quiche-Lorraine geht in die Richtung.
-
@_ro_ro sagte in Schnittstellen in Programmen für Dumme erklärt:
stimmt, sorry
Egal. Euch allen einen Guten Rutsch ins neue Jahr !!
_roro
Oh Mann und ich habe schon gedacht, ich habe was falsch verstanden.
Danke, das wünsche ich euch auch allen! Guten Start ins Jahr 2024.
-
@Muecke82 sagte in Schnittstellen in Programmen für Dumme erklärt:
Ich setze auf C++, da dies eine Sprache ist, die Koppelort wird (schnell)
Du meinst sicherlich "die kompiliert wird"?!
Das sind aber fast alle top-ranking* Sprachen, die native Kompilate erzeugen (C, C++, C#, Java, Delphi, ...), nur wenige benutzen Interpreter (Python oder Websprachen wie JavaScript oder PHP).
-
@Th69 sagte in Schnittstellen in Programmen für Dumme erklärt:
@Muecke82 sagte in Schnittstellen in Programmen für Dumme erklärt:
Ich setze auf C++, da dies eine Sprache ist, die Koppelort wird (schnell)
Du meinst sicherlich "die kompiliert wird"?!
Das sind aber fast alle top-ranking* Sprachen, die native Kompilate erzeugen (C, C++, C#, Java, Delphi, ...), nur wenige benutzen Interpreter (Python oder Websprachen wie JavaScript oder PHP).Oh sorry, ja das meinte ich.
Da ich für die Hardwaresteuerung schon eine Software im Einsatz habe, die alle Hardware Komponenten überwacht, steuert und Fehlerprüfungen übernimm und diese eine Schneit stelle zu C++ hat, dachte ich an C++.
-
@Th69 sagte in Schnittstellen in Programmen für Dumme erklärt:
Ich nehme an, du willst eine Desktop-App für Windows entwickeln? Dann ständen als GUIs Windows Forms und WPF zur Verfügung (es gibt aber auch Crossplattform-GUIs wie Avalonia UI, Uno Platform, ..).
Eine Windowsanwendung wäre schön, da dies sehr weit verbreitet ist, jedoch läuft aktuell die Hardware Steuer Software auf einem Linux Rechner, die der Rechner (für die Anzeige) an der Maschine fest verbaut ist, spielt es wahrscheinlich keine Rolle und es wäre geschickter auf Linux zu setzen, da hier schon die Hardwaresteuerung ist.
Der Rechner (für die Anzeige) soll nebenher nicht für andere Dinge genutzt werden vom Anwender.Das QT habe ich in einem anderen Projekt schon mal gelesen, dass damit was gemacht wurde, auch bei Linux.
Das schaue ich mir mal an, wenn ich mit den Schnittstellen Verständnis für mich weiter gekommen bin.
-
@Quiche-Lorraine:
Ok, da habe ich wieder was dazu gelernt, ich glaube dann meine ich nicht unbedingt die Schnittstellen, sondern Software-Module bzw. eine Mischung aus beiden.Das Beispiel von dir ist gut, mal schauen, ob ich es verstanden habe.
Um bei deinem Beispiel zu bleiben, den 3D -Scanner.Meine Software (wie nennt man das dann richtig Hauptsoftware?) benötigt verschiedene Dinge z.B. einen 3-D-Scanner, CNC-Steuerung etc.
Für den 3-D-Scanner benötige ich einen "Treiber" dieser ist in sich abgeschlossen und in einem extra "Modul" in der Hauptsoftware definite ich jedoch, welche Daten ich wie benötige (Schnittstelle) das bedeutet der "Treiber" muss dann die Daten egal welcher Scanner das da ist (der ist ja extra für den Scanner geschrieben) so bereitstellen.
Wenn der Scanner sich verändert (anderer Scan er) dann muss ein Neuer "Treiber her, der die Daten wieder so aufbereitet, dass meine "Hauptsoftware" damit umgehen kann.Du meintest das dann in den Dateien DLL stehen würde, die bei einem Programm mit geliefert werden. Diese kann ich dann auch später austauschen, z.B. bei einer neuen Generation von Scannen.
Soweit habe ich das verstanden. Da geht es dann um die Nutzung von Hardware.
Könnten wir so ein Beispiel mit einer Software teil durchspielen?
z.B. Meine Hauptsoftware folgt einem bestimmten Ablauf, bzw. hat verschiedene neue ich es mal Frames, kenne ich von Webseiten.
Diese Frames bauen aufeinander auf bzw. können entsprechend aufgerufen werden.
Damit ein bestimmter Frame aufgerufen werden kann, muss unter Umständen ein anderer Frame schon durchlaufen sein.Der Frame "Eingangsmessung" beinhaltet somit die Schnittstelle für den Scaner (denn die Daten müssen ja eingelesen werden, da die Schnittstelle selbst jedoch keine Aktion ausführt, muss die CNC Schnittstelle auch mit angesprochen werden.
Jetzt bekomme ich die Daten vom Scanner mit den Daten der CNC Schnittstelle. Das füge ich dann in einem separaten Modul zusammen (ist das dann auch ein ausgelagerter Code), wenn dies erfolgt ist kann erst die Eingangsanalyse erfolgen (was dann auch wieder ein ausgelagerter Code ist, und mir alle relevanten Dinge zur Verfügung stellt, (in einer Schnittstelle) diese relevanten Analyse Dinge (Fehler, Probleme etc am Model) kann ich dann nach einander abarbeiten und wenn das alles von Rot auf Grün springt dann kann ich das nächste Modul (ausgelagerter Code) ansprechen, dass das Model entsprechend mit den Schnittstellen Scanner CNC etc. bearbeitet.
Oh Mann, das ist ja dann ziemlich viel "Ausgelagerter" Modulcode"
Hab das halbwegs richtig verstanden?
gruß Mücke
-
Ausgelagert heißt nicht unbedingt, daß jedes in einer separaten Bibliothek (DLL) sein muß.
Stichwort: Separation of concernsFür C++ würde man einfach verschiedene Namensbereiche (
namespace
) und Klassen (class
) verwenden.Wichtig ist nur, daß diese möglichst unabhängig von anderen (konkreten) Klassen sind -> und genau dafür definiert man Schnittstellen (in C++ meist als abstrakte Klassen implementiert).
Über diese Schnittstellen "kommunizieren" dann die verschiedenen Klassen miteinander, z.B. per Dependency Injection (DI).Generell gibt es noch die SOLID Prinzipien, an denen sich die meisten objektorientierten Anwendungen halten sollten.
Ich weiß, das sind jetzt viele technische Begriffe, aber diese helfen dir dabei, dich mit dem eigentlichen Entwickler zu unterhalten.
-
@Muecke82 sagte in Schnittstellen in Programmen für Dumme erklärt:
Könnten wir so ein Beispiel mit einer Software teil durchspielen?
z.B. Meine Hauptsoftware folgt einem bestimmten Ablauf, bzw. hat verschiedene neue ich es mal Frames, kenne ich von Webseiten.
Diese Frames bauen aufeinander auf bzw. können entsprechend aufgerufen werden.
Damit ein bestimmter Frame aufgerufen werden kann, muss unter Umständen ein anderer Frame schon durchlaufen sein.
Der Frame "Eingangsmessung" beinhaltet somit die Schnittstelle für den Scaner (denn die Daten müssen ja eingelesen werden, da die Schnittstelle selbst jedoch keine Aktion ausführt, muss die CNC Schnittstelle auch mit angesprochen werden.
Jetzt bekomme ich die Daten vom Scanner mit den Daten der CNC Schnittstelle. Das füge ich dann in einem separaten Modul zusammen (ist das dann auch ein ausgelagerter Code), wenn dies erfolgt ist kann erst die Eingangsanalyse erfolgen (was dann auch wieder ein ausgelagerter Code ist, und mir alle relevanten Dinge zur Verfügung stellt, (in einer Schnittstelle) diese relevanten Analyse Dinge (Fehler, Probleme etc am Model) kann ich dann nach einander abarbeiten und wenn das alles von Rot auf Grün springt dann kann ich das nächste Modul (ausgelagerter Code) ansprechen, dass das Model entsprechend mit den Schnittstellen Scanner CNC etc. bearbeitet.
Oh Mann, das ist ja dann ziemlich viel "Ausgelagerter" Modulcode"
Hab das halbwegs richtig verstanden?Oh je, jetzt raucht mir die Birne.
Bei deinem Text habe ich eher das Gefühl, wir befinden uns in der ersten Phase der Software-Entwicklung, der Analyse. Hierzu wäre ein Hilfsmittel ein UML Klassendiagramm hilfreich.
Und wie Th69 schon sagte, ein Modul muss nicht unbedingt eine externe Bibliothek (.dll) sein, es kann auch eine interne Bibliothek (.lib) oder auch einfach Menge von Quelldateien sein.
-
@Quiche-Lorraine sagte in Schnittstellen in Programmen für Dumme erklärt:
Oh je, jetzt raucht mir die Birne.
Bei deinem Text habe ich eher das Gefühl, wir befinden uns in der ersten Phase der Software-Entwicklung, der Analyse. Hierzu wäre ein Hilfsmittel ein UML Klassendiagramm hilfreich.
Ja das ist richtig, ich kenne mich mit so was nicht wirklich aus, als ich das gemacht habe, habe ich da nur sehr einfache dinge gemacht.
Das mit dem UML Klassendiagramm habe ich nicht ganz verstanden. Da ich eins erstelle, was ich mir wie vorstelle?
Das klingt sehr interessant und würde die Gazen Punkte der Software, was eigentlich gemacht werden muss etc. veranschaulichen, das gefällt mir ganz gut. Es ist auch definiert, was wie dargestellt werden soll / muss. So dass es andere verstehen.
Gibt es da ein Software (Windows), mit der man solche Modelle erstellen kann? Die entsprechend mit wachsen können? Wenn mir weitere dinge einfallen? Oder klar werden, die ich noch nicht bedacht habe?Und wie Th69 schon sagte, ein Modul muss nicht unbedingt eine externe Bibliothek (.dll) sein, es kann auch eine interne Bibliothek (.lib) oder auch einfach Menge von Quelldateien sein.
Ok, das muss noch etwas sacken im Kopf.
-
Ich habe mir einige Videos über Qt angesehen. Habe ich das richtig verstanden?
Qt kann die GUI mit Buttons darstellen, Werteingabe, Text, Grafikausgabe etc. und man kann dann die ganzen Elemente mit Code füttern bzw. mit anderem Code verknüpfen, so dass dann entsprechende Werte dorthin übergeben werden bzw. von dort zurückgesendet werden zur Darstellung?Grob verglichen, mit HTML zur Darstellung.
Auf der Seite von Qt habe ich allerdings nur Downloads gefunden, die man bezahlen muss, im Internet habe ich aber auch gelesen, dass es kostenlose Versionen geben soll. (Sind die dann legal?)Denn wenn das so ist, könnte ich mir dann eine GUI zusammenbasteln und damit die Funktionen der Software darstellen, noch ohne echten ausführbaren Code im Hintergrund?
Gruß Mücke
-
@Muecke82
Ja, die miesten Teile von QT sind kostenlos verwendbar - auch für kommerzielle closed source Projekte. Einige speziellere Teile sind GPL etc., da gibt es strengere Restriktionen.Es gibt auch unofiziell Installer dafür, welche je nachdem etwas praktischer sind:
https://github.com/miurahr/aqtinstallAlles ohne Probleme verwendbar.
-
Ja, bzgl. der Funktionsweise hast du das richtig verstanden.
Am besten, du benutzt dafür dann den zugehörigen Editor "Qt Creator", so daß du mit dem dann visuell die GUI erstellen kannst (anstatt nur über Code aus).
Es gibt zwei unterschiedliche Qt-GUI Komponenten (und damit verbundene Projekte):- (neuere) QML
- klassische Qt
Es kann sein, daß nur für QML ein Designer verfügbar ist.
Ansonsten, so wie @Leon0402 gerade geschrieben hat, ist der meiste Teil kostenlos (mit entsprechender Lizenz).
Die direkten Downloads gibt es unter Qt Downloads: Official Releases (da gibt es auch den Download zu dem separaten Qt Design Studio, falls du ersteinmal nur die GUI erstellen möchtest, ohne Code).Edit: Es gibt wohl nur bis Version 2.3.1 das Qt Design Studio als Community Edition frei zum Download, aber das müßte für dich zum Test erst einmal ausreichen.
-
Ok, das ist schon mal gut, dass ich das richtig verstanden habe (grundlegend)
Ja, ich würde die GUI erst einmal ohne Code erstellen.
Da gibt es so viel verschiedenes.
Ich benötige das "Qt Design Studio" um die GUI ohne Code zu erstellen (später kann man dann code dranhängen)
Bei deinem Downloade Link wäre das dann der Ordner "qtdesignstudio/" da sehe ich jedoch die Version 3.5.0 aus dem Jahr 13-Jul-2022.Das müsste ich mir installieren? (auf meinen WIN 10 Rechner)? Mehr benötige ich dann vorerst nicht?