# Visualisierung mittels C#



## Woerneproppen (9 März 2022)

Servus zusammen, 

ich habe ein funktionierendes Programm mit einer WebVisu auf einem 750-8202 am laufen. Allerdings würde ich die Visualisierung jetzt gerne mittels C# realisieren. Bisher habe ich aber nur die Möglichkeit gefunden mittels Modbus auf die Wago zuzugreifen, aber dann eben nur direkt auf die Wago. 
In der Arbeit habe ich diesen Zugriff auf eine Bosch-Rexroth SPS (basiert auch auf Codesys) schon realisiert bekommen, allerdings lief dies über eine eigene DLL von BR. Allerdings war es da möglich direkt auf die Variablen der Symbolkonfiguration zuzugreifen. Genau sowas würde ich auch für die Wago suchen, damit ich das Programm nicht ändern muss, sondern so weiter verwenden kann. 

Habt ihr eine Idee wie es mit möglichst wenig Aufwand umzusetzen wäre? 

mit freundlichen Grüßen
Woerneproppen


----------



## KLM (9 März 2022)

Moin, ich gehe mal davon aus, dass Du einen externen Webserver verwenden und nicht Dein eigene Visu auf dem Controller hosten willst.
In dem Falle gäbe es von CODESYS und WAGO eine völlig veraltete Modbus DLL oder von CODESYS einen schweine-teuren PLChandler. Letzterer greift über das CODESYS Gateway auf Variablen jeder beliebigen CODESYS 2.3 / 3.5 basierten Steuerung (vom Hersteller unabhängig) zu. Alternativ nimmst Du ein Standard-Protokoll, z.B. OPC UA.


----------



## Woerneproppen (14 März 2022)

Nein ich wollte ich eigentlich gar nicht über einen Webserver gehen. Wie ich geschrieben habe, baue ich bzw. habe ich eine Programm auf Basis von C# geschrieben, welches als Visualisierung für mein SPS Programm dienen soll. Das Programm soll dann auf einem Raspberry Pi ausgeführt werden und die Verbindung soll über Ethernet erfolgen. 
Hierzu muss ich auf die Variablen in meinem Programm zugreifen. Wenn ich des bisher richtig gelesen und verstanden habe, kann ich mit Modbus allerdings nur auf die Aus- und Eingänge direkt zugreifen und keine Variablen in der Symbolkonfiguration ansprechen.

Mir ist durchaus bewusst, dass das über die WebVisu wesentlich leichter zu realisieren ist, dies ist ja auch schon geschehen und das Programm läuft ja. 

Die Anbindung von einem Programm an eine SPS ist für mich leider, bis auf des Bosch-Rexroth System, völliges Neuland. Zudem habe ich leider keine Dokumentation dazu gefunden die mir z.B. eine Liste von Befehlen zeigt, mit denen ich mich dann z.B. per OPC UA verbinden und dann einzelne Variablen auslesen könnte. Dazu muss ich sagen, habe ich mit OPC UA auch keine Erfahrungen gemacht bisher. 

Bei Bosch-Rexroth gab es eine DLL mit Beispielen und einer PDF-Datei mithilfe derer man sich durchhangeln konnte (bei weitem nicht perfekt...).


----------



## blimaa (14 März 2022)

Hi
Hat jetzt nicht gerade direkt mit deinem Thema was zu tun, aber du schreibst, dass du die C# Visu auf einem Raspberry laufen lassen wills. Wie kannst du das? Ist ja Linux drauf.(?)

Gruss blimaa


----------



## Matze001 (14 März 2022)

.Net Core und dann z.B. Blazor.

Grüße

Marcel


----------



## Woerneproppen (14 März 2022)

Tatsächlich hatte ich das gelesen, dass es mittlerweile wohl möglich sei die Programme die in C# zu schreiben und auf dem Raspberry Pi lauffähig zu bekommen. Ich wollte das mit folgender Anleitung mal ausprobieren:









						Mit C# und .NET eigene GUI Apps für den Raspberry Pi entwickeln
					

Neben der Erstellung von grafischen Oberflächen über Webserver wie Node.JS oder Python und TKinter haben wir auch die Möglichkeit mittels Visual Studio erstellte GUIs auf dem Raspberry Pi laufen zu lassen. Diese werden über Windows erstellt und anschließend auf dem Raspberry Pi lauffähig...




					tutorials-raspberrypi.de


----------



## Matze001 (14 März 2022)

Nutz bitte nicht Mono und Forms...

nutz Net Core und Blazor...


----------



## Woerneproppen (14 März 2022)

Ich hab mit Net Core und Blazor noch nicht gearbeitet. Was sind denn die Unterschiede bzw. die Nach- und Vorteile. Deine Antworten sind leider sehr kurz und nicht wirklich Hilfreich. 

Ein paar mehr Worte der Erklärung wären hilfreich. Was ist Blazor? Wobei genau hilft mir das?


----------



## Matze001 (14 März 2022)

