# C# Kommunikation mit S7-1200



## Matze001 (30 Mai 2016)

Hallo Zusammen,

ich spiele seit einiger Zeit ein wenig mit C# und hab auch schon vor einiger Zeit hier mit AG-Link eine Frage gestellt.
Nun zeigt sich auf, dass es Sinn macht das ein oder andere in C# umzusetzen. Dazu ist es unumgänglich, zwischen
den C#-Programm und einer S7-1200 auszutauschen.

Im ersten Schritt benötige ich "nur" den Austausch von 16 Bool, 16 Int, 16 Dint und 16 Real werten.
Aber wie es immer so ist sollte man lieber größer denken als man plant. Im ersten Moment bleibt das hier
eine "private" Spielerei um meinen Horizont etwas zu erweitern, ich könnte mir aber auf lange Sicht vorstellen
bestimmte Funktionen die zur Zeit über WinCCflex abgebildet werden mit einem PC-Basierten C# Programm
umzusetzen. Das ganze ist zwar Zukunftsmusik, aber wer weiß... man kann alles mal brauchen 

Dann legen wir doch mal los...

Dazu gibt es meiner Meinung nach 3 Möglichkeiten, mit ihren Vor- und Nachteilen.

1. AG-Link

Pro: 

Super Funktion
Schnell und Performant
Gut integrierbar
Ich habe bereits Berührungspunkte mit AG-Link
Guter Support
Support auch im Forum

Contra:

Preis (500€ pro Einzelplatz oder mehrere Tausend für eine Entwicklerlizenz)

2. Libnodave

Pro:

Gleiche Funktionalität wie AG-Link (Mit Einschränkungen)
Kostenfrei
Support im Forum

Contra:

Ich habe noch keine Erfahrung damit (Was sich aber ändern kann)
Es ist in der Freizeit von jemandem entstanden und ohne "echten" Support, 
wenn etwas nicht funktioniert geht mein Wissen nicht weit genug zu suchen.


3. Was selbstgebautes

Native TCP-IP Kommunikation mit einem selbstgestrickten Protokoll mit T_SEND/T_RECV.

Pro:

Ich hab es selbst in der Hand
Ich kann alles beeinflussen was hier passiert
Ich kann das Protokoll so gestalten wie ich es brauche
Kostet nichts außer Zeit, einige Liter Cola und einige Millionen Gehirnzellen

Contra:

Sehr viel Dreckschaufeln in den Basics der TCP-IP Kommunikation (Ich mach mich aber gern dreckig)

Wie würdet ihr das Thema angehen?

Grüße

Marcel


----------



## andy_l (1 Juni 2016)

Erst mal grundsätzlich:

es gibt natürlich noch ein paar andere interessante Komponenten, die sich für die Verwendung mit C# anbieten, z.B. auch diese hier: http://snap7.sourceforge.net

Mit der habe ich selbst auch schon herumgespielt, ist ziemlich gut.

Wenn ich irgendwo etwas kommerziell einsetze, und dann noch beim Kunden, dann verwende ich lieber etwas gekauftes, auch wenn es ein bisschen was kostet. Rechnet sich unter'm Strich trotzdem. Aber für das selbst herumbasteln ist so was wie snap7 super.

