# mit Delphi per Modbus/TCP mehrere SPSen auslesen



## jank-automation (29 März 2010)

Hallo.

Ich möchte ein Programm in Delphi schreiben, das es ermöglicht, Daten aus mehreren SPSen per Modbus/TCP zeitgleich auszulesen.

Der Zugriff per MBT.dll der Firma Wago funktioniert leider nur für eine SPS.

Ich möchte aber nach Programmstart mehrere Verbindungen aufbauen und halten. Dann möchte ich z.B. im Sekundentakt Daten mitschreiben.

Ich bin für jeden Rat dankbar.


----------



## jank-automation (29 März 2010)

Ich möchte dazu keinen OPC-Server nutzen.
Man kann mit Delphi als Modbus-Server oder -Client auftreten.
Es muß doch möglich sein mehrere Verbindungen zu halten.


----------



## Question_mark (29 März 2010)

*Das geht ...*

Hallo,



			
				jank-automation schrieb:
			
		

> Ich möchte ein Programm in Delphi schreiben, das es ermöglicht, Daten aus mehreren SPSen per Modbus/TCP zeitgleich auszulesen.



dazu gibt es ab Delphi 2006 (???) die Indy-Komponenten. Mit dem Indy TCPClient/TCPServer kann man das machen. Die Indy Komponenten nehmen einem das Gewurschtel mit dem WinSocket und dem TCP-Protokoll ab. Dann muss man nur noch das Modbus-Protokoll dareinpfriemeln. 

Vor einigen Jahren gab es mal in der Zeitschrift "Toolbox" eine fertige Komponente dafür. Ich kann mich aber nicht mehr erinnern, ob man damit auch mit mehreren SPSen kommunizieren konnte. Aber man kann ja auch notfalls mehrere Instanzen (also für jede Verbindung eine) anlegen.

Gruß

Question_mark


----------



## jank-automation (29 März 2010)

Ich arbeite mit Delphi 2009.
Werde es mir schnellstmöglich ansehen.


----------



## Question_mark (29 März 2010)

*Nur ein paar Tips dazu*

Hallo,



			
				jank-automation schrieb:
			
		

> Ich arbeite mit Delphi 2009.



Ok, damit es schneller geht, hier noch ein paar Hinweise :

Bei der Installation von D2009 wird man gefragt, welche Indy Version installiert werden soll. Zur Auswahl stehen die Version 9 oder 10. Ich habe die neuere Version 10 gewählt. Die Unterschiede zwischen den beiden Versionen sind gravierend, der Hersteller hat das Konzept (nicht immer zum Vorteil) geändert. Daher beziehe ich mich auf die Version Indy 10.

Ich kenne zwar das ModBus Protokoll nicht im Detail, aber das sollte ähnlich wie bei S7 IsoOnTCP funktionieren. Da wird das S7 Protokoll eben wie Nutzdaten in das TCP Protokoll eingebettet. Das Modbus Protokoll ist zwar offen gelegt, aber ich wollte mir heute ersparen das ganze durchzulesen.

Aufgrund meiner oben gemachten Annahme würde ich eine neue Komponente abgeleitet aus TComponent erstellen, nennen wir diese mal TTCPModBus. Dadrin die entsprechenden Properties für IP-Adressen, Portnummer, Timeout etc. definieren. In der Komponente dann aus der Delphi VCL "TidTCPClient" dynamisch erzeugen, sowie einen eigenen Thread nur zum Lesen ebenfalls dynamisch erzeugen.
Mit der Funktion des TidTCPClient.IOHandler "ReadBytes" erhält man alle Nutzdaten des Modbus Protokolls, schon bereinigt von den Transportdaten des TCP-Stacks.

Mit der Funktion des TidTCPClient.IOHandler "WriteDirect" kann man dann im Rahmen des modbus Protokolls Daten schreiben.

Der Vorteil dieser Methode : Man braucht sich nur um das Modbus Protokoll kümmern, die darunterliegenden Schichten erledigt die Indy Komponente.

Als Ergebnis erhält man eine Komponente TTCPModBus für *eine* Verbindung. Wenn mehrere Verbindungen benötigt werden, kann man in der Applikation eben entsprechend viele Komponenten vom Typ TTCPModBus verwenden. Hierdurch ist dann auch automatisch eine klare Zuordnung der Daten zur jeweiligen SPS-Steuerung vorhanden.

Und bitte unbedingt die Datei "IdAntiFreeze.pas" (der Name ist wohl selbsterklärend) in die Uses-Anweisung der Komponente einbinden, sonst gibt es unerklärliche und unerwünschte Überraschungen 

Das ist jetzt aber nur ein Vorschlag, wie ich an die Aufgabe herangehen würde, es gibt auch andere Wege nach Rom .....

Gruß

Question_mark


----------



## LowLevelMahn (30 März 2010)

*wie wärs mit dieser komponente*

sieht ganz gut aus

http://sourceforge.net/projects/delphimodbus/

modbus master/slave per Indy Komponente Version 9/10


----------



## jank-automation (7 Mai 2010)

Danke.

Ich habe versucht es zu installieren.
Bekomme aber eine Fehlermeldung.
Die Datei "ModBusSplash.pas" benötigt die Datei ModBusSplash.res.

Ich stehe mal wieder auf dem Schlauch!


----------



