Ankündigung

Einklappen
Keine Ankündigung bisher.

Forth Code MicroVis2 für oder Logik richtig?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    KNX/EIB Forth Code MicroVis2 für oder Logik richtig?

    Hallo liebe Forumianer,
    ich habe meinen ersten Forth Code für mein MicroVis2 geschrieben, kann das jemand von Euch beurteilen?

    Hintergrund der Geschichte ist das ich gerne auf meiner Startseite eine Statusanzeige (siehe Grafik)haben möchte die Umschaltet ob ein Fenster auf ist oder alle geschlossen sind. Weiterführend könnte ich dann in der Detailansicht schauen welches Fenster auf ist.

    Code:
    #Die zu ver-ODER-nden Eingange
    #define or1in1 eib.Wohnen_Südseite_Öffnungsstatus
    #define or1in2 eib.Essen_Westseite_Öffnungsstatus
    #define or1in3 eib.Küche_Westseite_Öffnungsstatus
    #define or1in4 eib.Max-Luca_Südseite_Öffnungsstatus
    #define or1in5 eib.Finja_Südseite_Öffnungsstatus
    #define or1in6 eib.Finja_Westseite_Öffnungsstatus
    #define or1in7 eib.Schlafzimmer_Westseite_Öffnungsstatus

    #Der Ausgang mit dem 1-Bit Object
    #define or1out1 eib.Logik_Fensterstatus

    or1in1 or1in2 or1in3 or1in4 or1in5 or1in6 or1in7 or1out1 __orfunction or1
    : oninit mvis2_1_patch @ 0= if exit then
    oninit
    0 mvis2_1_patch !
    ;

    : __initpatch
    drop
    oninit ;

    ' __initpatch mvis2_1_patch !
    "DONE" type
    fsave
    reset
    ______________________


    Danke Christoph
    Angehängte Dateien

    #2
    Hallo Christoph,

    Du hast noch eine ältere MicroVis-Version (2.1)?
    Bei der Patchgeschichte kann ich Dir nicht helfen,
    aber um auf Eib-Meldungen zu reagieren musst Du noch sowas
    wie eine Interruptroutine schreiben. Keine Sorge, ist simpel:

    : eibreaktion
    dup eib.or1in1 = if eib.or1in1 eibget *irgendwas tun* else then
    dup eib.or1in2 = if eib.or1in2 eibget *irgendwas tun* else then
    eib.or1in3 = if eib.or1in3 eibget *irgendwas tun* else then
    ;

    : oninit ['] eibreaktion dup oneibc oneibu starteib
    ;

    Die or-funktion hab ich auch noch nicht benutzt, aber wenn Du das Beispiel aus dem Arcus-Forum als Vorbild hast, sollte das schon funktionieren.
    Ich weiss jetzt gerade nicht, ob die Eib-Abfrage nicht schon innerhalb dieser or-Funktion erfolgt, dann wäre die obige Funktion eibreaktion doppelt gemoppelt.

    Am besten wäre es, wenn Du mal die 2 relevanten Seiten
    als kleines Projekt exportierst und hier im nächsten Post anhängst, dann schau ich mal.


    Gruss
    Pio

    p.s. hab noch kein Internet, kann also mit der Antwort ein paar Tage dauern.
    Gruss Pio

    Kommentar


      #3
      Ich habe das einfach aus dem Vorlage Projekt: or_project_mvis2_1

      was komplett so aussieht übernommen:

      : __stoptimers
      15 0 do I tstop drop loop stopeib ;

      __stoptimers

      forget __stoptimers
      forget __eibtbl

      128 1 4 array __eibtbl

      : __eibfunction
      __eibtbl @ ?dup 0= if exit then execute ;

      # USE "['] your_function your_object __eibregister" in "oninit"
      : __eibregister ( function objnr -- )
      dup 0< if 2drop exit then
      dup 127 > if 2drop exit then
      __eibtbl ! ;

      var __acttimer
      : __newtimer 1 __acttimer +! ;

      #Is the button pressed?

      : __buttonpressed 0xFFFFF43C 0x4000 and 0= ;

      # USE ": oninit oninit .....your code.... ;"
      : oninit ['] __eibfunction dup oneibc oneibu starteib ;

      #USE inobj1 ... inobjn n outobject1 outobj2 __orfunction myorfunctionname

      var __orfunctioncounter

      : __orfunction create , , dup , 0 do dup self swap __eibregister , loop does>
      0 __orfunctioncounter !
      dup 8 + dup @
      0 do
      4 + dup @ eibget 0<> if 1 __orfunctioncounter +! then
      loop
      drop
      dup
      4 + @
      __orfunctioncounter @
      2dup
      swap eibget = if 2drop else
      over eibset dup signalobj eibtx
      then
      @
      __orfunctioncounter @ dup 0<> if drop 1 then
      2dup
      swap eibget = if 2drop exit then
      over eibset dup signalobj eibtx
      ;


      #Die zu ver-ODER-nden Eingänge
      #define or1in1 eib.input1
      #define or1in2 eib.input2
      #define or1in3 eib.input3
      #define or1in4 eib.input4

      #Der Ausgang mit dem 1-Bit Object
      #define or1out1 eib.output1

      #Der Ausgang mit dem 1-Byte-Object "Anzahl der 1-en"
      #define or1out2 eib.output2

      or1in1 or1in2 or1in3 or1in4 4 or1out2 or1out1 __orfunction or1
      : oninit mvis2_1_patch @ 0= if exit then
      oninit
      0 mvis2_1_patch !
      ;

      : __initpatch
      drop
      oninit ;

      ' __initpatch mvis2_1_patch !
      "DONE" type
      fsave
      reset


      Sieht eigentlich ganz gut aus?!
      Angehängte Dateien

      Kommentar


        #4
        Ja, die eib-Gruppen werden innerhalb der or-Funktion abgefragt.
        Der Ausgangskanal wird auch auf den Bus gesendet

        over eibset dup signalobj eibtx

        und die Elemente der Bedienoberfläche werden aktualisiert

        over eibset dup signalobj eibtx

        Hast Du's schonmal laufen lassen?
        Gruss Pio

        Kommentar


          #5
          Ne,
          habe ich bei mir im Büro programmiert (kopiert) und der Bus liegt Zuhause,
          teste ich heute Abend mal, wenn das funktioniert brauche ich nur noch wissen wie ich einen Umwandler von 8*1Bit in 1byte schreibe dann könnte bzw. hätte ich mir den ABB LM/S1.1 und 100 € schenken können, aber nachher ist man(n) immer schlauer!

          Danke für´s drüberschauen.

          Christoph

          Kommentar

          Lädt...
          X