DS2408 und 24V Ausgang

Hallo HJH,

Das Script reagiert einfach nicht. Eine Fehlermeldung gibt es nicht. Aber es ist doch richtig das es eigentlich egal ist ob man mit 1 oder 0 bzw true und false arbeitet. Das ist doch equivalent oder ?

thx

ef

Hallo elektrofreak,

setze doch mal bitte in der folgenden Zeile ein paar zusätzliche Klammern, um den Parser zu zwingen keinen Unsinn bei der Reihenfoge zu machen:

alt: If (GetValueBoolean($VarOutZu) == false or GetValueBoolean($VarOutAuf) == false) {
neu 1: If ((GetValueBoolean($VarOutZu) == false) or (GetValueBoolean($VarOutAuf) == false)) {
neu 2: If ((GetValueBoolean($VarOutZu) == false) || (GetValueBoolean($VarOutAuf) == false)) {

Ich mache von dieser Art der Klammerung immer Gebrauch um ganz sicher zu gehen.
In der zweiten Zeile wird der OR-Operator durch einen anderen erstzt. Beide sollten aber eigentlich völlig äquivalent sein.

Gruß
HJH

Hallo ef,

testet Du mal bitte noch meine Version? Ich denke mal, das loest das ganze dann auf…

Gruss Torro

Hallo HJH,

ist eigentlich alles zuviel des Guten, siehe auch meine Kurzversion, die sogar noch kuerzer geht. Eine IF-Klausel bedingt einen Booleschen Wert, so dass man den vergleich an dieser Stelle nicht benoetigt, wenn er so, wie aufgefuehrt, verwendet wird.

Gruss Torro

Hallo,

also gut wie auch immer es ist für mich nicht wirklich logisch.
Ich werde nun am Wochenend (es läuft ja im moment) alle Versionen Test um dem Fehler auf den Grund zu gehen. Mein Gefühl sagt mir jedoch das das Problem wo anders liegt.

Danke

ef

Hallo,

um vernünftige 24V als Eingang nutzen zu können solltest Du folgende Schaltung verwenden.

Die Schaltung kann mit Gleich oder Wechselspannung von etwa 5V - 24V angesteuert werden. Die LED im Optokoppler braucht einen Strom von etwa 10mA um den Fototransistor sicher zu schalten. T1 arbeitet mit D2 und D3 als einfache Konstantstromquelle. D4 wirkt bei Gleichspannung (E3 = Plus, E4 = Minus) als Verpolschutz und bei Wechselspannung als Gleichrichter. R6 und C3 bilden ein Siebglied und sind nur bei Wechselspannung am Eingang notwendig da sonst der TTL Ausgang im Rhythmus der Netzfrequenz schalten würde. R5 ist nur erforderlich, wenn in dem Portbaustein kein pull up Widerstand vorhanden ist.

Guido

©M.L. 04/2005

Untitled1.jpg

Hallo madru,

das hatte ich ursprünglich auch so überlegt, aber die Anzahl der Bauteile war mit zu hoch. Oben siehst Du ja die Bilder des Ausgangsmoduls, da sind 16 Ports drin. Bei dem Eingangs Modul hatte ich ja eh schon mehr Bauteile. Habe diese aber auch in das gleiche Gehäuse bekommen. Da ich nur mit 24V IO arbeite, war das für mich kein Thema. Des weiteren sind meine I/O Mdule (2x16 In und 2x16 Out) schon fertig.

Ist aber mit Sicherheit eine gute Lösung um Universaleingänge zu bauen und evtl etwas für Torro’s Module.

Danke trozdem

ef

Status Update

Aus für mich unerklärlichen günden Funktioniert es jetzt auch mit true und false :confused: ich vermute das ich einen anderen fehler hatte und euch hier umsonst verückt gemacht habe:eek:
Gruß

ef

Hallo ef,

dann kannnste ja auch die kurze Variante nutzen… :slight_smile:

Gruss Torro

Hallo,

ich habe da ein Bug in meinem Script, bzw. finde ich keine Lösung zu meinem Problem.
Wenn ich mein Script für die Rollos mit on Value True Trigger starte und der Taster der Variable über den Poll des Eingans hinaus betätigt wurde, so wird der Eingangsport wieder mit abfallender Flanke auf 1 gesetzt. Dadurch stoppen die Rollos. Hat vieleicht einer eine Idee wie ich das abfangen kann ? Hier nochmal das Script. Ich habe schon überlegt, ob ich es evtl. mit einem eigenen 30 Sekunden Stopscript hin bekomme.

<?

$OutInstance = 28559;
$PortZu = 4;
$Rollo = "J9";
$StopTime=25;


$PortAuf = $PortZu+1;
$VarInZu = "Rollo_In_".$Rollo."_zu";
$VarInAuf = "Rollo_In_".$Rollo."_auf";
$TasterZu = GetValueBoolean($VarInZu);
$TasterAuf = GetValueBoolean($VarInAuf);
$VarOutZu = "Rollo_Out_".$Rollo."_zu";
$VarOutAuf = "Rollo_Out_".$Rollo."_auf";
$Script = "Rollo_".$Rollo;

If (GetValueBoolean($VarOutZu) == false or GetValueBoolean($VarOutAuf) == false) {
        If (GetValueBoolean($VarOutZu) == 0) {
           TMEX_F29_SetPin($OutInstance, $PortZu, true);
           SetValueBoolean($VarOutZu,true);
           }
        If (GetValueBoolean($VarOutAuf) == 0) {
           TMEX_F29_SetPin($OutInstance, $PortAuf, true);
           SetValueBoolean($VarOutAuf,true);
           }
        IPS_SetScriptTimer($Script, 0);
       }

 else {
       If ($TasterZu == true and $TasterAuf == true){}
       else {
             If ($TasterZu == true) {
              TMEX_F29_SetPin($OutInstance, $PortZu, false);
              SetValueBoolean($VarOutZu, false);
              IPS_SetScriptTimer($Script, $StopTime);
             }
             If ($TasterAuf == true) {
              TMEX_F29_SetPin($OutInstance, $PortAuf, false);
              SetValueBoolean($VarOutAuf, false);
              IPS_SetScriptTimer($Script, $StopTime);
             }
         }
 }

?>

Danke Gruß

ef

Wilkommen in Australien ??
Aha boolean werte : 0 false, -1 : true, 2 = elektrofreak-status

???

Hm das Script funktioniert verstehe deine Antwort nicht :confused:

Ich such halt eine Möglichkeit das Problem abzufangen.

Hallo elektrofreak,

ich bin nicht sicher, ob ich Dich richtig verstanden habe:

Wenn Du den Taster nur ganz kurz drückst, funktioniert es, wie gewünscht.
Hältst Du ihn dagegen etwas länger fest, laufen die Rollos an, stoppen dann aber wieder.

Habe ich Dich richtig wiedergegeben?

Gruß
HJH

Laut PHP definition ist alles ungleich (!=) 0 -> false. Also ist -1, 2, 12, 1024 alles false.

Toni

Hallo HJH,

fast. Also wenn der Taster gedrückt wird sagen wir mal für 100ms und nach 50ms aber schon der DS2408 abgefragt wurde wird beim loslassen der Eingang wieder auf 1 gesetzt. Ich könnte somit nur noch mit dem Trigger on change arbeiten. Habe aber dann wieder das Problem das das Script so nicht mehr läuft.
Ich könnte dann abfragen, ob der Wert überhaupt True ist und erst dann eine aktion ausführen. d.H. dann aber auch, dass ich nicht mehr das gleiche Script mit Script Timer versehen könnte um die Ausgänge nach 30 Sek zurückzusetzen.

Gruß

ef

Hallo elektrofreak,

Du kannst mithilfe der Variablen „$IPS_SENDER“ ermitteln, ob das Script vom Timer oder von einer Variablen angestoßen wurde:

if ($IPS_SENDER == „TimerEvent“) —> auslösendes Ereignis: Timer
if ($IPS_SENDER == „Variable“) —> auslösendes Ereignis: eine Variable

Falls nötig kannst Du auch die auslösende Variable ermitteln:

$trigger = $IPS_VARIABLE;

Damit sollte es möglich sein das Problem zu lösen.

Generelle Vorgehensweise:
Trigger durch Timer: Script auf jeden Fall ausführen.
Trigger durch Variable: Nur dann ausführen, wenn die Taste gedrückt wurde, als nicht beim Loslassen.

Gruß
HJH

Hallo,

vielen dank HJH, damit bin ich weiter gekommen.

Nun möchte ich auch mal kurz einen Abschlußstatus abgeben.

  1. Die Leichtbauweise meiner 24V IO Module funktioniert hervoragend (incl. galvanischer Trennung) nur sollte man die Ausgänge nicht kurzschließen.:mad:

  2. Nach Änderung des 1-Wire Modules (vielen Dank Paresy) läuft nun alles fast verzögerungsfrei (max 1,2sek. (im Schnitt vieleicht 500ms) bis der Ausgang nach Tastendruck gesetzt wurde. :eek:

  3. Durch die zusäzlichen Latch/Activity Variablen im DS2408 Modul habe ich auch das zu lange Taster drücken abfangen können.:smiley:

Ich bin nun vollkommen zufrieden und dank nochmal an Paresy, ich wollte es ja schon hinschmeissen. :rolleyes:

Gruß

ef

Hallo elektrofreak,

der Dank gebührt in gleichem Maße auch Steiner, ohne dessen nächtelange Nachforschungen und Tests es kein Konzept zur Fehlerbereinigung gegeben hätte.

Also unseren Dank an beide, insbesondere weil es ja bei Dir zum Erfolg geführt hat. :slight_smile:

Gruß
HJH