Variable über Skript aktualisieren

Hallo Zusammen.

Ich habe ein kleines Problem. Ich habe eine Instanz (mit Variable, Typ Integer, Siemens S7) in der eine Laufzeit in Sekunden steht. Diese Instanz ist aus IPS-Sicht READ-ONLY.

Wenn diese Variable aktualisiert wird, soll der Wert über ein Skript bearbeitet werden und in eine andere Variable gespeichert werden.

Ich bin bislang wie folgt vorgegangen.
Ein Ereignis für die Zielvariable erstellt um sie zu beschreiben wenn die S7-Instanz aktualisiert wird.
An dem Skript, das dann ausgeführt werden soll, ebenfalls ein Ereignis erstellt. Dieses wird ebenfalls ausgeführt, wenn die Zielvariable aktualisiert wird.

Im Wesentlichen funzt der Weg auch.
Das Problem ist jetzt nur, dass nachdem das Skript ausgeführt wurde natürlich die Variable mit den neuen (durch das Skript bearbeiteten) Wert aktualisiert wurde. Dann startet das Skript natürlich neu und bearbeitet den Wert wieder. Das führt logischer Weise zum falschen Wert (weil dieser ja erneut durch das Skript bearbeitet wird).

Wie kriege ich IPS dazu, dass das Ereignis nur auszuführen wenn die Variable durch die S7-Instanz aktualisiert wird?
Oder vielleicht hat jemand einen anderen Ansatz für mich?

Hier das Skript:



<?

SetValue($_IPS['VARIABLE'], toStd($_IPS['VALUE']));


// Int (Sekunden) --> Uhrzeit (String: Std:Min:Sek)
function toStd($sekunden)
{
    $stunden = floor($sekunden / 3600);
    $minuten = floor(($sekunden - ($stunden * 3600)) / 60);
    $sekunden = round($sekunden - ($stunden * 3600) - ($minuten * 60), 0);

    if ($stunden <= 9) {
        $strStunden = "0" . $stunden;
    } else {
        $strStunden = $stunden;
    }

    if ($minuten <= 9) {
        $strMinuten = "0" . $minuten;
    } else {
        $strMinuten = $minuten;
    }

    if ($sekunden <= 9) {
        $strSekunden = "0" . $sekunden;
    } else {
        $strSekunden = $sekunden;
    }

    return "$strStunden:$strMinuten:$strSekunden";
}
?>


Irgendwie muss man scheinbar ab und zu einen Beitrag schreiben um selbst einen Lösungsweg zu finden.

Ich habe es jetzt so gelöst:


if (toStd($_IPS['OLDVALUE']) <> $_IPS['VALUE']){
	SetValue($_IPS['VARIABLE'], toStd($_IPS['VALUE']));
};

falls jemanden eine generell bessere Lösung einfällt, bin ich dankbar.

Hi Uli!

Ich habe es nicht getestet, aber spontan würde ich es damit versuchen:
$_IPS[‚SENDER‘] >> „StatusEvent“ >> $_IPS[‚INSTANCE‘] >> InstanzID zur Statusänderung
Systemvariablen — IP-Symcon :: Automatisierungssoftware

Wenn dein Weg funktioniert, sehe ich da aber auch nichts, was dagegen spricht :slight_smile:

Grüße,
Chris

Hi Chris,

Das ganze soll 14x aufgerufen werden, und die InstanzID ändert sich ja bei jedem Mal. Die ID muss ja dann fest im Skript stehen, oder?
Oder versteh ich etwas falsch?

Abend!

Ja, vergiss es :smiley: War wie gesagt nicht getestet. Ich hatte gedacht, dass man als „Sender“ irgendwie das StatusEvent bekommt und damit auch die InstanzID. Geht aber nicht und war eh wirr gedacht :smiley:

Aber nachdem ich deinen 1. Beitrag noch ein paar Mal gelesen habe, stellt sich mir die Frage, warum das Skript erneut ausgeführt wird… Weil der Trigger für das Skript ist die „nur Lesen Variable“ der Instanz, und wenn du dann eine weitere Variable beschreibst, dann darf das Skript doch nicht erneut ausgeführt werden?!
Oder hast du 2 Events unter dem Skript und willst mit der Zahl in der „Ziel-Variable“ noch etwas anderes machen? Dann solltest du entweder ein extra Skript dafür anlegen, oder wenn du nur ein Skript verwenden willst, dann mit „if ($_IPS[‚EVENT‘] == $EventID) {“ prüfen, durch welches Event das Skript ausgeführt wurde und dann die entsprechenden Aktionen/Befehle ausführen lassen.

Oder ich hab nicht so ganz verstanden was du da vor hast… Ein Screenshot mit der Übersicht über die Variablen und Events könnte da helfen :slight_smile: Aber wenn du sagst, dass es so bei dir funktioniert, dann lass es so. Wenn du Lust hast der Sache weiter nach zu gehen und Klarheit rein zu bringen, dann bitte den Screenshot posten :slight_smile:

Grüße,
Chris