"System/Funktionale"-Programmierung

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

"System/Funktionale"-Programmierung

Beitrag von cloidnerux » Mo Mai 11, 2015 2:37 pm

Ich habe in letzter Zeit viel damit zu tun, Maschinen und Software eine Funktionalität zu verpassen und darum soll es hier auch gehen.
Es ist schwer, das Themengebiet zu beschreiben. Man möchte eine Funktionalität implementieren, aber Funktionale Programmierung hat schon eine andere Bedeutung. Systemprogrammierung passt auch nicht ganz, es erinnert zu sehr an Betriebssysteme.

Was ich mache und brauche sind Konzepte und Datenstrukturen, mit denen man effizient und robust einer Maschine oder einem Programm eine Funktion beibringt. Dabei geht es um Abläufe, eine Stanzmaschine muss erst warten bis ein Blech oder ähnliches geladen wurde, bevor sie stanzen kann. Dabei muss aber auch beachtet werden, dass kein Werker in Gefahr kommt. Von daher müssen entsprechende Sensoren verknüpft werden. Was passiert wenn ein Totmanschalter nicht mehr ausgelöst wird, wie kehre ich in eine sichere Position zurück.

Es geht aber auch um Modularisierung. Wie baue ich Module auf, was macht sinn. Wie binde ich die Module an. Soll ein Modul zum Steuern einer Linearachse die Zielpositionen kennen und nur gesagt bekommen, welche sie Anfahren soll? Oder kommt diese Info von extern? Soll eine Verknüpfung von Sensorwerten innerhalb oder außerhalb des Moduls statt finden?
Wie garantiere ich, dass ich nicht in einen undefinierten zustand gerate?

Letzter Punkt sind Datenstrukturen zur Parametrisierung und Steuerung eines solchen Systems. Häufig habe ich viele viele Einzelwerte, magic numbers quasi, die verwaltet werden müssen.
Was kann man hier für Ansätze verfolgen. Baumstrukturen, Listen, Globale Variablen. Wie sichere ich den Zugriff, wie kann man die Werte speichern.
In wie weit macht OOP sinn.

Natürlich kann man jetzt einfach auf PAP, Nassi-Schneidermann, UML oder Struktogramme verweisen, aber keine dieser Diagramme bietet einen Weg, komplexere Verknüpfungen sinnvoll dar zu stellen. Hat man z.B ein Not-Aus Signal möchte man nicht für jeden Schritt einer State Machine eine extra Bedingung anlegen, ob eben dieser Notaus gedrückt wurde. Man implementiert eine globale Logik die eben den Notaus und den aktuellen Zustand verarbeitet, um einen Sicheren zustand zu erreichen. Dies kann man aber mit keinem der Diagrammarten sinnvoll darstellen.

Was ich hier gerne hätte sind Ideen, Vorschläge und Informationen zu eben diesen Themen. Man kennt ein Buch, das eben solche bereiche anschneidet? Man liest einen Interessanten Blog/Wiki Eintrag darüber? Man hat selber Erfahrungen? Bitte sowas hier Posten.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: "System/Funktionale"-Programmierung

Beitrag von nouseforname » Mo Mai 11, 2015 5:22 pm

Also ganz grob würde ich es Modular so aufteilen dass Bereiche die grundsätzlich nichts mit dem Hauptprozess (üblicherweise die GUI) zu tun haben.

- GUI / Steuerungsmanager
- CNC / Steuerung und Kontrolle der Achsen; erhält Fahrbefehle und gibt Positionen und Stati zurück
- SPS / Steuerung bzw. Kontrolle der Sicherheitskreise, Sensoren, Schalter usw; erhält Steuerbefehle für zB Ventile und gibt Stati zurück
- andere Module wie zB Bildverarbeitung


