WinCC Flex Aktualisierung von Variablen HMI <-> SPS

Tigerente1974

Level-3
Beiträge
1.826
Reaktionspunkte
293
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich habe was Neues ausprobiert und es passiert nicht ganz das, was ich erwarte.

TIA V13SP1
CPU 1212C
KTP700 BASIC

Am HMI habe ich an eine Taste 2 Ereignisse projektiert, die beim Loslassen der Taste ausgeführt werden sollen.

1. Bit setzen
2. Variable setzen. (Zeiger mit einer festen Zahl beschreiben)

Das Bit startet den Automatikbetrieb und die Variable ist ein Zeiger für die Programm-Nummer.
Beide Variablen haben einen Erfassungszyklus von 100ms.

Auf der SPS-Seite startet die Flanke des Tastenbits eine Ablaufschrittkette und setzt ein Bit zum Lesen aus dem Programm-DB.
Mit diesem Bit lade ich mit einem MOVE-Befehl eine Struktur aus dem Programm-DB gemäß dem Wert im Zeiger, der zu der Taste projektiert wurde.
Der Inhalt wird in einen anderen DB kopiert, den ich im Ablauf als "Aktual-DB" nutze.
Erst nach Ausführung des MOVE-Befehls wird dieses Bit wieder zurückgesetzt.
Die Ablaufschrittkette wartet darauf, dass dieses Bit aus ist um Überschneidungen zu verhindern.
Trotzdem wird sporadisch (etwa 1 von 10 Versuchen) nicht das richtige Programm geladen, sondern der Ablauf startet mit dem zuletzt gewählten Programm.

Ich kann mir das nur so erklären, dass auf der SPS-Seite manchmal das Tasten-Bit schon aktualisiert wird, der zugehörige Zeiger aber nicht.
Kennt jemand dieses Phänomen?
Was kann ich tun um sicherzustellen, dass der Zeiger passt wenn das Tastenbit kommt?

Gruß

Chris
 
Hallo,
vielleicht reicht es schon, zuerst die Variable zu setzen und dann erst das Bit, also die Funktionen, welche an der Taste angehängt sind, tauschen.

Mit Grüßen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke für die Antwort. Ich hab auch schon überlegt, an das Ereignis Drücken den Zeiger zu koppeln, und an das Ereignis Loslassen das Bit.
Da ich den "Fehler" aber nicht sicher reproduzieren kann, möchte ich es gern genauer wissen.
Ich hoffe auf ähnliche Erfahrungen wie man das "richtig" macht.
 
Ja, ich verstehe, wenn etwas nur sporadisch passiert, ist das ärgerlich, weil man sich nie drauf verlassen kann.
Etwas aufwändiger könnte man es mit einem kleinen Skript machen:
Taste drücken => löst Skript aus
Skript schreibt neue Nummer zu SPS und sendet ein Bit "neuer Wert wurde gesendet"
SPS quittiert und schreibt zum Panel "neue Nummer wurde gelesen",
jetzt setzt das Skript das Übernahmebit und die SPS wertet es aus und setzt es selber zurück.

Ein Handshakeverfahren. Eleganter wäre natürlichm wenn es mit dem tauschen der beiden Variablen
zuverlässig funktioniert. Schon einmal probiert?

Mit Grüßen
 
Von der Idee her auf jeden Fall nicht verkehrt.
Die Skriptlösung geht aber schon mal nicht mit meinem BASIC-Panel. Das kann keine Skripte.

Das Vertauschen werde ich mal Probieren. Auch das mit den unterschiedlichen Ereignissen Drücken / Loslassen.
Wäre eleganter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, wenn das mit dem vertauschen oder beim drücken Wert setzen und beim loslassen "Übernehmen" wäre
natürlich schon besser weil einfacher und verständlicher. Es wäre nett, wenn du zurückmeldest, wie es sich
nach dem vertauschen verhält. Ich denke dies ist für mehrere interessant.

Mit Grüßen
 
2 Variablen ohne Handshake in bestimmter Reihenfolge in die SPS schreiben wird nicht 100% sicher funktionieren, vor allem, wenn da auch noch Kommunikationsstörungen auftreten können oder wenn der Kommunikationstreiber womöglich auch noch "optimiert".
Bei mehreren Variablen braucht's ein Handshake (was selbstgebasteltes oder eine fertige Rezeptur-Funktion).

Einfacher: Versuche es mit nur 1 Variable (A) oder bastel die beiden Variablen zusammen in nur eine Variable (B). Dann kann beim Schreiben in die SPS kein Zeitunterschied auftreten:

A) vergleiche die vom HMI geschriebene Nummer (Dein "Zeiger") mit einer zum letzten MOVE gespeicherten Nummer. Wenn die HMI-Nummer sich ändert, dann MOVE in den Arbeits-DB und starte den Ablauf.

