# Modbus Master für C#



## eYe (17 Oktober 2009)

Nabend,

ich habe vor eine Software in C# zu schreiben mit der ich Daten aus einem Modbus Slvae auslesen möchte. Hierfür bin ich auf der Suche nach einer geeigneten Bibliothek und wollte mal fragen ob schon jemand Erfahrung in dem Bereich gesammelt hat und etwas empfehlen kann.

Open Source ist eher nicht so von interesse, da es sich um eine kommerzielle Anwendung handelt und gerne auch ein entsprechender Support in Anspruch genommen werden soll.


----------



## Hand (17 Oktober 2009)

Das kannst dir in etwa ner halben Stunde selbst schreiben,
Modbus ist keine Black Box.

Specs gibts auf der Modbus Seite.


----------



## eYe (18 Oktober 2009)

Hand schrieb:


> Das kannst dir in etwa ner halben Stunde selbst schreiben,
> Modbus ist keine Black Box.
> 
> Specs gibts auf der Modbus Seite.



Ich bin begeistert, dachte schon das ganze wird teuer. Also ich bestelle dann hiermit bei dir den entsprechenden Sourcecode. Kalkuliert hast du ja eine halbe Stunde, bei einem angenommen Stundensatz von 100€ macht das dann 50€.



Noch jemand der mir einen vernünftigen Vorschlag unterbreiten mag?


----------



## pvbrowser (18 Oktober 2009)

eYe schrieb:


> Open Source ist eher nicht so von interesse, da es sich um eine kommerzielle Anwendung handelt und gerne auch ein entsprechender Support in Anspruch genommen werden soll.



