Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrfach auf gleiches Makro zugreifen

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

    Mehrfach auf gleiches Makro zugreifen

    Hi!
    Trotz langer Suche komm ich einfach nicht auf den grünen Zweig, ich hoffe ihr könnt mir etwas auf die Sprünge helfen. Mein Problem ist folgendes.
    Ich habe ein Makro das mir anhand der Laufzeit die Position einer Jalousie berechnet. Ich übergebe dem Makro also einen Wert zwischen 0-100 und dieser wird dann mit der Fahrzeit für 1Prozent verrechnet und somit die Jalousie verfahren. Das ganze sieht so aus:

    Code:
    :begin JalousieSetzen(Name,GAJalousie,GALamellen,ProzentSoll,Start,Reset)
    :info $Jalousien Steuerung für die Standartgröße. Berechnet den Jalousienstand anhand der Fahrzeiten$\\
    $Name der Jalousie zwecks Eindeutigkeit$\\
    $GA der Jalousie$\\
    $GA der Lamellen$\\
    $gewünschter Jalousienstand (ohne "%")$
    :shortinfo $Jalousien Steuerung für DotNetFabrik(Standart)$
    //------------------------------
    // Fahrzeiten in Millisekunden
    //------------------------------
    //FahrzeitTotal=34000ms
    //FahrzeitMax=FahrzeitTotal+Laufzeitkorrektur 
    Name_Laufzeitkorrektur=5000u64
    Name_FahrzeitEinProzent=340u64
    //------------------------------
    // Prozentberechnung
    //------------------------------
    Name_AlterProzentWert=0u64
    Name_NeuerProzentWert=0u64
    Name_Fahrtrichtung=AUS
    // Wenn der Neue Wert größer als der Alte Wert ist nach unten fahren, andernfalls nach oben
    // Berechnet die Differenz zwischen neuem SOLL und altem IST
    //if Reset==EIN then Name_AlterProzentWert=0u64;Name_NeuerProzentWert=0u64 endif
    if change(ProzentSoll)then{
        if ProzentSoll> Name_AlterProzentWert then{
        Name_Fahrtrichtung=EIN;
        Name_NeuerProzentWert=(ProzentSoll - Name_AlterProzentWert)
        }else{
        Name_Fahrtrichtung=AUS;
        Name_NeuerProzentWert=(Name_AlterProzentWert - ProzentSoll)
        }endif
    }endif
    if change(Name_NeuerProzentWert) then Name_AlterProzentWert=Name_NeuerProzentWert endif
    //------------------------------
    // Fahrzeitberechnung
    //------------------------------
    Name_FahrzeitSoll=Name_FahrzeitEinProzent*Name_NeuerProzentWert
    if (ProzentSoll==100u64 or ProzentSoll==0u64) then (Name_FahrzeitSoll+Name_Laufzeitkorrektur) endif
    //------------------------------
    // Fahren & Debug Ausgabe
    //------------------------------
    Name_a=convert(convert(Name_AlterProzentWert,0u08),$$)
    Name_b=convert(convert(Name_NeuerProzentWert,0u08),$$)
    Name_c=convert(convert(ProzentSoll,0u08),$$)
    Name_d=convert(convert(Name_FahrzeitSoll,0u08),$$)
    :return if (Start==EIN) then write(GAJalousie,Name_Fahrtrichtung) endif
            if delay(Start==EIN,Name_FahrzeitSoll) then write(GALamellen,EIN) endif
            JoinStatus(IPad,s700,Name_a)
            JoinStatus(IPad,s701,Name_b)
            JoinStatus(IPad,s702,Name_c)
            JoinStatus(IPad,s703,Name_d)
    :end
    Ich rufe dann in einem weiteren Makro, welches als Automatik für das Zimmer dient, das obere auf. Da ich je nach Situation verschiedene Werte benötige (z.B. hell, dunkel, Präsentation)
    möchte ich natürlich das je nachdem andere Werte übergeben werden.
    Deswegen habe ich ja auch den Namen vor jeder Variable da ich dachte das dann eindeutig auf diese zugegriffen werden kann, außerdem brauche ich ja auch immer den alten Prozentwert der Jalousie für die Berechnung der neuen Fahrzeit. Dann kommt allerdings dieser Fehler:

    "Deklaration der Variable muss eindeutig sein in >Besprechung_Laufzeitkorrektur=5000u64< in >Mak:jalousiesetzen==>" (usw für alle anderen Variablen)

    Ich greife also nicht auf die alte Instanz zu sondern, wie die Meldung schon sagt, die alte Variable wird neu definiert. Wie kann ich den nun mit dem selben Makro immer weiterarbeiten ?
    Hier kurz der Code des zweiten Makros:

    Code:
    //------------------------------
    // Jalousien Automatik
    //------------------------------
    :begin JalousienAutomatikBesprechung(Sperre,Praesentation,Beschattung)
    :info $Jalousienautomatik für Besprechungszimmer$\\
        $Verriegelung der Automatik$\\
        $Befehl für den Präsentationsmodus$\\
        $Befehl für Beschattunsmodus$\\
    :shortinfo $Automatik Jalousie Besprechungszimmer$
    //
    Praesenz="Präsenz - BEG/Besprechung-5/3/21"
    GAJalousie="BEG/Großraum - West 2: auf/ab-2/3/50"
    GALamellen="BEG/Großraum - West 2: Lamellen-2/3/51"
    if Sperre==AUS then{
        if Praesenz or !Praesenz and sun() then{
            JalousieSetzen(Besprechung,"BEG/Großraum - West 2: auf/ab-2/3/50",
            "BEG/Großraum - West 2: Lamellen-2/3/51",0u64,EIN,AUS)} endif;
        if Praesenz or !Praesenz and sun() then{
            JalousieSetzen(Besprechung,"BEG/Großraum - West 2: auf/ab-2/3/50",
            "BEG/Großraum - West 2: Lamellen-2/3/51",100u64,EIN,AUS)} endif
    }endif
        
    :end
    Und dann noch etwas anderes. Es sollte doch eigentlich möglich sein (steht ja auch im Handbuch) das man Variablen Gruppenadressen zuweist. Wenn ich allerdings meinem Makro statt der Gruppenadresse die Variable übergebe.

    Code:
    GAJalousie="BEG/Großraum - West 2: auf/ab-2/3/50"
    steht nacher beim Makro statt der Adresse GAJalousie und der Debugger springt logischerweise an...

    Ich hoffe das war jetzt nicht zu chaotisch erklärt, wenn doch dann einfach nochmal nachfragen

    Schonmal vielen Dank und beste Grüße
    Robert

    #2
    Zitat von Xceno Beitrag anzeigen
    Hi!
    Ich greife also nicht auf die alte Instanz zu sondern, wie die Meldung schon sagt, die alte Variable wird neu definiert.
    Im Makro "JalousienAutomatikBesprechung" wird das Makro "JalousieSetzen" 2x aufgerufen und damit werden alle Variablen erneut angelegt.
    Wie kann ich den nun mit dem selben Makro immer weiterarbeiten ?
    Ohne den Code genauer betrachtet zu haben, bleibt
    • lokale Variablen im Makro nutzen - hier musst Du ggf. die benötigten Variablen (wie Name_Laufzeitkorrektur) per Argument übergeben
    • ein weiteres Makro bauen, in denen die "globalen" Variablen nur einmal definiert werden
    • die globalen Variablen in "JalousienAutomatikBesprechung" packen (mein Favorit)


    Und dann noch etwas anderes. Es sollte doch eigentlich möglich sein (steht ja auch im Handbuch) das man Variablen Gruppenadressen zuweist. Wenn ich allerdings meinem Makro statt der Gruppenadresse die Variable übergebe.
    Write erwartet immer eine Adresse - ich denke Du meinst der Compiler nicht der Debugger springt an, wenn nicht, hab ichs nicht gecheckt.

    Du kannst mit getaddress/address arbeiten (Beispiel Handbuch S.180ff.), wenn Du die GAs nicht direkt übergeben willst.
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Alles klar dann mach ich mich mal an die Arbeit und poste dann nochmal mein Ergebnis.
      Vielen Dank erstmal
      Und ja ich meinte den Compiler, mein Fehler

      Kommentar

      Lädt...
      X