Ansteuerung eines Dimmers über WAGO I/O

Hallo Zusammen,

die Anseteurung eines Dimmers mit dem Wago System kann über die 0-10V Ausgänge einer entsprechenden Wago Klemme erfolgen. Geeignete Dimmer hierfür sind z. B. Hager EV100 bis EV103. Folgender Befehl wird dafür verwendet:
MBT_WriteRegisterWord(id, 0-32764); //0-10V Ausgang

Ich hätte gerne eine Funktion, um den Dimmer über eine definierte Zeit zu dimmen. Also am Besten eine neue Funktion, bei der man den Dimmwert (0-100%) und die Zeit (Sekunden) angeben kann. Ich denke das geht mit einer Schleife, die bei jedem Durchlauf eine Verzögerung von wenigen Millisekunden macht und den Ausgangswert (0-32764) inkremental (+/- X) ändert. Der Ist-Dimmwert ist immer bekannt und liegt in einer Variablen (Wird von Wago zurückgeschrieben auf Wort Y+512).

Kann man das von IPS Seite implementieren? Oder kann ein php-Spezi hier helfen? Ich werde mir auch mal ein paar Gedanken machen.

Wie wärs denn mit einer Wago-Kategorie im Forum?

das würde aber bedeuten, dass 100% in 3 Sekunden ein schnelles Dimmen und 10% in 3 Sekunden ein sehr langsames dimmen wäre. Ich würde mir wünschen, dass die Dimmgeschwindigkeit immer konstant ist, aber ein 10% Dimmen im Verhältnis schneller abgeschlossen ist.

Dazu ne kleine Fingerübung:


   function SlowDimm($id, $soll, $ist, $TimeStep)
   {
      $step=0;
      $step=32764/100;
      
      if ($soll > $ist)
      {  // Raufdimmen
         for ($i=$ist;$i<=$soll;$i++)
         {
            //echo(floor($step*$i).', '); // nur zum debuggen
            MBT_WriteRegisterWord($id, floor($step*$i));
            IPS_Sleep($TimeStep);
         }
      }
      else
      {  // Runterdimmen
         for ($i=$ist;$i>=$soll;$i--)
         {
            //echo(floor($step*$i).', '); // nur zum debuggen
            MBT_WriteRegisterWord($id, floor($step*$i));
            IPS_Sleep($TimeStep);
         }
      }

   }

   SlowDimm($LampenID, 100, 20, 50);

Die Funktion ist noch nicht vollständig und erhebt auch keinen Anspruch darauf es zu sein. Es ist noch ein potentieller Bug und eine „Unschönheit“ drin, aber es zeigt wie es theoretisch gehen müsste. Ich hab keine Hardware mit der ich das hier auf Arbeit testen könnte.

$TimeStep ist die Geschwindigkeit, pro Prozentpunkt in millisekunden - also genaugenommen ein Delay. Ein Dimmen von 100% runter auf 20%, wie im Beispiel, würde also 80*50ms=4Sek dauern… Die Frage ist nur ob die Wago das so schnell verarbeiten kann oder om man lieber 5er oder gar 10er Schritte macht…

Toni

Fuer das auge denke ich sind 30-40 schritte mehr wie genugend oder mann hat ne 2000W lampe! Die original dimmer van E*V FS20DU haben nur 16 schritte - die sieht man ! (sicher bei niedrigspannungslampen).