Da auch schon AG-Link angesprochen wurde, ich verwende die PLCCom Komponente von Indi.Systems (http://www.plccom.de), die ist mit 599 Euro pro Entwicklerlizenz auch noch erträglich.


----------



## Jochen Kühner (1 Juni 2016)

Gibt auch noch meine: https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary (nutzt einen libnodave fork)


----------



## Matze001 (1 Juni 2016)

Hallo Jochen,

das habe ich auch schon gesehen. Aber ich muss gestehen:
Ich bin in Sachen C# ein Anfänger, und bei den ganzen Ordnern bei Github fehlt mir irgendwie... der Anfang.
Vermutlich würde ich mich sehr einfach tun mit einem kleinen Beispiel wie man mit C# ein paar DB Werte liest und schreibt,
Deshalb gucke ich mir wohl heute Abend mal das hier an: https://github.com/dotnetprojects/D...Library/tree/master/SimpleCSharpDemonstartion

Grüße

Marcel


----------



## Jochen Kühner (1 Juni 2016)

Gibt auch ein Nuget Package. Dann kannst du die Bibliothek leichter einbinden!


----------



## Matze001 (1 Juni 2016)

Dann bin ich ja mal gespannt... Mal gucken ob der Sprung von Hello World dort hin klappt, oder ob ich vielleicht noch ein paar Zwischenschritte brauche 

Grüße

Marcel


----------



## rostiger Nagel (1 Juni 2016)

Wie währe es den wenn ihr so eine Art Einsteiger Kurs macht.


----------



## andy_l (2 Juni 2016)

Ich hatte etwas überlesen, dass der Thread-Starter ja in erster Linie "private" Spielereien im Sinn hatte. Für diesen Zweck gibt es von der PLCCom Komponente auch eine "Free Version", die eine 720-Tage-Lizenz beinhaltet. So lange die nicht kommerziell eingesetzt wird, kann man durchaus auch mal mit dieser herumspielen.


----------



## Matze001 (2 Juni 2016)

Hallo Rostiger,

wie genau ist der Satz zu verstehen?

Interpretation1:

Matze001 geh doch mal zu ner C# Schulung

Interpretation2:

Jochen schreib doch mal ein How-To hier im Forum wie man die Toolbox benutzt (Am Besten ELI5 -> Explain like I am Five -> Erklärs mir als wäre ich 5 ... Projekt anlegen, DLL einbinden, Aufrufe... )



Ich wäre beidem nicht abgeneigt  Sollte ich in den Genuß kommen das Thema allein zu begreifen (dafür bräuchte ich erstmal Zeit), dann würde ich sowas auch erstellen wollen.
Bei Jochen wird es aber sicher professioneller und einfacher für jemanden der wenig Ahnung hat... hoffe ich 

Grüße

Marcel


----------



## gravieren (2 Juni 2016)

Hi


Interpretation*3*:

Matze001 versucht sich damit.
- Er hat Erfolg.
- Er schreibt aufgrund der Erfahrungen über Probleme/Erfolge ein How-To


----------



## Matze001 (2 Juni 2016)

Matze001 schrieb:


> Ich wäre beidem nicht abgeneigt  Sollte ich in den Genuß kommen das Thema allein zu begreifen (dafür bräuchte ich erstmal Zeit), dann würde ich sowas auch erstellen wollen.
> Bei Jochen wird es aber sicher professioneller und einfacher für jemanden der wenig Ahnung hat... hoffe ich



Deine Interpretation 3 ist das was ich im Nebensatz zu Interpretation 2 sagen wollt...

Grüße

Marcel


----------



## Jochen Kühner (2 Juni 2016)

Hier ein minimales Beispiel wenn du das Nuget package nutzt.


```
[FONT=Consolas]var config = new PLCConnectionConfiguration()[/FONT]
[FONT=Consolas]            {[/FONT]
[FONT=Consolas]                CpuIP = "192.168.1.11",[/FONT]
[FONT=Consolas]                PLCConnectionType = 50[/FONT]
[FONT=Consolas]            };[/FONT]
[FONT=Consolas]
[/FONT]
[FONT=Consolas]            var conn = new PLCConnection(config);[/FONT]
[FONT=Consolas]            conn.Connect();[/FONT]
[FONT=Consolas]            var tag=new PLCTag("MW30");[/FONT]
[FONT=Consolas]            conn.ReadValue(tag);[/FONT]
[FONT=Consolas]
[/FONT]
[FONT=Consolas]            Console.WriteLine(tag);[/FONT]
[FONT=Consolas]            tag.Controlvalue = 44;[/FONT]
[FONT=Consolas]            conn.WriteValue(tag);[/FONT]
```

P.S. Ich sollte vlt mal die Klasse PLCConnectionConfiguration überarbeiten. Da ist nichts Typsicher... Stammt noch aus der Anfangszeit meiner C# Tage. Dann muß Ich mal eine V3 meiner Bibliothek anlegen. (Wenn Ich mal Zeit habe)


----------



## rostiger Nagel (2 Juni 2016)

Hallo Marcel ich meine Fall 3, mit Jochens Hilfe. 



Matze001 schrieb:


> Hallo Rostiger,
> 
> wie genau ist der Satz zu verstehen?
> 
> ...





gravieren schrieb:


> Hi
> 
> 
> Interpretation*3*:
> ...


----------



## Matze001 (2 Juni 2016)

Das sieht ja so einfach aus, das bekomme sogar ich hin 

Ich werde mich da auf jeden Fall mal mit Beschäftigen und wenn es klappt gern ein How-To dazu schreiben.
@Jürgen: Wenn ich jetzt z.B. DB100.DBB10 lesen will schreibe ich


```
[FONT=Consolas]var tag=new PLCTag("DB100.DBB10");[/FONT]
```

oder aus dem anderen Beispiel das hier nutzen:


```
private PLCTag myValue = new PLCTag()
                                             {
                                                 ByteAddress = 0,
                                                 BitAddress = 0,
                                                 TagDataType = DotNetSiemensPLCToolBoxLibrary.DataTypes.TagDataType.String,
                                                 ArraySize = 10
                                             };
```

Grüße 

Marcel


----------



## gravieren (2 Juni 2016)

Hi

Hätte auch Interesse zum Thema c#  
Habe bereits den Quellcode heuntergeladen.

Wo ist ein/das Beispiel für c#   ?

TestVB  --> Virtual Basic    ?
TestWpfC   --> C++           ?
TestLibrary   --> C#  ?


Welche VS-Version sollte man sich besorgen  ?

Gruß Karl





Jochen Kühner schrieb:


> Hier ein minimales Beispiel wenn du das Nuget package nutzt.
> 
> 
> ```
> ...


----------



## pvbrowser (4 Juni 2016)

Wenn es ein Spielprojekt mit Perspektive auf Höheres sein soll,
würde ich es mal mit HTTP Protokoll probieren.

Hier ein passendes "Hello World" in C#
https://www.codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server.aspx


----------



## Matze001 (16 Juli 2016)

Hallo Leute, Hallo Jochen,

ich hatte heut ein wenig Zeit um mal an den Thema weiter zu machen, und wollte mich an der Toolbox und dem NuGet probieren.
Leider bin ich zu doof :-D

Ich erkläre mal wie ich vorgegangen bin:

1. Einfach mal alles von Github laden
2. Entpacken
3. VS starten, Projekt anlegen, Extras, NuGet-Manager Einstellungen -> Neuen Pfad auf den Ordner NuGet
4. NuGet Packetverwaltung starten, auswahl des neuen Pfads
5. Keine Treffer gefunden
Abbruch... Suchen in der Readme: Befehl in NuGet Konsole eingeben.. ok -> Nicht gefunden... toll?!

Also was muss ich hier tun?

Wenn das tut, wäre dann der Beispielcode von Jochen lauffähig?


```
[FONT=Consolas]var config = new PLCConnectionConfiguration()[/FONT]
[FONT=Consolas]            {[/FONT]
[FONT=Consolas]                CpuIP = "192.168.1.11",[/FONT]
[FONT=Consolas]                PLCConnectionType = 50[/FONT]
[FONT=Consolas]            };[/FONT]
[FONT=Consolas]
[/FONT]
[FONT=Consolas]            var conn = new PLCConnection(config);[/FONT]
[FONT=Consolas]            conn.Connect();[/FONT]
[FONT=Consolas]            var tag=new PLCTag("MW30");[/FONT]
[FONT=Consolas]            conn.ReadValue(tag);[/FONT]
[FONT=Consolas]
[/FONT]
[FONT=Consolas]            Console.WriteLine(tag);[/FONT]
[FONT=Consolas]            tag.Controlvalue = 44;[/FONT]
[FONT=Consolas]            conn.WriteValue(tag);[/FONT]
```

Fragen zu dem Code:

1. PLCConnectionType = 50 -> Ethernet?
2. Merkerwörter sind doch doof... Was muss ich tun für Bits, Bytes, INT, DINT, REAL, STRING in DBs?
PLCTag("DB100.DBX0.0") wäre mein Ansatz für ein Bit
PLCTag("DB100.DBB0") wäre mein Ansatz für ein Byte
PLCTag("DB100.DBW0") wäre mein Ansatz für ein INT
PLCTag("DB100.DBD0") wäre mein Ansatz für ein DINT (+ Wandlung?)
PLCTag("DB100.DBD0") wäre mein Ansatz für ein REAL (+ Wandlung?)
Beim String vermute ich mal ich muss eine Anzahl Bytes lesen und dann wandeln...

Grüße

Marcel


----------



## Matze001 (8 August 2016)

So da es hier die letzten Tage nicht weiter ging will ich mal ein update präsentieren.
Ich hatte am Wochenende Sturmfrei, und habe mich mit libnodave beschäftigt. 

Das Ergebnis: Kaum macht man es richtig, funktioniert es auch schon.
Habe mir eine kleine HMI gestrickt, die recht performant (ca. 5ms für 128Bit, 64 Int und 64 DINT) und zuverlässig Daten schaufelt.
Ich habe noch einen kleinen Fehler beim ersten Verbindungsaufbau, der ist mal direkt da, mal dauert es die Timeout-Zeit, aber das 
ist immernoch schneller als das WinnCCflex es jemals schaffen würde.

Wenn also interesse besteht wie ich das bei mir gelöst habe kann ich gern ein kleines TUT dazu schreiben,
und einen Beispielcode liefern. 

Grüße

Marcel


----------



## rostiger Nagel (8 August 2016)

schreib mal ...


----------



## gravieren (8 August 2016)

+1  

Warte auf Ergebnis


----------