Net Core ist erstmal für Dich kein großer Unterschied zu Net Framework.
Net Core läuft aber, mit den entsprechenden Runtimes oder wenn es entsprechend compiliert ist nativ auf Linux und MacOs.

Blazor basiert auf Net Core und dient zur webbasierten Programmierung. Dein Raspi wird dann zu einem Webserver, 
den Du dann auch von anderen Geräten aus erreichen kannst. (Aber auch direkt lokal auf deinem Raspi).

Wenn du weiterführende Infos brauchst solltest Du dich über die üblichen Wege informieren.
Es gibt z.B. gute Tutorial-Videos in Youtube.

Zu deinem Problem der Kommunikation per se kann ich Dir leider nur wenig weiterhelfen.
Ich selbst nutze bei einer Wago 750-841 Modbus zur Kommunikation zwischen C# und der SPS,
ich habe aber auch nicht viele Daten die da ausgetauscht werden.

Grüße

Marcel


----------



## Woerneproppen (14 März 2022)

Ok. Muss ich mir mal anschauen. 

Viele Daten muss ich auch nicht austauschen, allerdings hab ich per Modbus nur die Möglichkeit gefunden direkt auf die Ausgänge zuzugreifen und nicht auf Variablen eines Programms. Hast du dafür evtl. eine Lösung für mich? 
Die Read/Write Coil Bausteine hatte ich gefunden, aber wie gesagt, soweit ich des verstanden habe, kann ich damit nur direkt die Aus- und Eingänge der Bausteine ansprechen.


----------



## Matze001 (14 März 2022)

Also bei meiner alten 841 sind die Modbus Coils und Inputs auf Merkerbereiche gemappt, auf die ich dann meine Variablen deklariere.
Ob das bei deiner genau so ist, musst Du dem Handbuch entnehmen.

Grüße

Marcel


----------



## Woerneproppen (14 März 2022)

Ich verwendet die 750-8202, leider werde ich aus er Anleitung nicht schlau... Bei BR hatte ich damals simple befehle wie "readvariablebysymbol(String)" und im String befand sich der name aus der Symbolkonfiguration. 

Bei dem Modbus werd ich nicht so wirklich schlau, wo und wie ich die Variablen dann definieren muss und wie ich auf diese Zugreife... 

Gibt es denn keine Möglichkeit um es ähnlich wie bei BR machen bzw. kann mir jemand erklären wie das aufgebaut ist? Ein Beispielcode ist da meist sehr hilfreich.


----------



## Oberchefe (14 März 2022)

> Nutz bitte nicht Mono und Forms...



Also bei mir läuft Mono und die "Visu" in VB. Konnte da noch keine Probleme feststellen.


----------



## Oberchefe (14 März 2022)

> Bei dem Modbus werd ich nicht so wirklich schlau, wo und wie ich die Variablen dann definieren muss und wie ich auf diese Zugreife...



Definitionsbeispiel:
HMI AT %MW1000:  ARRAY [0..1100] OF WORD;

Zugriff dann mit Read Holding Registers (FC=03)


----------



## Matze001 (14 März 2022)

Oberchefe schrieb:


> Also bei mir läuft Mono und die "Visu" in VB. Konnte da noch keine Probleme feststellen.


Vielleicht hätte ich es nicht zu allgemein formulieren sollen.

Also Korrektur:

Wenn Du etwas neues Anfängst, mach es bitte mit .Net Core bzw. aktueller Software.

Grüße

Marcel


----------



## Woerneproppen (15 März 2022)

Oberchefe schrieb:


> Definitionsbeispiel:
> HMI AT %MW1000:  ARRAY [0..1100] OF WORD;
> 
> Zugriff dann mit Read Holding Registers (FC=03)


Das heißt also, ich muss jegliche Variabel die ich nutzen möchte dem Merkerbereich zuzuweisen, ähnlich wie ich diese einem Ausgang oder Eingang zuordnen kann/muss. Sehe ich das so richtig?


----------



## Matze001 (15 März 2022)

Ja

Es bietet sich hier an, einen Schnittstellenbereich zu definieren, z.B. in einem UDT und diesen dann in den Merkerbereich zu mappen.


----------



## Woerneproppen (15 März 2022)

Schade... das hatte ich mittlerweile befürchtet. Also leider nicht wirklich Anwenderfreundlich gelöst. Gerade für bestehende  Programme. Vielen Dank


----------



## Woerneproppen (21 März 2022)

Ich wollte kurz Rückmeldung geben. 

Ich hatte es zwischenzeitlich versucht mit OPC_UA zu realisieren. Hierfür habe ich aber keine kostenlose Bibliothek für C# gefunden. Somit bin ich wieder zurück auf Modbus gewechselt. Nach langem Suchen habe ich gefunden, dass ich in der Netzwerkübersicht direkt die Variablen für den Modbus freigeben kann und mir dort dann auch die Adressen angezeigt werden. Somit ist eine Zuweisung im Programm gar nicht notwendig. Das Verbinden, abfragen und schreiben der Variablen ist ab da ja dann nur noch eine Kleinigkeit und habe ich mit der DLL von EasyModbus in C# realisiert. 

