Hilfe beim Script

Ich schreib es noch mal.

es geht alles bis auf die Alarmeingänge, welcher 4Eingänge innerhlab einer SEKUNDE verarbeiten soll. Also pro Eingang 250ms x 4 =1 Sekunde als Datenpaket.

Sorry, wenn ich mich falsch ausgedrückt habe. Ist aber ersichtlich im Eingang der Registervariable.

Hallo Hans-Jörg

Deine Temperaturwerte kommen jede Sekunde.

Ja.

Manchmal kommt auch eine Alarmmeldung, normalerweise aber keine.

Wenn aber eine Alarmmeldung kommt, dann wird sie in der nächsten Sekunde, wenn wieder eine Temperaturmeldung kommt, wieder überschrieben.

Nein, kommt ein Alarm, verschiebt sich alle um 1s.

Daher bekommst Du die Alarme nicht mit.

Ich sage es nocheinmal: Du musst vor der Verarbeitung der Alarmwerte erst abfragen, ob überhaupt Alarmwerte gekommen sind!

Die Meldungen stehen doch an :confused:

Aber $A1 hat nur für 250ms den Wert 1, danach ist er wieder 0.

Gruß Thomas

So kommen wir nicht weiter.

Alle Daten sind vorhanden im Eingang, teilweise erscheint auch was vom Alarm im Ausgang.

Passt mein Array nicht ? Bin im Moment Ratlos. Ich werde wohl das ganze auseinanderflügen und per taste pe taste probieren müssen.

Noch eine Ahnung?

Aber $A1 hat nur für 250ms den Wert 1, danach ist er wieder 0.

Das ist korrekt.

Eine Idee Thomas?

Im Endefekkt hat jeder eingang 250ms x4 also 1 sekunde. Ein Datenpaket.

Hallo Rainer,

Du kannst folgenden Befehl verwenden:

if (count($buffer_Alarm1) > 0) $Alarm1 = $buffer_Alarm1[1];  // nur verarbeiten, wenn Alarm1 ausgelöst wurde

Der Vollständigkeit halber solltest Du alle Meldungen so behandeln.

Ich werde morgen Dein Skript dahingehend anpassen.

Gruß
HJH

Hallo Hans-Jörg,

das trag ich jetzt mal ins Hauptscript ein :stuck_out_tongue:

@HJH
Das glingt gut, da wird der Alarmwert nicht mit 0 überschrieben.

Gutes Nächtle…

Gruß Thomas

nichts. :mad:

ich dreh am Rad, das gibst doch gar nicht.

Im Moment müssen 2 Alarmmeldungen anstehen.

Heist 2x0 , 2x1.

Schei+++++++++++s Technik,. Sorry

Hallo Rainer,

versuch das mal:

//Dateneingang von Registervariable
$Daten = GetValueString("Daten_Temp");

//Array nach Kennung aufteilen
$buffer_Temperatur1 = explode("1: ", $Daten);
$buffer_Temperatur2 = explode("2: ", $Daten);
$buffer_Temperatur3 = explode("3: ", $Daten);

$buffer_Alarm1      = explode("A:",  $Daten);
$buffer_Alarm2      = explode("B:",  $Daten);
$buffer_Alarm3      = explode("C:",  $Daten);
$buffer_Alarm4      = explode("D:",  $Daten);


// Daten ausgeben
if (count($buffer_Temperatur1) > 0)
{
 $t1 = explode("\x0d", $buffer_Temperatur1[1]);
 SetValueFloat("T1", (float)$t1[0]);
}
if (count($buffer_Temperatur2) > 0)
{
 $t2 = explode("\x0d", $buffer_Temperatur2[1]);
 SetValueFloat("T2", (float)$t1[0]);
}
if (count($buffer_Temperatur3) > 0)
{
 $t3 = explode("\x0d", $buffer_Temperatur3[1]);
 SetValueFloat("T3", (float)$t1[0]);
}


if (count($buffer_Alarm1) > 0)
{
 $a1 = explode("\x0d", $buffer_Alarm1[1]);
 SetValueInteger("A1", (integer)$a1[0]);
}
if (count($buffer_Alarm2) > 0)
{
 $a2 = explode("\x0d", $buffer_Alarm2[1]);
 SetValueInteger("A2", (integer)$a2[0]);
}
if (count($buffer_Alarm3) > 0)
{
 $a3 = explode("\x0d", $buffer_Alarm3[1]);
 SetValueInteger("A3", (integer)$a3[0]);
}
if (count($buffer_Alarm4) > 0)
{
 $a4 = explode("\x0d", $buffer_Alarm4[1]);
 SetValueInteger("A4", (integer)$a4[0]);
}

Gruß
HJH

Hallo Hans-Jörg,

Geiler Code :smiley:

Tut es leider aber auch nicht. :frowning:

Machen wir Schluss.

Vielen Dank an alle.

Die Fehlermeldungen mit Offset1 sind die selben.

Das liegt an der Zeit, kann man ignorieren.

Ich schau mal weiter.

Hans-Jörg,

schau noch mal über deinen Code, da passt was nicht mit der Temp.

Ich zieh in mir auch noch mal genau rein, ist mir grad aufgefallen.

Der Fehler liegt darin, das alle Tempwerte gleich ziehen.

Simulation mit allen 4 Alarmmeldern.

Alle Kontakte geschlossen (1)

Ich kann nur den letzten einfangen D:1

Wenn ich mich auf den Kopf stelle, ich bekomme es nicht hin.

schottendicht.jpg

Fazit von mir. IPS kann extern nur nach jeweils 1Sek. auswerten. :mad:

Gegenbeweise sind willkommen. Alles andere ist Glücksache :smiley:

Guten morgen Rainer,

das stimmt so nicht ganz, weil ja wie Du selber in Deinem Screenshot zeigst das alle 4 Alarmwerte von IPS empfangen werden, diese sollten jetzt auch im Loggfile stehen. Zur Not könnte man dieses dann auswerten, denn dort stehen Werte im ms Bereich.

MfG Thomas

Hallo Rainer,

Thomas hat Recht. An einer zu geringen Verarbeitungsgeschwindigkeit liegt es nicht. Es ist vielmehr der Zeitpunkt wichtig.

Bisher hatten wir nicht berücksichtigt, dass die vier Alarmdaten innerhalb von weniger als 20ms (bei 9600baud) eintreffen.

Daher sollte unbedingt der Inhalt der Registervariablen zum Zeitpunkt des Triggers ausgewertet werden. Dies geschieht mit der Variablen $IPS_VALUE.

neues Skript:

// Trigger: Registervariable OnChange
$Kennungen = array("1:" => "T1",
                   "2:" => "T2",
                   "3:" => "T3",
                   "A:" => "A1",
                   "B:" => "A2",
                   "C:" => "A3",
                   "D:" => "A4");

//Dateneingang von Registervariable
$Daten = $IPS_VALUE;
$Kennung = substr($Daten, 0, 2);
$buffer = explode($Kennung, $Daten);

// Daten ausgeben
if (count($buffer) > 1)
{
 if (ord($Kennung[0]) < ord('A'))
  SetValueFloat($Kennungen[$Kennung], (float)trim($buffer[1]));
 else
  SetValueInteger($Kennungen[$Kennung], (integer)$buffer[1]);
}

Gruß
HJH

Hallo Hans-Jörg,

Perfekt, das war es.

Jetzt bleiben auch die Variablen auf dem gesetzten Wert und springen nicht mehr.
Nochmals Vielen Dank für eure Hilfe.

Schönen Sonntag noch.