Verwendung DotNetSiemensPLCToolBoxLibrary von Jochen Kühner

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen,

so wie du schreibst, hast du natürlich recht, in dem Fall kommt man auf eine maximale sinnvolle Lücke von 10 Bytes. Dann passen 17 Antworten in eine PDU.

Bei mir ist der Fall etwas anders gelagert. Hier werden ca. 10.000 Variablen gelesen. Diese sind bunt im Speicher verteilt und haben unterschiedlichste Länge und Abstände. Statistisch gesehen habe ich dann Lücken zwischen 0 und 20 Bytes, welches im Mittel 10 ist. Es muss natürlich schon bei der Anfrage sichergestellt sein, daß die Länge der Antwort nicht überschritten ist. Die Prüfung muss sowieso stattfinden, da auch einzelne Bereiche mit einer Länge von z.B. 100Bytes gelesen werden.

Wenn auf diese Weise zwei nahe beieinander liegende Tags in einen Request gepackt werden, dann kann ich sogar mehr als 17 Tags in eine PDU packen.

Das ganze funktioniert aber nur effektiv, wenn ich die Tags in einer übergeordneten Klasse entsprechend vorsortiere.

Ein Rechenbeispiel:

Normalerweise bekomme ich in eine PDU (240-18)/12=18 Requests. In der Antwort braucht das 18*(4+data) =108 Bytes. Damit ist aber noch massig Reserve für weitere Daten. Wenn ich nun noch ein paar Tags finde, die mit einer Lücke von z.B. 20 Bytes mitgelesen werden können, dann kann ich mit der selben Anzahl Requests noch >=4 weitere Tags mitlesen.


Fazit:
Im worst case, wenn die Lücken immer genau 20Bytes sind, mache ich natürlich Verlust. Im statistischen Mittel habe ich jedoch das Optimum, wenn ich Lücken bis zu 20 Bytes zulasse. Die 20 Bytes sind empirisch ermittelt für meinen Anwendungsfall das Optimum. Ich will nicht behaupten, daß das allgemeingültig ist.
 
P.S.
Der Algorithmus zum verteilen der Tags auf die PDUs muss natürlich so ausgelegt sein, daß nicht alle Requests mit großen Antwortvolumen (und Lücken) in ein PDU gepackt werden. Wenn schon ein großer Brocken in der Antwort liegt, kann man aber immer noch kleine dazupacken!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jo

Also mein Algorythmus sieht im Moment so aus das Ich die Tags nach Addresse sortiere und wenn der Abstand kleiner 6 ist die Tags zusammenfasse! Dies ist auf jeden Fall immer von Vorteil!
Werd mal schauen wie Ich das ganze noch verbessern kann! Kann den jemand sagen was für Optimierungen Aglink abeim lesen alles vornimmt?
 
Also ich würde auch in 3 Schritten optimieren:
1) Nach Adressen sortieren
2) Überlappende Speicherbereiche erkennen (wenn z.B. ein Bit aus einem schon gelesenen Wort gelesen werden soll)
3) Optimales packen der Daten je nach ausgehandelter PDU-Größe, sodass eine minimale Anzahl an Requests gestellt werden muss (Rucksackproblem)

Ich habe mir das Packen irgendwann mal beim Wonderware DA-Server angesehen, welcher auch bei einem Abstand von zwei Variablen > 10 Byte noch zusammenhängend liest. Evtl. ist der Zugriff SPS-intern wirklich schneller wenn ein großer Block gelesen wird. Das bekommt man aber nur durch Versuche heraus (wobei ich das garnicht machen würde, weil man davon ausgehen muss dass sich das je nach CPU-Typ und Firmwareversion wieder ändert).

Am unteren Ende der Anbindungstreiber steht ja der von WinCCflexible. Der packt überhaupt nichts und liest Variablen sogar mehrfach ein. Kein Wunder dass das so lahm ist.
 
Also ich würde auch in 3 Schritten optimieren:
1) Nach Adressen sortieren
2) Überlappende Speicherbereiche erkennen (wenn z.B. ein Bit aus einem schon gelesenen Wort gelesen werden soll)
3) Optimales packen der Daten je nach ausgehandelter PDU-Größe, sodass eine minimale Anzahl an Requests gestellt werden muss (Rucksackproblem)

Ich habe mir das Packen irgendwann mal beim Wonderware DA-Server angesehen, welcher auch bei einem Abstand von zwei Variablen > 10 Byte noch zusammenhängend liest. Evtl. ist der Zugriff SPS-intern wirklich schneller wenn ein großer Block gelesen wird. Das bekommt man aber nur durch Versuche heraus (wobei ich das garnicht machen würde, weil man davon ausgehen muss dass sich das je nach CPU-Typ und Firmwareversion wieder ändert).

Am unteren Ende der Anbindungstreiber steht ja der von WinCCflexible. Der packt überhaupt nichts und liest Variablen sogar mehrfach ein. Kein Wunder dass das so lahm ist.

1 und 2 sind schon drinn!