Danke trotzdem für eure Tipps. Jetzt heißt es nur noch, das ganze auf dem RaspberryPi zum laufen bekommen.


----------



## Woerneproppen (21 März 2022)

Jetzt hab ich doch nochmal eine Frage:

Die Verbindung steht, die Bool Variablen kann ich alle auslesen. Allerdings hab ich jetzt noch ein Problem mit Int Variablen. Sobald ich diese im Modbus-Konfigurator anlege, werden die Werte mit denen ich eigentlich initialisieren möchte anscheinend gelöscht und auf 0 gesetzt. Leider kann ich die Werte über Modbus auch nicht beschreiben. Fehlermeldung bekomme ich keine. 

Beim lesen gehe ich wie folgt vor:

iTimeUnlock[] = client. ReadInputRegisters(32800, 1);                                    // Addresse hab ich aus dem Modbuskonfigurator, siehe Screenshot
iTimeVentilation[] = client.ReadInputRegister(32816, 1);

Für das Schreiben der Variable wollte ich folgende Methode verwenden:

 client.WriteSingleRegister(32800, iTimeUnlock[0]);                                       // Startwerte sind im Array vorher im Programm festgelegt
 client.WriteSingleRegister(32832, iTimeVentilation[0]);

Sieht jemand evtl. schon den Fehler? Bzw. kann mir jemand erklären, warum die Werte in der SPS sofort auf 0 geschrieben werden, anstatt auf ihren Initialwerten zu bleiben?


----------



## Oberchefe (21 März 2022)

Willst du wirklich Eingänge lesen oder doch Merker? Falls letzteres ist "ReadInputRegisters" falsch und auch die 3xxxx Adressen wären dann 4xxxx.


----------



## Woerneproppen (22 März 2022)

Es sind alles Variablen in meinem PLC-Programm die ich setzen möchte bzw. eben auch 2 INT Werte die ich schreiben und lesen möchte. Bei den Bool Variablen verwende ich "client.readcoils(Startaddresse, Anzahl)". Zum Schreiben "client.writSingleCoil(Adresse, Zustand). Das funktioniert auch alles. Zum Schreiben von INT Variablen hatte ich eben WriteSingleRegister gefunden und ReadInputRegister. Oder benötigte ich hier die Methode "ReadDiscreteInputs"? 

Addresse habe ich direkt der Modbuskonfiguration entnommen, dort sind die Variablen als Programmvariablen angelegt und ich kann lediglich sagen ob Eingang, Ausgang oder beides. Dies definiert mir aber ja nur ob ich die Variable beschreiben, lesen oder beides mit ihr machen kann. Bei der Adressierung, kann ich zwischen Coil und Register wechseln.


----------



## Tobsucht (22 März 2022)

Du nutzt die Coiladressen um ein Register zu schreiben.


----------



## Woerneproppen (22 März 2022)

Das bedeutet also, wenn ich ein Int schreiben möchte, muss ich die Registeradresse verwenden? Weil mit dem ReadCoils-Befehl kann ich ja lediglich Bools lesen.


----------



## Woerneproppen (22 März 2022)

Tobsucht schrieb:


> Du nutzt die Coiladressen um ein Register zu schreiben.


Vielen Dank.
Das war des Problem. Jetzt funktioniert es einwandfrei. Vielen Dank.


----------



## niklu (15 Juni 2022)

Woerneproppen schrieb:


> Ich wollte kurz Rückmeldung geben.
> 
> Ich hatte es zwischenzeitlich versucht mit OPC_UA zu realisieren. Hierfür habe ich aber keine kostenlose Bibliothek für C# gefunden. Somit bin ich wieder zurück auf Modbus gewechselt. Nach langem Suchen habe ich gefunden, dass ich in der Netzwerkübersicht direkt die Variablen für den Modbus freigeben kann und mir dort dann auch die Adressen angezeigt werden. Somit ist eine Zuweisung im Programm gar nicht notwendig. Das Verbinden, abfragen und schreiben der Variablen ist ab da ja dann nur noch eine Kleinigkeit und habe ich mit der DLL von EasyModbus in C# realisiert.
> 
> Danke trotzdem für eure Tipps. Jetzt heißt es nur noch, das ganze auf dem RaspberryPi zum laufen bekommen.


Guten Morgen
Ich hatte die Modbuskonfiguration von einer PFC über NodeRed auf ein Raspberry am Laufen sowie einer Siemens Logo
Wie du festgestellt hast sind die Variabeln in der Netzwerkansicht zu definieren.

Für einen OPC UA Client für C# habe ich diesen einmal für eine Siemens S7 1500 probiert was mit dem UA-Explorer (extension für Visual Studio) einfach funktioniert. Wie weit dieser aber nur Net.Core unterstützt habe ich mich zu wenig beschäftigt.
https://github.com/convertersystems/opc-ua-client

Gruss Nik


----------

