Step 7 Ausführen einer Funktion / Berechnung bei Ereignis

schrafae

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS Gemeinde,
ich bin neu und freue mich sehr teil des Forums zu sein.

Damit möchte ich direkt zu meinem Anliegen kommen.
Momentan arbeite ich an einem kleinen Projekt, das sich mit dem Energiespar- Modus für die Fördertechnik beschäftigt.
Es wird nach Ablauf einer bestimmten Zeit die Fördertechnik in einen Schlafzustand versetzt.

Dazu wird in einem FB (SCL) eine Funktion (Berechnung) aufgerufen und mit Daten aus einem DB (ARRAY für jedes Band) versorgt.
Nun zu meiner Frage:
Gibt es die Möglichkeit diese Berechnung nur dann zu durchlaufen wenn eine Änderung der Werte im DB statt gefunden hat?
Hat die S7 300 einen Statusbit der z.B.: mit den Stauts darüber gibt wenn ein Programm übertragen wurde? Oder eine Checksumme des DB´s?

Ich würde mich gerne über Ideen freuen!

Danke im Voraus!

Rafael
 
Gibt es die Möglichkeit diese Berechnung nur dann zu durchlaufen wenn eine Änderung der Werte im DB statt gefunden hat?
ist die Berechnung so aufwändig, dass Du die unbedingt überspringen musst?

Ansonsten halt eine Kopie vom DB anlegen. Wenn Variable im DB unterschiedlich zur VAriablen in der Kopie, dann berechnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Ansonsten halt eine Kopie vom DB anlegen. Wenn Variable im DB unterschiedlich zur VAriablen in der Kopie, dann berechnen.
und abschließend die Variablen im DB wieder zur Kopie als neue Vergleichsvorlage für die Feststellung der nächsten Veränderung kopieren.

(ducati weiß das natürlich, aber auch der TE oder andere Suchende?)
 
Ich würde mich gerne über Ideen freuen!
Eine Do-It-Yourself-Idee, die wahrscheinlich viiiel zu spät kommt, wäre, dass die ProgrammTeile, die den Inhalt der Arrays ändern, eine entsprechende Information (vielleicht sogar im Array) hinterlassen, z.B. den kleinsten und den grössten Index unter dem im Array geändert wurde oder die Anzahl der Änderungen oder auch nur ein BOOL, das aussagt, dass geändert wurde.

Aber einfacher ist es natürlich, wie ducati und hucki beschrieben haben. Dann kann man das komplette ArrayOriginal mit dem kompletten ArrayKopie direkt per = oder <> vergleichen und anschliessend die Kopie in einem Rutsch mit ArrayKopie := ArrayOriginal aktualisieren.
Code:
IF ArrayKopie <> ArrayOriginal THEN
    ...
    ArrayKopie := ArrayOriginal ;
END_IF ;
Wie viele Arrays willst Du überwachen und wie umfangreich sind die?

ArrayZuweisen.jpg
 
Hat die S7 300 einen Statusbit der z.B.: mit den Stauts darüber gibt wenn ein Programm übertragen wurde? Oder eine Checksumme des DB´s?

Ich würde mich gerne über Ideen freuen!

Danke im Voraus!

Rafael

Du meinst, wenn jemand mit dem PG den DB neu einspielt oder beispielsweise einen Wert mit einer VAT ändert? Oder einen Wert per HMI ändert?

Falls die Wert Änderung über das HMI erfolgt, kann man dort am einfachsten eine weitere Funktion integrieren, z.B. Wert ändern -> und gleichzeitig ein Bit setzen, dass der DB geändert wurde. Dieses könntest du dann abfragen. Wenn aber mit dem PG geladen oder per VAT geändert wird (oder beispielsweise durch Azyklische Kommunikation von "außen"), dann ist der bereits hier vorgeschlagene Wert wohl der einfachste und funktionalste. Die Frage die ich mir hier nur Stelle ist, warum werden auf diesem Weg Werte geändert? Muss das wirklich so gemacht werden oder kann man vielleicht auch einen besseren Weg finden, sodass man nicht jeden Zyklus komplette DB-Inhalte vergleichen muss?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Fragt sich auch noch, ob das Feststellen einer Wertänderung nicht viel aufwendiger ist, als die Berechnung einfach in jedem Zyklus auszuführen. Warum soll die Berechnung nur bei einer Wertänderung ausgeführt werden?

Von Seiten des Betriebssystems gibt es keine Checksummen oder Statusbits, die Wertänderungen in DB signalisieren. Wertänderungen muß das Anwenderprogramm selber feststellen.

Harald
 
Zurück
Oben