B) bastel nur Dein Startbit in die Anforderungsnummer, z.B. Nummer 0..127 + Startbit * 128, oder Nummer 0..9999 + Startbit * 10000


Auf der SPS-Seite startet die Flanke des Tastenbits eine Ablaufschrittkette und setzt ein Bit zum Lesen aus dem Programm-DB.
Mit diesem Bit lade ich mit einem MOVE-Befehl eine Struktur aus dem Programm-DB gemäß dem Wert im Zeiger, der zu der Taste projektiert wurde.
Der Inhalt wird in einen anderen DB kopiert, den ich im Ablauf als "Aktual-DB" nutze.
Erst nach Ausführung des MOVE-Befehls wird dieses Bit wieder zurückgesetzt.
Die Ablaufschrittkette wartet darauf, dass dieses Bit aus ist um Überschneidungen zu verhindern.
Warum so kompliziert? Läuft der MOVE asynchron zur Schrittkette, d.h. dauert der MOVE länger als ein Zyklus oder sind der MOVE und die Schrittkette in verschiedenen Tasks (OBs)?

Harald
 
Hallo Harald,

die Programmverwaltung und der Ablauf sind in unterschiedlichen Bausteinen. Es gibt nur eine Task.

Ich hab das mit dem Bit mal reingebastelt um Fehler ausschließen zu können.

Mit den 2 Variablen fand ich das ganz transparent. Wenn ich da jetzt einen handshake drum herum bauen muss, gefällt mir die Lösung nicht mehr so sehr.
Variante A gefällt mir ganz gut, klappt auch nicht ganz ohne Umwege, weil die Nummer sich nicht ändert wenn der Bediener das gleiche Programm noch einmal startet.
Ich werde das so anpassen, dass die SPS den Zeiger von der Taste auf 0 initialisiert, wenn die Wertänderung erkannt wurde.

Danke für die Antwort.
 
Ich denke der Aufwand dafür wäre ähnlich groß, wie die jetzt von mir angedachte Lösung.
Ich werde das mal ausprogrammieren und schauen wie mir der Code gefällt :)
 
Für jedes Programm ein eigenes Startbit wäre einfach zu einfach? Wieviele Programme gibt es denn?

Übrigens, bei meinem Zeugs mache ich es ähnlich wie du. Ich setze über das HMI eine ID für einen Aktor, Regler oder was auch immer. Anschließend bearbeite ich in der SPS die entsprechenden Daten zu der ID. Allerdings setze ich die ID gewöhnlich schon mit dem Bildaufruf. Die Bedienbits (immer die gleichen) wie AUTO, HAND, EIN, AUS etc. werden dann erst im Bild, wie bei dir auch, über Schaltflächen gesetzt. Unter WinCCflexible hat sich das 100% bewährt. Unter TIA (TP700 + S7-315) hatte ich erst eine kleinere Anwendung, funktioniert allerdings bisher auch zuverlässig.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke der Aufwand dafür wäre ähnlich groß, wie die jetzt von mir angedachte Lösung.
Ich werde das mal ausprogrammieren und schauen wie mir der Code gefällt :)

Also letztenendes wirst du doch dafür bezahlt dass es funktioniert, und nicht dass der Code jemandem "gefällt".
Natürlich ist nicht alles erlaubt, aber manchmal muss man halt in den sauren Apfel beissen und Code benutzen der nicht schön ist solange er denn einfach und gut wartbar ist.
 
Für jedes Programm ein eigenes Startbit wäre einfach zu einfach? Wieviele Programme gibt es denn?

Das variiert. Die kleinsten Programme haben nur 4 da wäre das mit dem Startbit keine große Sache. Bei dem letzten Kunden musste ich das auf 16 aufbohren. Es sind aber auch mehr denkbar.
Ich suche für so was nach Lösungen, die ohne größere Änderungen machbar sind.
 
Also letztenendes wirst du doch dafür bezahlt dass es funktioniert, und nicht dass der Code jemandem "gefällt".
Natürlich ist nicht alles erlaubt, aber manchmal muss man halt in den sauren Apfel beissen und Code benutzen der nicht schön ist solange er denn einfach und gut wartbar ist.

Du hast Recht. Als erstes muss der Code funktionieren. Gefallen muss er auf jeden Fall mir. Ich muss das verstehen und ggf. anpassen. Und zwar auch, wenn ich da nach Jahren noch einmal dran muss.
Endlosdiskussionen zum Thema "wartbarer Code für Instandhalter" gibt es schon genug...
Mein Bestreben ist, den Code so transparent wie möglich zu machen. Gerne auch mit Netzwerk-Kommentaren.
 
Zurück
Oben