jfk Libnodave wrapper Zeit für 200 REAL's

voni_1

Level-2
Beiträge
68
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Meine C# Kenntnisse entwickeln sich und ich beschäftige mich wieder mit deinem genialen wrapper!

Eins vorweg - ich habe deinen Protokoller bereis in Augenschein genommen, und möchte nun zum Üben etwas ähnliches machen...

Habe in einer mysql einen Table "CPU-Verbindungen" angelegt in dem ich die auszulesenden Steuerungen eingebe.
Ein weiterer Table "tags" beinhaltet die auszulesenden Tags samt den AKTUALWERTEN bzw. Steuerwerten und einem Steuerauftragsbit.
dies bedeutet, dass ich von C#

1. die Verbindungen einlese
2. die Tags in eine Liste einlese
3. mir die aktuellen Werte für die Listeneinträge aus der Steuerung hole
4. die Liste wieder mit den Aktualwerten in die mysql rückspiele
5. auf Steueraufträge prüfe und ggf. abarbeite
6. wieder bei 3. weitermachen....


Das ganze läuft schon ganz brav und ich bin ganz happy...

Aufgefallen ist mir aber die Zykluszeit.
Ich habe in einer Steuerung (315 2PN/DP) 200 REAL Werte angelegt und lese diese aus.
Ich benötige 3000ms dafür... (nur fürs lesen ohne SQL...)

Ist dies plausibel oder muss ich eine Unsauberkeit in meinem Code suchen?

Anmerkung: die Werte werden alle "einzeln" gelesen - da es auch später so sein wird, dass die Werte verstreut in der Steuerung liegen werden.

Danke für die Hilfe!
 
Wenn die Werte einzeln gelesen werden, dann kommt das mit den 3 Sekunden hin. Schneller wird's so nicht. Aber es gibt die Möglichkeit aus verschiedenen Datenbausteinen, Merkern, Zeiten, ... gleichzeitig zu lesen. Schau dir dazu davePrepareReadRequest, daveAddVarToReadRequest, daveExecReadRequest an. Weiß aber nicht wie das im C# Wrapper hinterlegt ist.

Edit: Dabei musst du mit libnodave aber aufpassen, dass eine Abfrage nicht über die PDU-Size kommt (z.B. 56 Real-Werte bei CPU315 mit PDU-Size von 240).
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habs nun zum Testen umgebaut..... lese nun eine Liste der tags einer Verbindung mit ReadValues aus.
-> Das geht ab wie Schmidts Katze :p (200 Reals in 200ms)

Hatte aber keine Probleme (PDU-Size) Oder hab ich sie nur noch nicht bemerkt?
Mag das an dem Wrapper liegen?
 
Hab's mir nicht angesehen, kann aber gerne sein und ist natürlich auch wünschenswert, dass dies der Wrapper regelt.
 
Habs nun zum Testen umgebaut..... lese nun eine Liste der tags einer Verbindung mit ReadValues aus.
-> Das geht ab wie Schmidts Katze :p (200 Reals in 200ms)

Hatte aber keine Probleme (PDU-Size) Oder hab ich sie nur noch nicht bemerkt?
Mag das an dem Wrapper liegen?


PDU Size beachtet meine Bibliothek genau so wie das optimieren von Lesevorgängen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, ich hab jetzt alles so umgebaut, dass ich pro CPU-Verbindung immer eine Liste mit den betreffenden Tags habe.
Diese Liste lese ich mit ReadValues() aus...

Fazit:

2 CPU's :
1 Cpu mit 200 REAL
1 Cpu mit einem 150 Zeichen String

IN 200 MILLISEKUNDEN !!!

Ich freue mich und hüpfe!

Ein fettes MERCI an Libnodave und Jochens Bibliothek!
 
...

Ein weiterer Table "tags" beinhaltet die auszulesenden Tags samt den AKTUALWERTEN bzw. Steuerwerten und einem Steuerauftragsbit.
dies bedeutet, dass ich von C#