Ich hätte Dich ja auf unseren
http://pvbrowser.org
verwiesen.
Aber, wenn Open Source nicht gewünscht ist :-(


----------



## Gerhard Bäurle (18 Oktober 2009)

eYe schrieb:


> Open Source ist eher nicht so von interesse, da es sich um eine kommerzielle Anwendung handelt und gerne auch ein entsprechender Support in Anspruch genommen werden soll.



Hallo,

open source würde ich nicht von vorne herein ausschließen. Auch in diesem
Umfeld findest Du Leute, welche Dich gegen Bezahlung unterstützen.

Hier eine *Kaufsoftware*.


----------



## Blockmove (18 Oktober 2009)

Gerhard Bäurle schrieb:


> open source würde ich nicht von vorne herein ausschließen. Auch in diesem
> Umfeld findest Du Leute, welche Dich gegen Bezahlung unterstützen.



Tja selbst der große Siemens bedient sich inzwischen recht häufig im Open-Source-Lager. Schaut euch mal die Lizenzhinweise bei WinCC-Flexible an 
Ausserdem sollte / darf man Open-Source nicht mit kostenlos und ohne kommerziellen Support gleichsetzen. Nahezu jeder große IT-Hersteller hat in der Zwischenzeit irgendwelche OS-Software im Angebot. Und die Kosten für die Wartungsverträge sind dabei genauso gesalzen wie bei Closed-Source .

Gruß
  Dieter


----------



## eYe (18 Oktober 2009)

Ich habe grundsätzlich nicht gegen OpenSource Projekte, im Gegenteil ich bin begeistert von Menschen die ihr Wissen kostenlos mit anderen teilen 

Nur denke ich bei Open Source immer an so einen wie mich selbst, der in seinem kleinen Büro sitzt und Abends aus Langweile und Freude am proggen ein Tool entwickelt. Das problem dabei ist dann (denke ich) das die entwickelte Software nicht ausreichend getestet ist. Und ich möchte wirklich etwas haben was funktioniert, da ich keine Zeit habe mich großartig mit dem debugging zu beschäftigen 

(Ja ich kenne SIEMENS Software und weiß das dort auch die Kunden das debugging übernehmen  )

@pvbrowser
Ich kenne deine Seite, aber ehrlich finde ich nichts was mir in Sachen Modbusmaster unter C# weiterhilft. Falls du da was für mich hast würde ich mich über weitere Informationen freuen  (PN)

@Gerhard Bäurle
Die Seite habe ich mir auch schon angeguckt, ist sogar mein Favourite weil es doch einen recht professionellen Eindruck bei mir erweckt.
Hier noch zwei weitere: (Falls noch jemand anders auf der Suche ist)

http://www.modbusdriver.com/shop/product_info.php?cPath=64&products_id=66
http://www.sunlux-india.com/MODBUSProtocolSuite.htm
http://www.adontec.com/index.htm?GO=/pmodbus_d.htm


----------



## pvbrowser (18 Oktober 2009)

eYe schrieb:


> @pvbrowser
> Ich kenne deine Seite, aber ehrlich finde ich nichts was mir in Sachen Modbusmaster unter C# weiterhilft. Falls du da was für mich hast würde ich mich über weitere Informationen freuen  (PN)



Unser Projekt enthält eine Bibliothek, die u.a. Modbus in C++ implementiert.
http://pvbrowser.org/pvbrowser/sf/manual/rllib/html/classrlModbus.html
Die C# Anbindung sollte ja kein Problem sein, wenn Du über die Quellen verfügst.

Die Bibliothek wird zusammen mit pvbrowser durch
http://pvbrowser.de/pvbrowser/tar/install-pvbrowser.exe
installiert.

Du kannst die Bibliothek aber auch in den Quellen separat von
http://pvbrowser.de/pvbrowser/tar/rllib.tar.gz
herunterladen.

Ist es denn sooooo viel verlangt, sich mal auf der Homepage umzusehen ?
z.B. unter Download.
Deshalb bezweifele ich das "Ich kenne deine Seite"


----------



## eYe (18 Oktober 2009)

pvbrowser schrieb:


> Ist es denn sooooo viel verlangt, sich mal auf der Homepage umzusehen ?
> z.B. unter Download.
> Deshalb bezweifele ich das "Ich kenne deine Seite"



Nein ist es natürlich nicht 
Und doch, ich kenne die Seite. (Oder vielleicht besser: Mirt ist die Seite bekannt^^) Das erstemal wo ich drauf war ist schon länger her, da war ich auf der Suche nach einer alternative zu WinCC Flexible...
Aber es sei dir gegönnt mich als Lügner oder vielleicht auch nur faul abzustempeln ^^

Und selbst jetzt wo ich deinen Direktlink kenne, komme ich nicht weiter als bis downloads. Wo finde ich den da den Link zur "rl Modbus Class Reference"?

Schönen Sonntag noch,
eYe
*
*


----------



## pvbrowser (18 Oktober 2009)

eYe schrieb:


> Und selbst jetzt wo ich deinen Direktlink kenne, komme ich nicht weiter als bis downloads. Wo finde ich den da den Link zur "rl Modbus Class Reference"?


An sehr vielen Stellen.

Z.B. wenn Du hier drin
http://pvbrowser.de/pvbrowser/index.php?menu=4&topic=4
auf den "rllib" Link klickst.


----------



## Hand (18 Oktober 2009)

Hallo, hier der Code wie er an unseren Anlagen läuft,
als Beispiel eine UserFunction 65

Implementiert in Python, Modbus over UDP


```
#------------------------------------------------------------------------#
# Function _ModbusF65
#------------------------------------------------------------------------#
    def _ModbusF65(self, transid, protid, unitid,  data):
            # Modbus Header
            mbus = ""
            mbus += chr(transid << 8) + chr(transid & 0xFF) # Transaction ID
            mbus += chr(protid << 8) + chr(protid & 0xFF) # Protocol Identifier
            mbus += chr(len(data)+1 << 8) + chr(len(data)+1 & 0xFF) # Datalength
            mbus += chr(unitid) # Unit Identifier
            mbus += chr(65) # Function Code
            # Send
            self._udp1.sendto(mbus + data, ("192.168.0.106", 20101))
```
Um einen Slave zu lesen musst du die dementsprechenden Function Code mit den passenden Daten senden, und den Response parsen - fertig.

Wenn du mir deinen Slave schickst programmier ich dir das


----------



## eYe (18 Oktober 2009)

Hand schrieb:


> Um einen Slave zu lesen musst du die dementsprechenden Function Code mit den passenden Daten senden, und den Response parsen - fertig.
> 
> Wenn du mir deinen Slave schickst programmier ich dir das



Danke für dein Beispiel 
In meinem Fall handelt es sich allerdings um Modbus RTU und nicht TCP, dementsprechend müssen Dinge wie z.B. CRC beachtet werden.
Aber auf dein Angebot komme ich gerne zurück, wenn ich irgendwo nicht weiterkomme


----------



## pvbrowser (18 Oktober 2009)

Hand schrieb:


> ```
> #------------------------------------------------------------------------#
> # Function _ModbusF65
> #------------------------------------------------------------------------#
> ...


----------



## Oberchefe (18 Oktober 2009)

falls Du selber was schreiben willst, hier gibt's Infos und Demoprogramme zum Testen:
http://www.simplymodbus.ca/


----------



## Hand (18 Oktober 2009)

@PvBrowser:

Auf der anderen Seite horcht natürlich ein in SPS Code selbstgeschriebener UDP Modbus Server, ich weis das Modbus eigentlich nicht für UDP spezifiziert ist. Gibt allerdings einige Implementierungen in UDP.


----------



## doelckenbeck (16 November 2009)

Hallo,
ich stehe vor einem ähnlichen Problem. Ich will eine Modbus- TCP- Kommunikation zwischen einer ELAU- STeuerung (Slave) und einem B&R- Panel (Master) herstellen. Nun existiert für die Steuerung ein ModbusTCP- Baustein, nur für das Panel nicht.
Eine Möglichkeit wäre ein C++ -Programm für den Master zu verwenden, allerdings hab ich noch nichts wirklich brauchbares gefunden.
Ich hoffe mir kann da jemand weiter helfen, Quelltext wäre gut.


----------



## pvbrowser (16 November 2009)

doelckenbeck schrieb:


> Hallo,
> ich stehe vor einem ähnlichen Problem. Ich will eine Modbus- TCP- Kommunikation zwischen einer ELAU- STeuerung (Slave) und einem B&R- Panel (Master) herstellen. Nun existiert für die Steuerung ein ModbusTCP- Baustein, nur für das Panel nicht.
> Eine Möglichkeit wäre ein C++ -Programm für den Master zu verwenden, allerdings hab ich noch nichts wirklich brauchbares gefunden.
> Ich hoffe mir kann da jemand weiter helfen, Quelltext wäre gut.



Hab ich doch schon angegeben:

http://pvbrowser.org/pvbrowser/sf/manual/rllib/html/classrlModbus.html
ist Teil von
http://pvbrowser.org


----------



## doelckenbeck (16 November 2009)

Danke, hab ich wohl übersehen. Wenn ich das richtig verstehe ist das aber doch Modbus ASCII bzw. RTU wegen CRC und LRC.? Müsste ich dann für Modbus TCP noch was rausnehmen oder ergänzen, um mal dumm zu fragen?
Könnte ich die cpp- und die h- Datei einfach in die Software des Panels integrieren, die Kommunikationsvariablen ansprechen und fertig?
DAnke für die schnelle Antwort!


----------



## Grubba (16 November 2009)

Googel mal mit "Wago Modbus".

Wago stellt eine komplette DLL inklusive Doku zu Verfügung.

Vielleicht für Dich ganz brauchbar.


----------



## pvbrowser (16 November 2009)

doelckenbeck schrieb:


> Wenn ich das richtig verstehe ist das aber doch Modbus ASCII bzw. RTU wegen CRC und LRC.? Müsste ich dann für Modbus TCP noch was rausnehmen oder ergänzen, um mal dumm zu fragen?
> Könnte ich die cpp- und die h- Datei einfach in die Software des Panels integrieren, die Kommunikationsvariablen ansprechen und fertig?



Die Klasse kann sowohl über die serielle Schnittstelle kommunizieren, als auch über TCP/IP. Du rufst vorher einfach ein
void   registerSocket (rlSocket *socket)
bzw.
void   registerSerial (rlSerial *serial)
auf.

Du kannst ebenfalls auswählen, ob die Klasse Ascii oder RTU machen soll.

Wenn Du einen C++ Compiler für das Panel hast ist das kein Problem.
Die Klasse funktioniert unter allen Unix-artigen Betriebssystemen, Windows und OpenVMS.

Solltest Du nur einen C Compiler haben, lässt sich das aber auch einfach übertragen.


----------



## doelckenbeck (16 November 2009)

pvbrowser schrieb:


> Die Klasse kann sowohl über die serielle Schnittstelle kommunizieren, als auch über TCP/IP. Du rufst vorher einfach ein
> void   registerSocket (rlSocket *socket)
> bzw.
> void   registerSerial (rlSerial *serial)
> ...



Vielen Dank! Ich werd mich mal versuchen. Wenns Probleme gibt, meld ich mich einfach nochmal.


----------



## doelckenbeck (18 November 2009)

Hallo, ich habe jetzt libmodbus- 2.0.0 benutzt:

http://copyleft.free.fr/wordpress/index.php/libmodbus/

Will das wie gesagt in Automation Studio von B&R zum laufen bringen und dann in ein Bedienpanel übertragen das als Master läuft, der zugehörige Slave ist eine Steuerung von ELAU.
Mein Problem ist jetzt, das bestimmte Bibliotheken bzw. Header- DAteien eingebunden werden sollen und ich nicht weiß, ob ich die gegen die B&R Dateien ersetzen muss, oder die einfach in den Projektordner kopieren kann um sie dann einzusetzen.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <termios.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
#include <fcntl.h>
/* TCP */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include "modbus.h"

Von manchen Dateien weiß ich was sie machen, bei anderen hab ich keine Ahnung, find auch keine Infos, was es schwierig macht sie gegen B&R- Dateien zu ersetzen.

Bsp.: socket.h wäre bei B&R Ethsock


----------



## doelckenbeck (19 November 2009)

pvbrowser schrieb:


> Hab ich doch schon angegeben:
> 
> http://pvbrowser.org/pvbrowser/sf/manual/rllib/html/classrlModbus.html
> ist Teil von
> http://pvbrowser.org


 

Hallo, nochmal eine blöde Frage. Ich hab mir das alles mal angesehen und würde gerne wissen ob ich die ganzen Dateien, Header und cpp, einfach zum Projekt hinzufügen kann und das wars.?
Was könnte es denn für Probleme geben mit einem C- Compiler? Ich verwende Automation Studio von B&R und das verfügt nur über einen solchen.


----------



## pvbrowser (19 November 2009)

doelckenbeck schrieb:


> Hallo, nochmal eine blöde Frage. Ich hab mir das alles mal angesehen und würde gerne wissen ob ich die ganzen Dateien, Header und cpp, einfach zum Projekt hinzufügen kann und das wars.?
> Was könnte es denn für Probleme geben mit einem C- Compiler? Ich verwende Automation Studio von B&R und das verfügt nur über einen solchen.



Du brauchst einen C++ Compiler.
Ein ANSI-C Compiler reicht nicht, weil der Code in C++ ist.

Wenn Du nur ANSI-C hast,
musst Du die Bibliotheken umschreiben.

Also,
aus den Methoden der Klasse einfache Funktionen machen.
Vielleicht genügt es, die Klassen-Variablen global zu machen,
wenn Du Dich auf eine Verbindung beschränken kannst.

Sonst würde ich eine Funktion
newModbus()
machen, darin Speicher mit malloc() holen und die Variablen darin ablegen.

So, wie wir das in der "Steinzeit" gemacht haben


----------



## doelckenbeck (30 November 2009)

Danke, für den Tipp. Werds in nächster Zeit mal ausprobieren.


----------



## pjtec (12 Januar 2010)

Hallo,

Nochmal back to the roots:
Auf CodeProject gibts ein Modbus TCP Sample in C#:
http://www.codeproject.com/KB/IP/Modbus_TCP_class.aspx

Grüße,


----------



## seeba (15 Januar 2010)

Das hier habe ich schon mal als Modbus-OPC Gateway (Modbus Slave <-> OPC Client) benutzt: http://code.google.com/p/nmodbus/


----------