Und 3 ja auch aber nur mit 6 Bytes! Kann's ja mal auf 10 erweitern und sehn was besser ist!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und 3 ja auch aber nur mit 6 Bytes! Kann's ja mal auf 10 erweitern und sehn was besser ist!
Was meinst du mit 6 Bytes?

Ich meinte folgendes (nicht mit realen Daten).
Ausgehandelte PDU sei 100 Bytes (brutto=netto der Einfachheit halber):
- Bereich a hat 90 Bytes
- Bereich b hat 30 Bytes
- Bereich c hat 70 Bytes
- Bereich d hat 10 Bytes

Hier wäre es eben sinnvoll
Request 1: a, d
Request 2: b, c
in ein Telegramm zu packen.

Einfach der Reihenfolge nach dem Sortierungsschritt würde sich evtl.
Request 1: a
Request 2: b, c
Request 3: d
ergeben.
 
Was meinst du mit 6 Bytes?

Ich meinte folgendes (nicht mit realen Daten).
Ausgehandelte PDU sei 100 Bytes (brutto=netto der Einfachheit halber):
- Bereich a hat 90 Bytes
- Bereich b hat 30 Bytes
- Bereich c hat 70 Bytes
- Bereich d hat 10 Bytes

Hier wäre es eben sinnvoll
Request 1: a, d
Request 2: b, c
in ein Telegramm zu packen.

Einfach der Reihenfolge nach dem Sortierungsschritt würde sich evtl.
Request 1: a
Request 2: b, c
Request 3: d
ergeben.

Nein Ich hab nur beim lesen drinn, das wenn 2 Tags max 6 Bytes auseinander liegen, diese auf ein Tag gepackt werden.
An so eine Analyse wie du beschreibst hab Ich auch schon gedacht, hab's aber im Moment verworfen, da mir noch kein einfacher algorytmus dazu eingefallen ist! Aber kann ja noch kommen!

Und flexible packt nichts?
 
Datenbankprotokoller

Hallo,

ich hänge mich mal an diesen Thread dran, da ich keinen zum Datenbankprotokoller finde. Ggf. bitte zu passenden Thread verschieben...

Ich versuche per Datenbankprotokoller eine Verbindung per Iso on TCP auf eine s7-1200 zu realisieren und die Daten in eine Datenbank abzulegen.
Leider kommt immer der Fehler " Der Index war außerhalb des Arraybereichs"

Informationen über das Aufrufen von JIT-Debuggen
anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

************** Ausnahmetext **************
System.IndexOutOfRangeException: Der Index war außerhalb des Arraybereichs.
bei ProtkollerDatenbank.CreateDatabase(ProtokollDaten myProtokollDaten) in E:\Daten\Step7-Projekte\StandartAM\Addons\DotNetDatenbankProtokoller\ProtkollerDatenbank.cs:Zeile 422.
bei ProtkollerDatenbank.OnStart(String[] args) in E:\Daten\Step7-Projekte\StandartAM\Addons\DotNetDatenbankProtokoller\ProtkollerDatenbank.cs:Zeile 116.
bei ProtkollerDatenbank.testStart() in E:\Daten\Step7-Projekte\StandartAM\Addons\DotNetDatenbankProtokoller\ProtkollerDatenbank.cs:Zeile 82.
bei ProtokollerDatenbankNS.appSettings.button7_Click(Object sender, EventArgs e) in E:\Daten\Step7-Projekte\StandartAM\Addons\DotNetDatenbankProtokoller\appSettings.cs:Zeile 58.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Leider fehlt mir VS 2003 und daher kann ich das Projekt nicht öffnen, um zu debuggen. Habe nur 2010 Express.

Wollte das ganze in ne Postgres DB schreiben. Dachte es könnte daran liegen, aber auch bei Ablage in einen Textfile taucht immer wieder dieser Fehler auf.

Gibt es eine Möglichkeit das Projekt auf 2010 zu konvertieren?

Was kann ich an den Einstellungen noch tun.

Habe meine aktuellen Einstellungen angehängt.

Vielen Dank.

Gruß Maccap
 

Anhänge

  • settings.JPG
    settings.JPG
    126 KB · Aufrufe: 16
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hänge mich mal an diesen Thread dran, da ich keinen zum Datenbankprotokoller finde. Ggf. bitte zu passenden Thread verschieben...

Da es in diesen Thread wirklich nicht passt, hilft auch das anlegen eines neuen!

Ob 1200er Cpu funktioniert, kann Ich nicht sagen, Ich hab keine!

Stell mal deine komplette Config hier rein, Ich schau mir sie dann am Montag an (die config findest du im programm verzeichnis!)
 
Ich habe mal in die Datei ringeguckt. Ich glaube hier liegt auch das Problem.
Wenn Du meinen Screenshot mit den Einstellungen und die Datei vergleichst, stehen dort total verschiedene Sachen drin. Ich frage mich nur wo die Settings dann abespeichert werden. Wenn ich nämlich das Programm neu starte und auf Settings gehe stehen auch meine Sachen wieder drin, obwohl an der ..protokoller.exe.config nichts geändert wird.

Habe alles in ne txt gepackt, da die config-endung als Anhang nicht zugelassen ist.

Gruß Maccap
 