ein paar Bemerkungen zur Dimmersteuerung - ich nenne es mal lieber zeitgesteuerten Fader :wink:

  • die Taktung ( Realisiert über Sleep in Millisekunden ) muss experimentell ermittelt werden. Hierbei muss ein Wert gefunden werden, der einerseits ein flackerfreies Dimmen ermöglicht und andererseits zeitlich vom System (Wago+IPS+Wago IO Modul+Netzwerk) verarbeitet werden kann. Bzgl. ‚flackerfrei‘ sollte man auch die zu dimmende Lichtquelle berücksichtigen - ein 500 Watt Halogenstab reagiert sehr träge, ein LED Scheinwerfer hingegen sehr empfindlich in Bezug auf das menschliche Auge. Für das DMX4ALL Interface habe ich eine Taktung auf der Basis von 20ms genommen (und oh wunder das entspricht dann so ungefähr 50 Hz).

  • interessant wird das ganze wenn dein Ziel ein paralleles dimmen von vielen Lichtquellen ist. Mit einzelnen Skripten pro Lampe geht das nicht mehr, da du damit die PHP Thread’s von IPS schnell aufgebraucht hast. Somit brauchst du ein „Main-Controller-Script“ mit Queue-Algorithmen zur Abarbeitung der Fadings und eine Schnittstelle mit dem das Controller-Skript seine Befehle empfängt. Nach damaligem hin und her überlegen habe ich dabei von PHP Abstand genommen und das ganze direkt threadbasierend in das DMX IO-Modul integriert. Aktuell werden so in meiner Wohnung ca. 30 Kanäle parallel gefadet und meine Umbauaktionen von FS20 zu DMX sind noch nicht beendet…

Gruss,
Olli

Schonmal Danke für die Ideen!

ich habe mir folgede Version ausgedacht und noch nicht getestet:

 
<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : WagoDimTest.ips.php
Trigger  : 
Interval : 
*/
$word = 0;
$sollprozent = 20;
$zeit = 1;
function WagoDim($word, $sollprozent, $zeit)  //$Soll: 0-100%, $Zeit: in s
{
$schrittdauer = 100;  // Millisekunden
$ist = GetValueInteger("AO00");    // einlesen Istwert
//$istprozent = $sollprozent*100/32764;
$soll = $sollprozent * 32764 / 100;
$increment = ($soll - $ist)/($zeit*1000)*$schrittdauer;
echo $increment;
if ($soll > $ist)  //hochdimmen
{
for ($i=$ist; $i <= $soll; $i = $i + $increment)
{
MBT_WriteRegisterWord($word, (integer)$i);
IPS_Sleep($schrittdauer);
}
}
else    //runterdimmen + halten
{
for ($i=$ist; $i >= $soll; $i = $i + $increment)
{
MBT_WriteRegisterWord($word, (integer)$i);
IPS_Sleep($schrittdauer);
}
}
}
?>

Hier kann über eine Zeitangabe gedimmt werden (wie bei FS20). Problematisch ist natürlich, dass IPSSleep während des Dimmens, speziell bei langen Dimmzeiten, z. B. 30 Min.

@paresy:
Scheinbar ist im Wago Modul noch ein bug: Der mit MBT_WriteRegisterWord(0,X) geschriebene Wert kommt nicht auf Word 512 zurück. Das schreiben auf Word 0 funktioniert aber (Die Lampe dimmt). Wäre schön, wenn man die Rückmeldung auch noch hätte, sonst funktioniert mein script so nicht.

Grüsse
TK6

Wenn du soooo lange fading-Vorgänge dimmen willst, solltest du nicht wie ich in meiner Kladde IPS_Sleep benutzen sonden einen ScriptTimer mit externen Variablen (IPS-Variablen) verwenden.

Und bei einer Helligkeitsänderung pro 30 sekunden ist auch ollis, sicherlich berechtigter, Einwand kein Problem mehr. Obwohl ich, wenn ich mal kurz drüber nachdenke, (Prost Neujahr…) nicht so ganz einsehe warum alle Lampen im Haus gleichzeitig gedimmt werden sollen und warum das mit …

         
for ($i=$ist;$i<=$soll;$i++)
{
    MBT_WriteRegisterWord($id1, floor($step*$i));
    MBT_WriteRegisterWord($id2, floor($step*$i));
    MBT_WriteRegisterWord($id3, floor($step*$i));
    MBT_WriteRegisterWord($id4, floor($step*$i));
    IPS_Sleep($TimeStep);
}

… nicht gehen sollte…

Toni (schon leiiiicht beschwüppst g)

