Step 7 Mehrere Parametersätze mit Handshake senden und lesen

Kurt24

Level-2
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
ich arbeite mit einer S7 416-3DP in der Classic Welt und muss eine Kommunikation mit einem Generator schreiben. Dabei hat der Generator 26 Eingangsbytes und 26 Ausgangsbytes. Die Kommunikation läuft über Profibus DP. In den ersten Bytes sind Sollwerte und Istwerte enthalten die ich in einen Datenbaustein zwischenspeichere und dann visualisiere. Soweit kein Problem.

Aber: Es gibt ein Befehlswort mit dem man Parameter lesen und Schreiben kann. In den Parameter liegen zB mehrere Counter die permanent gelesen werden müssen. Sodass immer ca 50 Parameter gelesen werden müssen. Man kann entweder Lesen oder Schreiben. Weiterhin soll man Parametersätze schreiben können. Das Schreiben funktioniert so das man das Befehlswort (1Word also 2 bytes) und die zu senden Daten in 4 bytes auf die entsprechenden Ausgänge legt. Dann antwortet der Generator mit dem Befehlswort und den Daten plus einem ReturnCode (0 ok, 1 Fehler. Somit könnte man beim Senden einen Handshake schreiben. Das Lesen funktioniert genauso.
Mein Problem ist jetzt das man auch fast 50 Parameter Schreiben kann. Viele Daten davon sollen auch aus der Visualisierung heraus gleichzeitig geschrieben werden.
Die Frage ist: Wie gehe ich da ran? Klar ist, das es eine Auswahl zwischen schreiben und lesen geben muss. Aber ist es clever immer alle Parameter zu schreiben? Ich würde dann ein Datenbaustein schreiben und dort das Befehlswort und die zu schreibenden Daten ablegen und dann pro SPS Zyklus ein Parametersatz weiterrutschen. Das würde bedeuten dass der Schreibbefehl sowie der Lesebefehl wenigstens 50 Zyklen braucht. Natürlich könnte man auch einen zweiten DB schreiben den ich mit dem DB der von der Visualisierung geschrieben wird vergleiche und dann nur die geänderten Parameter schreibe. Da wüsste ich allerdings nicht, wie ich die Auswahl der Parametersätze an den Schreibbefehl übergebe. Könnt ihr mich da irgendwie in die richtige Richtung bringen?
 
Ich würde versuchen, 2 Fälle zu unterscheiden:

1. Parameter, die ständig gelesen/geschrieben werden müssen.
2. Parameter, die nur einmalig geschrieben/gelesen werden.

Dann 2 "Schritketten",

1. Alle Parameter (einmalig) lesen/schreiben
2. Parameter, die ständig gelesen/geschrieben, werden müssen.

Die 2. Variante läuft immer, die 1. nur wenn es nötig ist (2. muß so lange stoppen).

Achtung: Es dauert länger als 50 Zyklen, du mußt je Parameter die Rückmeldung abwarten, also das Handshake.

Wenn du jeden einzelnen Parameter mit einem Trigger auf Änderung überwachen willst, geht das auch, dann mußt du tatsächlich für jeden Parameter einen Vergleicher auf Soll/Ist schreiben und 2 DB bzw. Bereiche im DB nutzen.


Wenn Soll<>Ist, dann Parameter senden -->
Wenn senden fertig, dann Parameter Soll --> in Parameter Ist kopieren

--> nächste ungleiche Stelle suchen.

Das geht ganz gut in einer Schleife.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, das werde ich mal probieren. Ich habe jetzt den Handshake fertig und werde mich mal an den DB vergleich in einer Schleife machen.
Der DB Vergleich ist sicher wesentlich schneller als für jeden Parameter den Handshake abzuwarten.

Ich würde die Schleife dann einfach abbrechen lassen wenn ein ungleicher Parameter gefunden wurde und den Schreibbefehl dann ausführen und Soll/Ist abgleich bei erfolgreichem Schreiben durchführen.
Im nächsten Durchlauf wird dann der nächste Ungleiche Parameter geschrieben.

Geht alles etwas schleppen da ich kein SCL lizenz habe und dann ja nur in AWL mit indirekter Adressierung arbeiten kann.

Danke schon mal.
 
Zuletzt bearbeitet:
Guter Ansatz.
Denke bei der Schlefe auch daran, dass man die SPS mit Schleifen schnell in die max. Zykluszeit schicken kann.
Schleife muß also nicht im wörtlichen Sinne immer wieder nach oben springen, das gesamte SPS-Programm läuft ja ohnehin als Schleife.

Also:

1. Start: Variable Schleifenzähler auf 1 setzen (Das machte du z.Bsp. im OB 100 oder falls du des Start mit einer Taste Starten willst, mit einer Flanke der Taste), auf jeden Fall nicht in jedem Zyklus,
sonst funktioniert das nicht)!

2. Vergleich x (Schleifenzähler) ausführen: wenn gesendet werden muß, dann Senden/Handshake (3.), sonst Sprung zu Next (4.)

3. Nach Erfolgreichem Senden/Handshake ebenfalls Sprung zu Next (4.), sonst Sprung zu Ende (5.)

4. Next: Variable Schleifenzähler um 1 erhöhen (Oder bei Max erreicht auf 1)

5. Ende:


Nach Ende: kann der restliche Code des Programms arbeiten, Ist das Programm komplett abgearbeitet endet der Zyklus und springt oben wieder ein.

Wichtig nur, wenn die max-Schleifenanzahl erreicht ist, dann nicht um 1 erhöhen, sondern wieder auf 1 setzen.
Du mußt für den Schleifenzähler einen Merker eine Datenbausteinvariable oder eine Stat-var in einem FB verwenden, keine Temp!
 
Zurück
Oben