Anhänge

  • config.txt
    10,7 KB · Aufrufe: 13
Zuviel Werbung?
-> Hier kostenlos registrieren
Oh sorry.

Habe jetzt das Projekt in C:\Protokoller entpackt, hatte es vorher auf dem Desktop liegen. Jetzt kommt der Fehler "Das Ereignisprotokoll ist voll"

Anbei meine Configdatei

Die Kommunikation zur S7-1200 funktioniert bei mir über Rack 0 Slot 1 und Iso over TCP auf Port 102.

Gruß Maccap
 

Anhänge

  • config.txt
    2,7 KB · Aufrufe: 26
Dann...

Dann leer mal das erignisprotokoll (Systemsteuerung/Verwaltung), schalten in meinem programm detailed logging ein (in den settings), drücke auf test, warte kurz, dann auf stop test, und schick mir einen auszug om ereignisprotokoll!

Die Config sieht gut aus, vorrausgesetzt du hast im db4 am anfang ein chararray mit 255 zeichen.

Das port=5433 in dem db connection string, hast du das reingeschrieben? Den werte ich bei postgres nämlich nicht aus, d.h. wenn du nicht den standart port hast gehts deswegen schonmal nicht (das kann ich aber einstellbar machen!)
 
Jetzt kommen wir der Sache näher.
Hier mein Fehler:
CLMP CSHARP-LibNoDave-MySQL-Protokoller: Fehler beim erzeugen des Physical Interface, d.h. falsche IP, falscher COM Port, fehlende S7 Treiber! . PLCCOnnectionID:0

Scheint an der S7-verbindung zu liegen.

Habe aber mit folgendem Einstellungen schon per libnodave erfolgreich auf die 1200er zugreifen können:

fds.rfd = libnodave.openSocket(102, 192.168.0.30)
fds.wfd = fds.rfd
di = New libnodave.daveInterface(fds, "Mein Interface", 2, _
libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)
di.setTimeout(1000000)
res = di.initAdapter

If res = 0 Then
dc = New libnodave.daveConnection(di, 2, 0, 1)
res = dc.connectPLC()
End If


Gruß maccap
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt kommen wir der Sache näher.
Hier mein Fehler:
CLMP CSHARP-LibNoDave-MySQL-Protokoller: Fehler beim erzeugen des Physical Interface, d.h. falsche IP, falscher COM Port, fehlende S7 Treiber! . PLCCOnnectionID:0

Scheint an der S7-verbindung zu liegen.

Habe aber mit folgendem Einstellungen schon per libnodave erfolgreich auf die 1200er zugreifen können:

fds.rfd = libnodave.openSocket(102, 192.168.0.30)
fds.wfd = fds.rfd
di = New libnodave.daveInterface(fds, "Mein Interface", 2, _
libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)
di.setTimeout(1000000)
res = di.initAdapter

If res = 0 Then
dc = New libnodave.daveConnection(di, 2, 0, 1)
res = dc.connectPLC()
End If


Gruß maccap

Welche Libnodave hast du denn da verwendet? Die orginale oder meine angepasste?

Versuch mal die libnodave welche beim protokoller dabei ist durch die mit der es funktioniert hat zu ersetzten (ist glaub noch ne alte version)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank erstmal an dieser Stelle für deine Hilfe...

So, habe jetzt das Projekt irgendwie in meine vs express 10 Version bekommen.
Habe den Daveconn angepasst und siehe da, mein Fehlerspeicher bleibt leer.

Nun möchte ich den Browser benutzen, um auf die DB zuzugreifen. Dann bekomme ich folgenden Fehler:

Die Assembly im gemischten Modus wurde während Version v2.0.50727 der Laufzeit erstellt und kann nicht während der 4.0-Laufzeit ohne zusätzliche Konfigurationsinformationen geladen werden.

System.IO.FileLoadException

Weißt Du, Wie ich die 4.00er Version in das Projekt bekomme?

gruß maccap
 
Vielen Dank erstmal an dieser Stelle für deine Hilfe...

So, habe jetzt das Projekt irgendwie in meine vs express 10 Version bekommen.
Habe den Daveconn angepasst und siehe da, mein Fehlerspeicher bleibt leer.
Häää?????

Nun möchte ich den Browser benutzen, um auf die DB zuzugreifen. Dann bekomme ich folgenden Fehler:
Welchen Browser? Der bei mir Integrierte um die Daten anzuschauen? Den hab Ich bis jetzt nur mit SQLLite benutzt, bei den anderen Verbindungen geht der wahrscheinlich nicht!
 
Hier meine gänderten Zeilen:

myDaveInterface = new libnodave.daveInterface(myPH, "ProtokollInterface", 2, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);

myDaveConnection = new libnodave.daveConnection(myDaveInterface, 2, 0 , 1);

Ich habe keine Fehler mehr in der Ereinisanzeige, wenn ich den test button drücke.
Leider werden immer noch keine Daten geschrieben.

Zu deinem Datenbrowser:
Der funktioniert einwandfrei mit postgres. Wenn ich deine debugversion starte kann ich die DB öffnen und sehe die tabelle mit den angelegeten spalten.
 
Zurück
Oben