1. die Verbindungen einlese
2. die Tags in eine Liste einlese
3. mir die aktuellen Werte für die Listeneinträge aus der Steuerung hole
4. die Liste wieder mit den Aktualwerten in die mysql rückspiele
5. auf Steueraufträge prüfe und ggf. abarbeite
6. wieder bei 3. weitermachen....

...

Hallo voni, - Stop! Zuerst ein Hallo an die Community, bin der Neue -

ich arbeite derzeit an einem ähnlichen Projekt - Daten mittels Windows Service aus SPS lesen und in SQL schreiben und mit Android von SQL wieder lesen.
Aktuell bewältige ich etwaige "Steueraufträge" direkt von Android via libNoDave zur SPS. Zum Beispiel einen Motor starten, dessen DBx.DBXx Adresse in der SQL DB liegen.
Meinst du denn mit Steuerauftrag solche Punkte? Der Gedanke, diese Aufträge über die Datenbank, und somit über den lokalen Windows Service laufen zu lassen ist mir SO noch nicht gekommen.
1. Ist dieser Weg denn "besser"/"richtiger"?
2. Wie realisierst du das technisch? ( Android schreibe zu SQL Motor:Bit_Steuern = TRUE; C# lese von SQL Motor:Bit_Steuern, if TRUE schreibe zu SPS? irgendwie so ähnlich... )

Das würde mich sehr interessieren, weil dadurch würde ich das Mobile Endgerät komplett von der SPS koppeln können!

Grüße Flo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Über "besser" oder "richtiger" möchte ich nicht urteilen.

Mein Ziel ist ein MES System aufzubauen und dazu war mein erstes Ziel, dass nicht alle Clients schreib/lesezugriff direkt auf die SPS haben (Verbindungen usw.)
Ich möchte (und habe schon :-) ) einen Dienst die Daten aus den Steuerungen abholt und anderen Applikationen zu Verfügung stellt.
Soweit sogut. Auch das möchte ich auf 2 Varianten gestalten.
Die erste ist der Datenaustausch über SQL.
Hier habe ich wie besagt eine Tagtabelle in der SQL (siehe Anhang) eine Value Spalte mit dem aktuellen Wert, eine setValue Spalte mit dem gewünschten Steuerwert und ein bit "fire" welches den Steuerauftrag anstößt.
Und somit kann lustig in die SQL reingeschrieben werden und der Dienst führt diese Steueraufträge aus :-)
Hab noch zur Sicherheit 2 "bits" readenable und writeenable in der SQL eingefügt, welche sicherstellen, dass nicht aus Datenpunkten gelesen/geschrieben wird, wo das nicht erwünscht ist....

Anhang anzeigen 23369


Die zweite Variante wäre der Datenaustausch direkt über Server/Client Kommunikation aus der .NET Applikation über die Tagliste in dieser.
 
Heist, du "hörst" auf Änderungen in der Tabelle Tag und steuerst dann den Auftrag. Anschließend löschst du den Eintrag (oder speicherst ihn für Zeit x zur Protokollierung).
Mit was programmierst du denn deinen Dienst?
Ich bin eigentlich in der S7 Welt angesiedelt. Bin geübt in Java und Android. Und versuche mich nun speziell für mein BDE Projekt an C# (zur Programmierung des Windows Dienstes) -> Wissensstand 1 von 100 :)
Hoffe ich kann dich mal was Fragen, falls ich an einer Stelle hänge ;)

Grüße Flo

PS: deinen Anhang kann ich leider nicht öffnen (Ungültige Angabe: Anhang)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, es ist so, dass ich in setValue einen Wert in die SQL schreibe.
Der Dienst schaut auf den ganzen Datensatz und wenn "fire" auf 1 geht, wird der Inhalt von setValue in die Steuerung geschrieben.
Und natürlich wieder in die sql rückaktualisiert, sowie "fire" auf 0 gesetzt....

Hab das Ganze in C# gemacht - ja, und das mit dem Wissenstand kann ich gut nachfühlen. Auch ich habe bis vor 3 Monaten nix bis garnix mit C# zu tun gehabt... Komme auch von S7.
Ist zwar etwas mühsam weil ich niemanden zum Fragen habe, aber ich wurstel so dahin :cool:
 
Zurück
Oben