was bringt gleichzeigtiger Zugriff auf viele S7 ?

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe bei eurem Anliegen zur parallelen, threadgesteuerten Kommunikation zu einer SPS von einem PC doch ein gewaltiges Verständnisproblem...

Wenn ich die Kommunikation zu beliebig vielen SPS mittels Treiber über einen (!!!) z.B. NIC anstosse, wie zum Teufel soll ich das parallel hinkriegen ??

Es wird immer seriell bleiben, da könnt Ihr machen was Ihr wollt :rolleyes:

Gruß

Question_mark

Im Prinzip hast Du recht. Nur wenn wir uns die Kommunikation zu einer SPS mal ansehen und davon ausgehen, dass bei 100 MBit/s ca. 10 MByte/s Daten über den NIC gehen, dann benötigt die Anfrage bei einer S7-300 mit maximal 300 Byte (incl. IP-Overhead) ca. 30 Microsekunden. So, und jetzt wartet der PC ca. 10 Millisekunden auf die Antwort. Und statt zu warten, kann er in dieser Zeit was sinnvolles machen und den NIC quälen. Und das verstehe ich von parallelen Anfragen (wissentlich, dass über den NIC alles seriell abläuft). Aber an diesem Beispiel wird deutlich, dass der NIC nicht das limitierende Element der Kommunikationskette ist.
 
Hi,

Wer Threads braucht, sollte wissen wozu:
1. Um mehrere SPS über Ethernet anzusprechen: Pro SPS ein socket, ein daveInterface und ein daveConnection struct.

mal zurück zur eigentlichen Frage.

Wenn ich folgenden Fall habe:

- Lesen von Daten aus Datenbausteinen so schnell wie möglich
- es werden mehrere DB´s pro SPS gelesen
- diese DB´s werden nacheinander gelesen

Ist es nun möglich mehrere Steuerungen per Multithreading abzurufen ohne das ich Probleme mit der LibNoDave bekomme?

(Visual Studio 2005) unter WinXP

Gruß Fliegertiger
 
keiner eine Ahnung??????

das folgende hast du doch sicher gelesen, denn dort wurde deine Frage doch beantwortet

Libnodave verwendet malloc() im einfachsten Fall nur innerhalb von daveNewInterface() und daveNewConnection(). Diese Funktionen sollten nach meiner Intention nur einmal pro benutzter Schnittstelle/Socket bzw. Pro SPS aufgerufen werden.
Im laufenden Betrieb ist die einzige globale Variable daveDebug. Auf daveDebug wird normalerweise nur lesend zugegriffen, daher sind konkurrierende Schreibzugriffe nicht zu erwarten. Ferner sollte in Anwendungen daveDebug=0 sein.
Die einzige Konsequenz ist also, daß, sobald ein Thread daveDebug <>0 setzt, alle Threads Debugging-Informationen schreiben werden.

Was nicht geht ist, daß mehrere Threads eine Verbindung zur SPS teilen. Da Libnodave zeichenweise sendet, könnte eine Anfrage an die SPS von einer weiteren an beliebiger Stelle unterbrochen werden. Das Ergebnis wäre wohl Blödsinn für die SPS.
Weiterhin ist mir nicht bekannt was eine S7 macht, wenn eine weitere Anfrage eingeht, bevor die erste beantwortet wurde.
Schließlich ist unbekannt, ob die Anfragen in der Reihenfolge ihres Eingangs beantwortet würden. Egal ob ja oder nein, jeder Thread könnte die Antwort auf Anfragen eines anderen erhalten.

Wer Threads braucht, sollte wissen wozu:
1. Um mehrere SPS über Ethernet anzusprechen: Pro SPS ein socket, ein daveInterface und ein daveConnection struct.
2. Um mehrere SPS an MPI über denselben seriell/MPI-Adapter anzusprechen.
3. Um dieselbe SPS von mehreren Clients/Programmen/Standorten anzusprechen.

Im Fall 2 und 3 ist es ratsam, einen Prozess/Thread laufen zu lassen, der mit der Steuerung spricht und Daten an die weiteren Threads/Prozesse weiterreicht. Dieser Prozeß entspricht dann gewissermaßen einem OPC-Server.


Wenn ich folgenden Fall habe:

- Lesen von Daten aus Datenbausteinen so schnell wie möglich
- es werden mehrere DB´s pro SPS gelesen
- diese DB´s werden nacheinander gelesen

Ist es nun möglich mehrere Steuerungen per Multithreading abzurufen ohne das ich Probleme mit der LibNoDave bekomme?

Wenn du eine bestehende Verbindung zur SPS nur von einem Thread ansprichst, solltest du keine Probleme bekommen. Um die sache etwas zu beschleunigen, könntest du mit jeder Read anfrage gleich aus mehreren DB´s lesen(je nachdem wieviele Daten du hast), dass soll wohl durch zusammenbauen der PDU funktionieren, mit diesen Funktionen habe ich mich allerdings noch nicht beschäftigt.

Ich löse das meistens so:
Code:
- Verbindungen im Hauptprogramm aufbauen
- für jede Verbindung einen Thread starten
- im Thread lese- und schreibbefehle für die jeweilige SPS abarbeiten
- Daten in Hauptprogramm zurückgeben
- bei Programmende Verbindungen im Hauptprogramm abbauen
ob das so 100%ig korrekt ist weis ich nicht, habe aber bis dato mit dieser Vorgehensweise keine Probleme gehabt.
 
Zurück
Oben