# Architektur/Design Leitsystem



## mbi (9 August 2017)

Hallo zusammen

Darf nun ein paar Änderungen an einer in VB.net selbst geschriebenen Visualisierung machen. (nicht von uns)
Das Programm ist mit 2 SPS Steuerungen verbunden. 
2 serielle Schnittstellen werden benutzt für die Kommunikation mit 2 Messgeräten
Produktionsdaten von SPS und Messgeräten werden in eine Datenbank gespeichert.
Auftragsdaten werden von einer Excel-Datei gelesen.

Persönlich finde ich das Programm 'hässlich'. Wie es aber besser machen????

Es gibt 2 Windows Forms Timer. Die sind riesig. Darin wird je 1 SPS abgefragt und dann die GUI je nach Bit geändert. (z.B. Sensoren als bedeckt anzeigen) Je nach Auftragsstatus noch in die Datenbank geschrieben. 
(gut ist alles im gleichen DB liegt)
Die seriellen Daten werden im Empfangsevent verarbeitet und falls nötig auch in die Datenbank geschrieben.
Falls ein Button gedrückt wird dies sofort an die SPS gesandt. 

Wie macht ihr das? Oder würdet ihr das umsetzen?
z.B. Konkret: Wie ändert ihr die Farbe eines Button je nach Bit. (Bit 13.3 ist Grün Button XY. Wie schreibt man das lesbar.) 
(Im aktuellen Projekt ist alles so mit Zahlen und kein einziger Button wurde Benannt alle tragen noch die Default Bezeichnung :evil

Vielleicht hat jemand ein Grundgerüst das wäre super.
Hoffe meine Frage ist verständlich
Gruss mbi


----------



## Larry Laffer (10 August 2017)

Hallo,
um auf deine Frage richtig konkret werden zu können muss man m.E. das Projekt kennen.
Das Design einer Applikation ist in jedem Fall Geschmackssache - aber daran wäre ja am Leichtesten etwas zu ändern - oder ?

Aber ein paar grundsätzliche Dinge :
- ein Control kann natürlich in seinem Namen seine Funktion beinhalten (TextBox_Anzeige_Stückzahl, Button_Abbruch etc.) - das ist auf alle Fälle schon mal guter Stil und hilft dem, der da später mal dran muss.
- Timer sind Komponenten - die sieht man nicht direkt. Du meinst hier sicherlich deren Methoden-Aufruf ... so etwas würde ich sehr wahrscheinlich eher mit einem Thread lösen. Das Problem hierbei ist dann nur, dass man Daten an UI-Controls an diese Invoken muss - man kann nicht mehr direkt auf die Controls schreiben.
- wie wird denn eigentlich mit der SPS kommuniziert ? AGLink ? oder andere Bibliothek ?
- um zu deiner Farbumschaltung etwas sagen zu können wäre auch wieder der Code davon interessant. Prinzipiell würde ich mir aber möglicherweise einen eigenen "customized" Button erstellen, der von Button ableitet und in sich selbst die notwendigen Aktionen durchführt auf der Basis vom Zustand seiner Properties.

Gruß
Larry


----------



## Hans54216 (10 August 2017)

Mal bei google oder youtube eingeben, da gibt es hunderte Beispiele.
Mir scheint da fehlt es schon grundsätzlich.


----------



## mbi (10 August 2017)

Hallo Larry

Danke fuer deine Antwort. Das mit den Windows.Forms.Timer ist wohl gewaehlt worden da es einfacher ist.
Hier mal ein Code Ausschnitt: (Gekuerzt/Vereinfacht)

```
Private Sub Timer10_Tick (ByVal ......) Handles Timer10.Tick

getdb100(readBuffer) ' lesen von SPS

....
If (readBuffer(1092) AND 16) <> 0 Then
Button79.BackColor=Color.Red
Else
Button79.BackColor=Color.White
End If
If (readBuffer(1092) AND 32) <> 0 Then
Button80.BackColor=Color.Red
Else
Button80.BackColor=Color.White
End If
... ' so geht es ca. ueber 30 Button

TextBoxt13.Text=readBuffer(680) ' so ca. 15 weitere Textboxen
```

Sie SPS Kommunikation passiert ueber den IP-S7-Link von Traeger.
Was also z.B. in readBuffer(680) steht hab ich 2 Wege. Auf der SPS schauen oder die TextBox13 suchen.
Klar das mit einem sprechenden Name fuer Label und Textboxen waere schon vieles besser. Aber es bleibt diese Lange Timer Sub mit der Farbumschaltung etc. 
Customized Button waere da schon eleganter. Obwohl ich gerade nicht weiss wie umsetzten.

Wie wuerdest das mit den Thread aussehen?
1 Thread fuer jede SPS Kommunikation? 
Sobald alle Daten vorhanden sind in einem anderen Thread in die Datenbank schreiben?

Bin froh um Tipps wie ihr das umsetzen wuerdet.
Danke 
Gruss mbi


----------



## Thomas_v2.1 (10 August 2017)

Schau dir doch mal das Opensource Projekt "Advanced HMI" an, das ist ebenfalls in VB geschrieben. Das nutzt eigene Controls die die Anbindung automatisch ausführen.

Diese Timer-Tick Lösung mit handausprogrammierten Animationen ist etwas um mal schnell 3-4 Buttons ohne großen Aufwand zu animieren, aber nichts für eine ausgewachsene Visualisierung / Leitsystem. Ich habe so etwas auch schon gesehen, auch von einer Firma die so etwas verkauft. Ist vielleicht Ansichtssache, aber meiner Meinung nach macht man das so nicht.


----------



## Larry Laffer (11 August 2017)

Thomas_v2.1 schrieb:


> Diese Timer-Tick Lösung mit handausprogrammierten Animationen ist etwas um mal schnell 3-4 Buttons ohne großen Aufwand zu animieren, aber nichts für eine ausgewachsene Visualisierung / Leitsystem. Ich habe so etwas auch schon gesehen, auch von einer Firma die so etwas verkauft. Ist vielleicht Ansichtssache, aber meiner Meinung nach macht man das so nicht.


Sehe ich auch so ... ist hier aber wahrscheinlichnauch als Quick-n-Dirty-Lösung entstanden (darauf deutet sehr vieles für mich hin).

Gruß
Larry


----------



## Larry Laffer (11 August 2017)

mbi schrieb:


> Wie wuerdest das mit den Thread aussehen?
> 1 Thread fuer jede SPS Kommunikation?
> Sobald alle Daten vorhanden sind in einem anderen Thread in die Datenbank schreiben?


Für die Programmierung von Threads unter VB.NET gibt es im Internet (z.B. via Google) jede Menge gut beschriebene Beiträge zu finden. Wenn du so etwas noch nie gemacht hast dann empfiehlt sich hier sowieso, damit erst einmal ein bißchen herumzuspielen. Generell für die .Net-Programmierung empfehlen sich die Foren www.CodeProject.com und www.StackOverFlow.com - beim Erstgenannten gibt es zu sehr sehr vielen Themen sogar sehr gut gemachte Artikel - allerdings immer in Englisch ...



mbi schrieb:


> Bin froh um Tipps wie ihr das umsetzen wuerdet.


Naja ... die ganz wesentlichen Ansätze hast du ja schon selbst genannt. Erstmal auf alle Fälle die Controls sinnvoll benennen. Dann schauen, dass die Methoden, die ggf. an die Control-Events angebunden sind auch sinnvoll benannt sind. Das erleichtert schon mal sehr viel. 
Nun kannst du im Code noch Regionen einfügen und die Methoden sinnvoll in solche hinein sortieren.
An Stelle von Zahlen-Vergleichen könntest du an der Stelle auch mit Enumerationen oder Extension-Methoden arbeiten.
Wenn du Controls "customizen" willst solltest du dir vorher über die gewünschte Sonder-Funktionalität und deren Bedingungen klar sein.

Ich könnte dir da sicherlich bei Vielem behilflich sein ... allerdings so Step by Step ...
Wie würdest du denn deinen Kenntnisstand in der VB.NET-Programmierung einschätzen ...? Kannst du mit allen von mir genannten Begriffen etwas anfangen ?

Gruß
Larry


----------



## Larry Laffer (11 August 2017)

So könnte übrigens der Code eines Buttons aussehen, wie er in deinem Code-Schnipsel benötigt würde (in der einfachsten Form) :
	
	



```
[FONT=Consolas][SIZE=2]
Public Class AnimateButton
    Inherits Button

    Property AnimationColor As Color
        Get
            Return my_AnimationColor
        End Get
        Set(value As Color)
            my_AnimationColor = value
            Me.Invalidate()
        End Set
    End Property
    Private my_AnimationColor As Color = Color.Red
    Private my_BackColor As Color = MyBase.BackColor

    Property Animate As Boolean
        Get
            Return my_Animate
        End Get
        Set(value As Boolean)
            my_Animate = value
            If my_Animate Then
                my_BackColor = MyBase.BackColor
                MyBase.BackColor = my_AnimationColor
            Else
                MyBase.BackColor = my_BackColor
            End If
            Me.Invalidate()
        End Set
    End Property
    Private my_Animate As Boolean = False

End Class

[/SIZE][/FONT]
```


----------



## Jochen Kühner (11 August 2017)

Für ne Quick&Dirty Visu hab Ich auch ein Beispiel mit meiner Dll, siehe: https://github.com/dotnetprojects/D...aster/ExampleWPFVisualization/MainWindow.xaml

Größer Projekte würde Ich so natürlich nicht realisieren, aber für ne Test Anwendung...


----------



## mbi (14 August 2017)

Hallo
Vielen Dank für eure Antworten.
Das "Advanced HMI" Projekt klingt Interessant für mich vielleicht kann ich das was abkucken. 

Schätze meine Programmierkenntnisse als 'besser als Anfänger' ein. Naja schwer zu sagen. Hatte so einiges im Studium. Aber mehr so Verwaltung von Autos oder Bücher etc. als Projekte. WPF und MVVM alles auch gehabt. Ev. fehlt mir einfach das was es bracht um das gelernte nun richtig umzusetzen. 

Eben so Quick&Dirty oder Hello World (libnodave) etc. gibt es viele im Netz. Aber wie macht man es wenn man jetzt schon weiss das es etwas grösseres werden soll? Das war meine Frage. 

Danke euch für eure Anworten. An weiteren Tipps und Beispielen bin ich natürlich Interessiert.
Gruss mbi


----------



## Larry Laffer (15 August 2017)

mbi schrieb:


> Schätze meine Programmierkenntnisse als 'besser als Anfänger' ein.




Naja ... so fängt man halt an ... Die Frage war für mich auch eher als Orientierung ...



mbi schrieb:


> An weiteren Tipps und Beispielen bin ich natürlich Interessiert.


Das so Allgemein ist schwierig ... da solltest du schon konkret werden. Dann kann man dir auch Beispiele geben ...
Das mit dem Threading hatte ich ja schon erwähnt. Das solltest du aber in einem neutralen Projekt erstmal ausprobieren (so wie andere Dinge vielleicht auch).

Gruß
Larry


----------