Bzgl. ‚alle Lampen im Haus‘: das will ich ja nochnichtmal so unbedingt (naja, vieleicht auch doch…). Aber für mein Wohnzimmer würde dein Beispiel bei mir im Augenblick so aussehen:

         
for ($i=$ist;$i<=$soll;$i++)
{
    MBT_WriteRegisterWord($id1, floor($step*$i));
    MBT_WriteRegisterWord($id2, floor($step*$i));
    MBT_WriteRegisterWord($id3, floor($step*$i));
    MBT_WriteRegisterWord($id4, floor($step*$i));
    MBT_WriteRegisterWord($id5, floor($step*$i));
    MBT_WriteRegisterWord($id6, floor($step*$i));
    MBT_WriteRegisterWord($id7, floor($step*$i));
    MBT_WriteRegisterWord($id8, floor($step*$i));
    MBT_WriteRegisterWord($id9, floor($step*$i));
    MBT_WriteRegisterWord($id10, floor($step*$i));
    MBT_WriteRegisterWord($id11, floor($step*$i));
    MBT_WriteRegisterWord($id12, floor($step*$i));
    MBT_WriteRegisterWord($id13, floor($step*$i));
    MBT_WriteRegisterWord($id14, floor($step*$i));
    MBT_WriteRegisterWord($id15, floor($step*$i));
    MBT_WriteRegisterWord($id16, floor($step*$i));
    MBT_WriteRegisterWord($id17, floor($step*$i));
    MBT_WriteRegisterWord($id18, floor($step*$i));
    MBT_WriteRegisterWord($id19, floor($step*$i));
    MBT_WriteRegisterWord($id20, floor($step*$i));
    IPS_Sleep($TimeStep);
}

Und es kommt noch hinzu, dass alle Lampen verschiedene Anfangs- und Endwerte haben… :wink:

Ich wünsch dir ein schönes neues Jahr mit vielen neuen Ideen und allem drum und dran und so :slight_smile:

Gruss,
Olli

Okay, Olli…

Erstmal: Ich denke nicht, dass es so nicht gehen würde - obwohl das Script dann freilich etwas „wuchtiger“ und individueller ausfallen müsste…

Aber du wirst mir sicherlich Recht geben, dass die meissten Leute nicht 20 Lampen im Wohnzimmer haben, die sie alle einzelnd und mit variablen Wert ansteuern, oder? :smiley:

Frohes neues Jahr!

Toni

Hallo paresy,

das hier schon gesehen? Du hast ja eine AO-Klemme zum prüfen.

@paresy:
Scheinbar ist im Wago Modul noch ein bug: Der mit MBT_WriteRegisterWord(0,X) geschriebene Wert kommt nicht auf Word 512 zurück. Das schreiben auf Word 0 funktioniert aber (Die Lampe dimmt). Wäre schön, wenn man die Rückmeldung auch noch hätte, sonst funktioniert mein script so nicht.

Grüsse
TK6

Ich hatte den Bug hier gefixt:

Hast du bestimmt per LiveUpdate wieder gekillt :slight_smile:
Habe den Fix nun ins LiveUpdate getan.

Meine Dim Funktion:

LampeDim ist dabei der Prozentwert den ich zwischenspeicher und auf meinem TouchLCD anzeige.


function DimTo($p) {
   $olddim=GetValueInteger("LampeDim")/100*32764;
   $newdim=$p/100*32764;
   $diff=abs(GetValueInteger("LampeDim")-$p);
   $speed=$diff*10;

   if($diff == 0) return;

   if($olddim > $newdim) {
      for($i=$olddim; $i>=$newdim; $i=$i-$speed) {
         MBT_WriteRegisterWord(0, (int)$i);
      }
   } else {
      for($i=$olddim; $i<=$newdim; $i=$i+$speed) {
         MBT_WriteRegisterWord(0, (int)$i);
      }
   }
   SetValueInteger("LampeDim", (int)$p);
}

paresy

Richtig, jetzt gehts.

Ich habe mein script noch ergänzt um eine Ein-Aus-Schaltfunktion, damit wird der Dimmer bei 0% stromlos. Wie kann ich denn jetzt diese neu definierte funktion (WagoDim) in allen anderen scripten zur Verfügung stellen?

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : WagoDimTest.ips.php
Trigger  : 
Interval : 
*/
$word = 0;
$sollprozent = 0;
$zeit = 1;
WagoDim($word, $sollprozent, $zeit);