## Question_mark (7 Mai 2010)

*res Datei*

Hallo,



			
				jank-automation schrieb:
			
		

> Die Datei "ModBusSplash.pas" benötigt die Datei ModBusSplash.res.



Die ModBusSplash.res ist eine Delphi Ressourcendatei. Die ist aber, wie ich das so sehe, im Zip File zum Download enthalten. Vielleicht solltest Du mal prüfen, ob die Res-Datei auch im richtigen Verzeichnis liegt ?

Gruß

Question_mark

Edit : Ich hoffe, Du hast beim Installieren der Komponente die Pfade in den Projekteinstellungen der *.dpk Datei angepasst !!!


----------



## Question_mark (7 Mai 2010)

*Es gibt einen Bugfix*

Hallo,

Upps, wann hast du die Komponenten heruntergeladen ? Ich sehe gerade auf Sourceforge, dass seit gestern (06.05.2010) eine neue Version mit Bugfix bereitsteht. Da hat diese res-Datei in den Vorgängerversionen gefehlt. Also einfach nochmal die neue Version herunterladen ...

Gruß

Question_mark


----------



## jank-automation (8 Mai 2010)

Genau! Upps...

Ich suche meinen Rechner ab, und überlege, was er mit der Datei gemacht hat!!!
Und dann liegt Sie ganz unschuldig im Zip-File rum.


----------



## jank-automation (8 Mai 2010)

Ich habe nun alle Dateien.
Dazu gehören zwei Packages für Delphi 2009.

Das Package "dclDelphiModbus2009.bpl" könnte ich durch öffen und installieren recht einfach einbinden.
Das andere Package "DelphiModbus2009.bpl" bringt mir beim Installieren die Fehlermeldung, das es kein Entwurfszeitpackage ist.
Peinlich: Wie binde ich dieses ein?


----------



## Question_mark (8 Mai 2010)

*Unschuldig und unbeachtet im Zip-File*

Hallo,



			
				jank-automation schrieb:
			
		

> Wie binde ich dieses ein?


In Deinem Zip-File liegt eine weitere Datei ganz unschuldig, aber unbeachtet, herum. Sie heisst "readme.txt" und beschreibt die Installation der Packages.

Gruß

Question_mark


----------



## jank-automation (10 Mai 2010)

Leider funktioniert es so nicht.

Das designtime package bekomme ich installiert.
Ich kann in einem neuen Projekt auch die Server- bzw. Client-Komponente anlegen.
Jedoch bleibt TIdModbusServer rot unterlegt und es funktioniert nicht.
Was mache ich falsch?


----------



## Question_mark (10 Mai 2010)

*...*

Hallo,



			
				jank-automation schrieb:
			
		

> Was mache ich falsch?



Driss (auf Deutsch Sche..) auf die roten Kringel, da hat die IDE von Delphi so einige Macken. Versuche doch endlich mal das Programm zu compilieren und stelle die Fehlermeldungen hier im Forum ein. Du bist wohl eher ein Theoretiker, versuch es doch einfach mal mit Pragratismus und starre nicht wie das Kaninchen auf die Schlange, wenn mal etwas nicht wie theoretisch gedacht, nach Deinen Wünschen funktioniert. 

Gruß

Question_mark


----------



## jank-automation (7 Juni 2010)

Habe endlich wieder etwas Zeit für das Thema gefunden.
Auf meinem alten Rechner ging es absolut nicht.
Da kamen jeden Tag andere Fehlermeldungen.
Nun habe ich einen Rechner neu aufgesetzt, jetzt geht es.

Aber da stellen sich neue Fragen.
Warum kann ich nur 125MB aus dem Merkerbereich lesen?
Die Stelle "<=125" habe ich gefunden.
Wenn ich die Zahl hochnehme funktioniert es nicht mehr.

Vielleicht hat jemand eine Lösung.
Habe den Lesebefehl erstmal in eine Schleife gelegt.


----------



## Lars Weiß (7 Juni 2010)

jank-automation schrieb:


> Habe endlich wieder etwas Zeit für das Thema gefunden.
> Auf meinem alten Rechner ging es absolut nicht.
> Da kamen jeden Tag andere Fehlermeldungen.
> Nun habe ich einen Rechner neu aufgesetzt, jetzt geht es.
> ...



Weil das die maximale Anzahl der Register ist die in einem Telegramm übertragen werden können.


----------



## jank-automation (8 Juni 2010)

Das ist leider nicht das was ich hören wollte.
Aber danke für die schnelle Antwort.


----------



## argv_user (8 Juni 2010)

jank-automation schrieb:


> Das ist leider nicht das was ich hören wollte.
> Aber danke für die schnelle Antwort.



Was wolltest Du denn sonst hören?

Ich denke die Antwort von Lars ist doch eindeutig.
Zudem hast Du ja selber schon die richtige Lösung genannt.

Oder habe ich etwas falsch verstanden?


----------



## Lars Weiß (8 Juni 2010)

Jep, des frag ich mich auch grad


----------



## jank-automation (8 Juni 2010)

SORRY!

Ich hatte gehofft, das es eine Möglichkeit gibt, mehr Daten auf einmal zu lesen.

Nochmals DANKE für die Hilfe!


----------



## Lars Weiß (8 Juni 2010)

Nein, die gibt es leider nicht...


----------