Die eingebundenen Module haben untereinander grundsätzlich keinen Zugriff, die GUI steuert alles. Datenaustausch via get/set und/oder interfaces
Was die Parametrisierung betrifft existieren wohl diverse Möglichkeiten. Ich würde alle Parameter in einer Datei Speichern, sei es nun ini, xml oder was auch immer. Die Werte werden beim Starten geladen und beim beenden gespeichert, so dass eventuell veränderte Werte wieder zur Verfügung stehen. Wie diese Werte während er Laufzeit gespeichert werden hängt wohl auch vom Umfang des Projektes ab. Ich könnte mir eine eigene "Config"-Klasse dafür vorstellen, welche dann auch die Werte der anderen Module enthalten kann. OOP macht hier für mich definitiv Sinn, so können alle Module als Objekt bereit gestellt werden. Und so kann auch die Konfiguration während der Laufzeit leicht geändert werden.. Stichwort Achsenoffset ändern etc.


Vielleicht hilft das ja, vielleicht ist das was ich schrieb aber sowieso klar. :)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: "System/Funktionale"-Programmierung

Beitrag von cloidnerux » Mo Mai 11, 2015 9:57 pm

Also ganz grob würde ich es Modular so aufteilen dass Bereiche die grundsätzlich nichts mit dem Hauptprozess (üblicherweise die GUI) zu tun haben.
Und damit bist du ca zwei Abstraktionsebenen zu hoch, zumindest das für das was ich im Sinn habe. :D
GUI / Steuerungsmanager
- CNC / Steuerung und Kontrolle der Achsen; erhält Fahrbefehle und gibt Positionen und Stati zurück
- SPS / Steuerung bzw. Kontrolle der Sicherheitskreise, Sensoren, Schalter usw; erhält Steuerbefehle für zB Ventile und gibt Stati zurück
Das funktioniert für bestimmte Fälle, aber nicht für die restlichen 95+%.
Es gibt keine "CNC", das wird Softwaretechnisch über eine SPS geregelt. Die GUI greift dann meist auf irgendwelche Variablen zu, die in der SPS existieren und manipuliert diese.
Und da bist du bei meinem Problem:
Wie baue ich ein Steurungsmodul in der SPS, das im Regelbetrieb einen bestimmten Ablauf durchführen soll, aber möglichst durch keine Kombination externer Signale aus dem Konzept gebracht werden kann?
Die eingebundenen Module haben untereinander grundsätzlich keinen Zugriff, die GUI steuert alles. Datenaustausch via get/set und/oder interfaces
Jetzt realisiere das auf 8-Bit Mikrocontrollern, die an einem Netzwerkbus hängen und in Echtzeit operieren.
Wie diese Werte während er Laufzeit gespeichert werden hängt wohl auch vom Umfang des Projektes ab. Ich könnte mir eine eigene "Config"-Klasse dafür vorstellen, welche dann auch die Werte der anderen Module enthalten kann.
Stelle dir vor, du schreibst das Steuerungsprogramm für eine Industriestrecke, 15 Stationen mit 170 Sensoren und 35 Aktoren, 30 Signallampen und diversen Einheiten die per ProfiBus angebunden sind.
Jetzt möchtest du einen neuen Parameter in einem Submodul anlegen, der an einer anderen Stelle geschrieben wird, in der GUI angezeigt und auch Manipuliert werden soll. Und das nicht in C++, C# oder Java, sondern in ST auf einer CoDeSys fähigen SPS.
Man kann natürlich eine Singleton-Klasse anlegen, die ein Interface anbietet über das du per Schlüssel und Datentyp einen Parameter anfordern kannst, der beim Starten entweder neu generiert oder aus einer Datei geladen wird. Das wird dann mit einer Baumstruktur gekoppelt und man hat schon was nutzbares. Möchte man jetzt aber beliebige typen, die alle am besten direkt aus der GUI bearbeitet werden können, wird es etwas schwieriger.
Und besonders schwierig wird es, wenn man nur 32kb RAM hat und 172MHz Prozessortakt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: "System/Funktionale"-Programmierung

Beitrag von nouseforname » Di Mai 12, 2015 7:07 am

Die Systemvorrausetzungen wurden zuvor ja nicht angegeben. Wenn Du nur die SPS programmieren musst ist das ganze natürlich anders aufzusetzen. Die SPS muss alle externen Signale selbst überprüfen, und sich selbst absichern. Die GUI muss auf die SPS warten bis diese"Bereit" meldet. Das ganze ist natürlich leichter gesagt als getan.

Antworten