function WagoDim($word, $sollprozent, $zeit)  //$Soll: 0-100%, $Zeit: in s
{
$schrittdauer = 50;  // Millisekunden
$ist = GetValueInteger("AO00");    // einlesen Istwert
//$istprozent = $sollprozent*100/32764;
$soll = $sollprozent * 32764 / 100;
if ($zeit==0) {$zeit = 0.1;} // Division durch 0 verhindern
$increment = ($soll - $ist)/($zeit*1000)*$schrittdauer;
//echo $increment;
if ($soll > $ist)  //hochdimmen
{
MBT_WriteCoil(0, true);      //Strom ein
for ($i=$ist; $i <= $soll; $i = $i + $increment)
{
MBT_WriteRegisterWord($word, (int)$i);
IPS_Sleep($schrittdauer);
}
}
else    //runterdimmen + halten
{
for ($i=$ist; $i >= $soll; $i = $i + $increment)
{
MBT_WriteRegisterWord($word, (int)$i);
IPS_Sleep($schrittdauer);
}
}
}
if ($sollprozent < 6) {MBT_WriteCoil(0, false);}  //Strom aus
?>

schau mal hier: klick

Toni

Gut,

wenn ich die function mit include einbinde, funktioniert sie dann auch mehrmals im gleichen script? Ich möchte 3 Dimmer in einem script gleichzeitig über 5 sekunden dimmen, zur Zeit schaffe ich es nur sequenziell. Vermutlich kann ich die mit include eingebundene funktion nicht mehrfach parallel ausführen, oder?

Gibt es einen php-Befehl um die scriptlaufzeit zu messen? Ansonsten nehme ich Torros Vorschlag aus dem Forum.

Das hat damit nichts zu tun… Nur kannst du, wenn du ein Script schreibst nur Punkt für Punkt und Zeile für Zeile abarbeiten.

Wenn du es so schreibst…


Dimm(irgendwas);
Dimm(irgendwasAnderes);
Dimm(NochwasAnderes);

…werden diese drei Befehle (Funktionen) grundsätzlich nacheinander ausgeführt. Das hat nichts mit Include zu tun.

du müsstest die Funktion so umbauen, dass der Aufruf folgendermaßen ausschaut:


TrippelDimm(irgendwas, irgendwasAnderes, NochwasAnderes);

Dann hast du es in der Hand deine Funktion alle drei Dimmer gleichzeitig dimmen zu lassen. Aber eben keine Zwei dimmer oder vier Dimmer. Du musst die Funktion anpassen. Anders gehts nicht.

Edit:

Doch, du könntest die Dimm-Funktion im Script nur einmal aufrufen und dann für jeden Dimmer ein eigenes Script verwenden. Wenn du dann in einem vierten Script die drei Scripte, für die drei Dimmer nacheinander ausführen lässt sollte das Threading das parallele dimmen für dich übernehmen. Richtig parallel ist das aber trotzdem nicht. Könnte aber gut sein, dass es schnell genug geht, dass man es nicht mehr merkt.

Toni

Starte die Scripte per IPS_RunScriptEx und übergibt die nötigen Parameter.
Wie das geht, kannst du am besten im TimerEvent Script abgucken im Zusammenspiel mit WIIPS.

Dann laufen Sie parallel und du brauchst nur 1 Script :slight_smile:

TimerEvent


IPS_RunScriptEx("ABC", Array("TWZ_LASTTIMER"=>$lasttimer));

Script ABC


echo $TWZ_LASTTIMER;

paresy

Okay, das wär dan für Fortgeschrittene :wink:

Hallo Zusammen

Die WIPS und Timerwizardscripte habe ich jetzt durchgesehen. Ich finde immer den selben Aufruf:

IPS_RunScriptEx(„Scriptname“, Array(„TWZ_LASTTIMER“=>$lasttimer));

Ich möchte aber zb. meinem Email-Script einfach zwei Variabeln mitgeben als Parameter (Email und Emailtext). Kann mir da jemand mit der Syntax helfen? Kann ich auch numerische übergeben? Soweit ich das verstanden habe, muss ich mit der Variabel im Zielscript nichts spezielles machen, sondern kann sie sofort verwenden.

danke und gruss remo

ps was macht der Teil „TWZ_LASTTIMER“=>$lasttimer"?

edit: pps: sind auch rückgabeparameter möglich?