mit Delphi per Modbus/TCP mehrere SPSen auslesen

jank-automation

Level-1
Beiträge
55
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 :ROFLMAO:

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
 
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!
 
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 !!!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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?
 
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?
 
...

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.

Weil das die maximale Anzahl der Register ist die in einem Telegramm übertragen werden können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
Zuletzt bearbeitet:
Zurück
Oben