Ankündigung

Einklappen
Keine Ankündigung bisher.

Makro-Probleme

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

    [EibParser] Makro-Probleme

    Bin dabei meine ersten eigenen Makros zu schreiben. Funktioniert meisten ganz gut, aber einiges klappt nicht und ich weiß nicht warum. Mein Makro ermittelt Min/Max/Durchschnittswerte für eine übergeben GA.

    [Highlight=epc]
    [Macros]
    //Makros
    PIHeizRegler(Test,frei,22.0,ist,20.0,50.0)
    Online()
    MinMax(Sole_VL,EIN,EIN,EIN,EIN,EIN,"Vorlauf Sole-9/1/20")
    MinMax(Sole_RL,EIN,EIN,EIN,EIN,EIN,"Rücklauf Sole-9/1/18")
    //MinMax(VL,EIN,EIN,EIN,EIN,EIN,"Vorlauftemperatur-9/1/2")
    //MinMax(RL,EIN,EIN,EIN,EIN,EIN,"Rücklauftemperatur-9/1/3")
    MinMax(WW,EIN,EIN,EIN,EIN,EIN,"Warmwassertemperatu r-9/1/5")
    MinMax(ATemp,EIN,EIN,EIN,EIN,EIN,"Aussentemperatur-9/1/1")
    MinMax(Soll_HK,EIN,EIN,EIN,EIN,EIN,"akt. Soll 1. HK-9/4/2")
    MinMax(Wind,EIN,EIN,EIN,EIN,EIN,"Windgeschwindigke it-8/1/140")[/Highlight]

    Die zwei auskommentierten Zeilen führen zu einem Fehler. Ebenso wenn ich in Zeile 10 statt "ATemp" nur "AT" verwende.

    Der Fehler:
    Datei: "./tmpMacroOut.txt" wurde geschriebenSyntaxfehler in Makro: "MinMax" in Zeile [37] in D:/EibPC/Makro/Ettinger.lib
    Name^_Min_T = 0.0f32 ==> AT_Min_T = 0.0f32 in der Datei "./tmpApp.txt"
    Deklaration der Variable muss eindeutig sein in >AT_Min_T=0.0f32<
    ID:35
    Woran liegt das?

    Und im Makro selbst hatte ich auch ein Problem. Eine der übergebenen Variablen hieß "H" und wurde mit "0" oder "1" übergeben. Im Makro selbst hier eine Variable Min_H, das führte zum Fehler, weil der Parser da ein Min_0 bzw. Min_1 draus macht. Soll das so sein? Ich dachte die Ersetzung findet nur im Zusammenhang mit "^" statt???
    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

    #2
    Es könnte helfen, wenn Du Dein Makro mal hier vorzeigst ...

    Kommentar


      #3
      gern:

      [Highlight=epc]
      // Max-, Min- und Durchschnittswerte für verschiedene Zeiträume remanent speichern
      :begin MinMax(Name,Stunde,Tag,Woche,Monat,Jahr,GA)
      :info $Max-, Min- und Durchschnittswerte für verschiedene Zeiträume remanent speichern$\\
      $Name des Wertes$\\
      $Stunde = 1: stündliche Berechnung)$\\
      $Tag = 1: tägliche Berechnung)$\\
      $Woche = 1: wöchentliche Berechnung)$\\
      $Monat = 1: monatliche Berechnung)$\\
      $Jahr = 1: jährliche Berechnung)$\\
      $Gruppenadresse mit dem entsprechenden Wert$
      :shortinfo $Max-, Min- und Durchschnittswerte$

      Name^_Min_H = 0.0f32
      Name^_Max_H = 0.0f32
      Name^_Summe_H = 0.0f32
      Name^_Anzahl_H= 0.0f32
      Name^_Ave_H = Name^_Summe_H/Name^_Anzahl_H

      Name^_Min_T = 0.0f32
      Name^_Max_T = 0.0f32
      Name^_Summe_T = 0.0f32
      Name^_Anzahl_T= 0.0f32
      Name^_Ave_T = Name^_Summe_T/Name^_Anzahl_T

      Name^_Min_W = 0.0f32
      Name^_Max_W = 0.0f32
      Name^_Summe_W = 0.0f32
      Name^_Anzahl_W= 0.0f32
      Name^_Ave_W = Name^_Summe_W/Name^_Anzahl_W

      Name^_Min_M = 0.0f32
      Name^_Max_M = 0.0f32
      Name^_Summe_M = 0.0f32
      Name^_Anzahl_M= 0.0f32
      Name^_Ave_M = Name^_Summe_M/Name^_Anzahl_M

      Name^_Min_J = 0.0f32
      Name^_Max_J = 0.0f32
      Name^_Summe_J = 0.0f32
      Name^_Anzahl_J= 0.0f32
      Name^_Ave_J = Name^_Summe_J/Name^_Anzahl_J

      Name^_Min = 0.0f32
      Name^_Max = 0.0f32
      Name^_Summe = 0.0f32
      Name^_Anzahl = 0.0f32
      Name^_Ave = Name^_Summe/Name^_Anzahl

      if change(GA) and convert(GA,0.0f32) < Name^_Min then Name^_Min = convert(GA,0.0f32) endif
      if change(GA) and convert(GA,0.0f32) > Name^_Max then Name^_Max = convert(GA,0.0f32) endif
      if change(GA) then Name^_Summe=Name^_Summe+convert(GA,0.0f32) ; Name^_Anzahl=Name^_Anzahl+1.0f32 endif

      if Stunde and change(GA) and convert(GA,0.0f32) < Name^_Min_H then Name^_Min_H = convert(GA,0.0f32) endif
      if Stunde and change(GA) and convert(GA,0.0f32) > Name^_Max_H then Name^_Max_H = convert(GA,0.0f32) endif
      if Stunde and change(GA) then Name^_Summe_H=Name^_Summe_H+convert(GA,0.0f32) ; Name^_Anzahl_H=Name^_Anzahl_H+1.0f32 endif

      if Tag and change(GA) and convert(GA,0.0f32) < Name^_Min_T then Name^_Min_T = convert(GA,0.0f32) endif
      if Tag and change(GA) and convert(GA,0.0f32) > Name^_Max_T then Name^_Max_T = convert(GA,0.0f32) endif
      if Tag and change(GA) then Name^_Summe_T=Name^_Summe_T+convert(GA,0.0f32) ; Name^_Anzahl_T=Name^_Anzahl_T+1.0f32 endif

      if Woche and change(GA) and convert(GA,0.0f32) < Name^_Min_W then Name^_Min_W = convert(GA,0.0f32) endif
      if Woche and change(GA) and convert(GA,0.0f32) > Name^_Max_W then Name^_Max_W = convert(GA,0.0f32) endif
      if Woche and change(GA) then Name^_Summe_W=Name^_Summe_W+convert(GA,0.0f32) ; Name^_Anzahl_W=Name^_Anzahl_W+1.0f32 endif

      if Monat and change(GA) and convert(GA,0.0f32) < Name^_Min_M then Name^_Min_M = convert(GA,0.0f32) endif
      if Monat and change(GA) and convert(GA,0.0f32) > Name^_Max_M then Name^_Max_M = convert(GA,0.0f32) endif
      if Monat and change(GA) then Name^_Summe_M=Name^_Summe_M+convert(GA,0.0f32) ; Name^_Anzahl_M=Name^_Anzahl_M+1.0f32 endif

      if Jahr and change(GA) and convert(GA,0.0f32) < Name^_Min_J then Name^_Min_J = convert(GA,0.0f32) endif
      if Jahr and change(GA) and convert(GA,0.0f32) > Name^_Max_J then Name^_Max_J = convert(GA,0.0f32) endif
      if Jahr and change(GA) then Name^_Summe_J=Name^_Summe_J+convert(GA,0.0f32) ; Name^_Anzahl_J=Name^_Anzahl_J+1.0f32 endif

      if mtime(0,0) and Stunde then Name^_Min_H=0.0f32 ; Name^_Max_H=0.0f32; Name^_Ave_H=0.0f32; Name^_Summe_H=0.0f32; Name^_Anzahl_H=0.0f32 endif
      if htime(0,0,0) and Tag then Name^_Min_T=0.0f32 ; Name^_Max_T=0.0f32; Name^_Ave_T=0.0f32; Name^_Summe_T=0.0f32; Name^_Anzahl_T=0.0f32 endif
      if wtime(0,0,0,SONNTAG) and Woche then Name^_Min_W=0.0f32 ; Name^_Max_W=0.0f32; Name^_Ave_W=0.0f32; Name^_Summe_W=0.0f32; Name^_Anzahl_W=0.0f32 endif
      if day(1) and htime(0,0,0) and Monat then Name^_Min_M=0.0f32 ; Name^_Max_M=0.0f32; Name^_Ave_M=0.0f32; Name^_Summe_M=0.0f32; Name^_Anzahl_M=0.0f32 endif
      if month(1,1) and htime(0,0,0) and Jahr then Name^_Min_J=0.0f32 ; Name^_Max_J=0.0f32; Name^_Ave_J=0.0f32; Name^_Summe_J=0.0f32; Name^_Anzahl_J=0.0f32 endif

      :end

      [/Highlight]
      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

      Kommentar


        #4
        und wenn ich es so mache, wie ursprünglich geplant:
        [Highlight=epc]
        :begin MinMax(Name,H,T,W,M,J,GA)
        [/Highlight]

        Dann wird bei Aufruf mit
        [Highlight=epc]
        MinMax(WW,EIN,EIN,EIN,EIN,EIN,"Warmwassertemperatu r-9/1/5")
        [/Highlight]
        aus "Name^_Min_H" ein "WW_Min_EIN" statt "WW_Min_H"
        ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

        Kommentar


          #5
          Zitat von Uwe! Beitrag anzeigen
          Der Fehler:
          Datei: "./tmpMacroOut.txt" wurde geschriebenSyntaxfehler in Makro: "MinMax" in Zeile [37] in D:/EibPC/Makro/Ettinger.lib
          Name^_Min_T = 0.0f32 ==> AT_Min_T = 0.0f32 in der Datei "./tmpApp.txt"
          Deklaration der Variable muss eindeutig sein in >AT_Min_T=0.0f32<
          ID:35
          Ok, das Thema konnte ich klären!
          Die durch den Makro generierten Variablennamen waren "zufällig" schon im normalen Programm verwendet. Problem war also vor dem Bildschirm..
          ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

          Kommentar


            #6
            Das hier versteh ich aber noch immer nicht:
            Zitat von Uwe! Beitrag anzeigen
            und wenn ich es so mache, wie ursprünglich geplant:
            [Highlight=epc]
            :begin MinMax(Name,H,T,W,M,J,GA)
            [/Highlight]

            Dann wird bei Aufruf mit
            [Highlight=epc]
            MinMax(WW,EIN,EIN,EIN,EIN,EIN,"Warmwassertemperatu r-9/1/5")
            [/Highlight]
            aus "Name^_Min_H" ein "WW_Min_EIN" statt "WW_Min_H"
            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

            Kommentar


              #7
              An der Stelle, wo ein H im Makro steht wird einfach ein Argument (hier: EIN) substituiert. Schreib einfach statt
              :begin MinMax(Name,H,T,W,M,J,GA)

              :begin MinMax(Name,ArgH,ArgT,ArgW,ArgM,ArgJ,ArgGA)

              dann passiert sowas nicht. "Es iss' halt wie es iss." (Steffis Kommenta im Frühstücksradio NDR, nicht Enertex)

              Gruß,
              Bernd

              Kommentar


                #8
                Hallo Uwe,

                übrigens fehlt in Zeile 10 hinter Wert$ noch ein \\

                Uwe

                PS:

                Kommentar


                  #9
                  Zitat von michel38 Beitrag anzeigen
                  übrigens fehlt in Zeile 10 hinter Wert$ noch ein \\
                  hm.. wenn ich das einfüge, verschwindet die "shortinfo" in der Makroübersicht im EibStudio!?
                  ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                  Kommentar


                    #10
                    Zitat von bmx Beitrag anzeigen
                    An der Stelle, wo ein H im Makro steht wird einfach ein Argument (hier: EIN) substituiert.
                    aber nicht alle H werden ersetzt. D. h. vielleicht doch, vermutlich wird hier auch Groß-/Kleinschreibung unterschieden, oder? Also H wird ersetzt, h dagegen nicht.

                    Aber wann brauch ich dann überhaupt das "^"???
                    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                    Kommentar


                      #11
                      Das brauchst Du, wenn Du das Argument in Zeichenketten ersetzen willst.

                      [highlight=epc]
                      :begin Pushmail( Eigentum )
                      :return {
                      sendudp( Port, IP, $Mein ^Eigentum^ !!!$)
                      }
                      :end
                      [/highlight]

                      wird dann als Ergebnis von

                      [highlight=epc]

                      if after(systemstart(), 1u64) then {
                      Pushmail( Haus );
                      Pushmail( Auto );
                      Pushmail( Yacht );
                      } end
                      [/highlight]

                      beim Empfänger so etwas ergeben:

                      Code:
                      Mein Haus !!!
                      Mein Auto !!!
                      Mein Yacht !!!
                      Das kann also ganz nützlich sein, wenn man die übergebenen Argumente in String einbauen möchte.

                      Gruß,
                      Bernd

                      Kommentar


                        #12
                        Hey, Danke!

                        Das wusste ich nicht. D. h. ich kann statt
                        [highlight=epc]
                        Name^_Min_H = 0.0f32
                        Name^_Max_H = 0.0f32
                        [/highlight]
                        auch einfach
                        [highlight=epc]
                        Name_Min_H = 0.0f32
                        Name_Max_H = 0.0f32
                        [/highlight]
                        schreiben?

                        PS: hast ein gutes Beispiel gewählt! ;-)
                        ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                        Kommentar


                          #13
                          Hallo,

                          wenn du dein Makro nur einmal aufrufst, geht das auch. Wenn du das Makro mehrfach benutzen willst, brauchst du das ^ damit die Variablen sich unterscheiden, je nachdem von welchem Aufruf sie bearbeitet werden, sonst taucht eine Meldung auf "Variable nicht eindeutig definiert" o. ä.
                          Der schöne Niederrhein läßt Grüssen

                          Andreas


                          Alter Hof mit neuer Technik

                          Kommentar


                            #14
                            aber warum wird das "Name" dann nur mit "^" ersetzt, das "H" aber auch ohne.

                            Sorry, ich steh ncoh aufm Schlauch

                            Werd noch mal versuchen damit zu "spielen"
                            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                            Kommentar


                              #15
                              Zitat von Uwe! Beitrag anzeigen
                              Werd noch mal versuchen damit zu "spielen"
                              ok, hier das Ergebnis. Die nachfolgenden Code-Zeile führen alle zum gleichen Ergbnis in der tmpMacroOut.txt und funktionieren auch bei mehrfachem Aufruf:
                              [highlight=epc]
                              Name_Min_H = 0.0f32
                              Name^_Min_H = 0.0f32
                              Name^_Mi^n_H = 0.0f32
                              [/highlight]

                              Das Handbuch sagt dazu:

                              Ein Sonderzeichen bei der Textersetzung ist das „^“-Zeichen. Mit diesem kann die Textersetzung so
                              erweitert werden, dass aus zwei Wortern zusammengesetzte Variablen entstehen. Das „“ Zeichen
                              wird dabei geloscht. Die gleiche Wirkung erzielt man mit dem „_“-Zeichen, wobei dieses Zeichen
                              nicht geloscht wird. Mit Hilfe dieses Vorgehens konnen (indirekt) Variablen in Makros generiert
                              werden, die aufgrund der Namensgebung gleichsam „gekapselt“ sind.
                              Auf diese Weise konnen Sie nun Variablen ahnlich zu objektorientierten Programmiersprachen
                              „kapseln“. Im Beispiel ist die Variable „Doppelklick“ immer wieder genutzt. Wenn es nicht fur jedes
                              Makro eine „igene“ Doppelklick-Variable gabe, wurde das Programm fehlerhaftes Verhalten
                              generieren.
                              Ok, RTFM!
                              In meinem Fall kann ich das "^" auch weglassen, weil ich mit dem "_" unbewusst das zweite mögliche Ersetzungszeichen genommen hab. Damit ist "Name^_Min" und "Name_Min" wirklich identisch, wohin gegen "NameMin" nicht (mehrfach) funktioniert, weil hier nichts ersetzt wird.
                              Und das "Mi^n" scheint dem Parser egal zu sein, solange kein Argument "Mi" übergeben wird.

                              Gut, ich glaub ich hab's...
                              Dankeschön an alle!
                              ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                              Kommentar

                              Lädt...
                              X