Pico C Problemchen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • kgrill
    Azubi
    • 19.06.2020
    • 4

    #1

    Pico C Problemchen

    Hallo Leute, ich bräuchte mal eure Hilfe. Ich habe ein kleines Pico C Programm geschrieben:

    // Steuerung der elektrischen Heizpatrone
    // Ziel: Wenn Heizung = 0 und die Boilertemperatur kleiner Solltemperatur
    // soll Askoload, Leistung und Zaehler gesetzt werden
    float Tempsoll,Tempist,Tempdelta,Leistung,PV;
    int nEvents,Zaehler,Askoload,Heizung;
    while(TRUE)
    {
    nEvents = getinputevent();
    if (nEvents & 0x3c)
    {
    Heizung = getinput(0);
    PV = getinput(1);
    Tempsoll = getinput(2);
    Tempist = getinput(3);
    Tempdelta = Tempsoll - Tempist;
    if (Heizung==0)
    {
    if (Tempdelta>=0)
    {
    Askoload = PV / 0.629;
    Leistung = Askoload * 0.629;
    Zaehler = 1;
    }else{
    Askoload = 0;
    Leistung = 0;
    Zaehler = 0;
    }
    }else{
    Askoload = 0;
    Leistung = 0;
    Zaehler = 0;
    }
    setoutput(0,Askoload);
    setoutput(1,Leistung);
    setoutput(2,Zaehler);
    setoutput(3,Tempdelta);
    setoutput(4,Heizung);
    setoutput(5,Tempsoll);
    setoutput(6,Tempdelta);
    }

    sleep(100);
    }

    Das Problem ist, dass die Progammzeile "Tempdelta = Tempsoll - Tempist" den Wert immer nur updatet, wenn beide Werte (Tempsoll und Tempist) verändert werden. Wird nur Tempist geändert, bleibt der alte Wert stehen.
    Was mache ich falsch?

    Danke für Eure Hilfe.
  • Christian Fenzl
    Lebende Foren Legende
    • 31.08.2015
    • 11234

    #2
    Bist sicher, dass (nEvents & 0x3c) die richtige Abfrage ist und deswegen dein Code überhaupt drankommt?

    BTW: CODE-Tags sind für Code echt super!
    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

    Kommentar

    • kgrill
      Azubi
      • 19.06.2020
      • 4

      #3
      Laut einem anderen Beitrag ist 0x3c richtig, wenn 4 Eingänge abgefragt werden (Binär 111100) und das funktioniert soweit auch. Die Schleife funktioniert auch mit den anderen Parametern einwandfrei.

      Kommentar

      • Sammy
        LoxBus Spammer
        • 23.08.2018
        • 413

        #4
        Hallo kgrill,

        wieso nutzt Du dazu PICO, die Logik sollte doch auch klassisch über grafische Programmierung aufzubauen sein?

        Die Programmierung in PICO erachte ich als schwierig, da die mögliche Fehlersuche stark eingeschränkt ist und man kaum Rückmeldung zu einem Fehler bekommt.

        Alternativ kannst Du dazu auch die deutlich einfachere Ablaufsteuerung nutzen, die prüft zu mindestens den Syntax pro Zeile.

        Hintergrund meiner Gedanken:
        Vor Loxone habe ich einiges mit fhem gebastelt und manche Funktionen auch mit PERL "versucht" zu programmieren. Wenn man aber nach 3 Monaten wieder mal eine Änderung durchführen will, musste man sich erst mühsam in die alte Programmierung reindenken und da habe ich sehr oft über den Syntax von PERL geflucht. In die grafische Programmierung denke ich mich schneller rein und kann durch die Liveview oder Simulation auch schön testen.

        Viel Erfolg,
        Michael

        Kommentar

        • kgrill
          Azubi
          • 19.06.2020
          • 4

          #5
          Christian Fenzl

          Danke für Deine Anregung. Ich habe die Abfrage auf if (nEvent >0x0) geändert und jetzt funktioniert es tadellos.

          Kommentar

          • Labmaster
            Lox Guru
            • 20.01.2017
            • 2574

            #6
            kgrill

            Abfrage Event>0x0 ist eigentlich nicht richtig, da damit auch events an allen anderen Inputs triggern können.

            Die Bitmaske für den getinputevent ist

            Bit 0 (Hexwert: 0x0001): Textinput 1
            Bit 1 (Hexwert: 0x0002): Textinput 2
            Bit 2 (Hexwert: 0x0004): Textinput 3
            Bit 3 (Hexwert: 0x0008): Analoginput 1
            Bit 4 (Hexwert: 0x0010): Analoginput 2
            Bit 5 (Hexwert: 0x0020): Analoginput 3
            Bit 6 (Hexwert: 0x0040): Analoginput 4

            Bit 7 (Hexwert: 0x0080): Analoginput 5
            Bit 8 (Hexwert: 0x0100): Analoginput 6
            Bit 9 (Hexwert: 0x0200): Analoginput 7
            Bit10 (Hexwert: 0x0400): Analoginput 8
            Bit11 (Hexwert: 0x0800): Analoginput 9
            ... usw.

            siehe PDF Seite 9 >>>> getinputevent
            Download PDF: http://updatefiles.loxone.com/Knowle...rogramming.pdf


            In deinem Fall soll ja wohl nur auf Änderungen der ersten 4 Analog Eingänge ( getinput(0 bis 3) ) reagiert werden, dies entspricht den Bits 3, 4, 5 und 6 (oben fett markiert) , also dem aufsumierten Hexwert von 0x08 + 0x10 + 0x20 + 0x40, das ergibt somit den Hex Summenwert von 0x78


            nEvents = getinputevent();
            if (nEvents & 0x78)​{

            }

            Hiermit würde die IF nur bei einer Änderung der Analog Inputs 1 bis 4 erfüllt sein und somit deine Anforderungen erfüllen.

            BTW für nicht Bitpfriemler:
            Mit der 0x3C Maske würde auf Texteingang 1 + die ersten 3 Analogeingänge reagiert werden, schiebt man das Bitmuster um ein Bit nach oben , wäre es ja richtig, also die ersten 4 Analogeingänge und keine Texteingang. Eine Bit nach oben schieben entspricht einer Multiplikation mit 2, also 0x3C * 2 und da sind wir dann auch wieder bei den 0x78
            Zuletzt geändert von Labmaster; 31.08.2023, 10:41.

            Kommentar


            • Sammy
              Sammy kommentierte
              Kommentar bearbeiten
              Wenn ich das so sehe, stelle ich mir vor, dass Du in Deiner Freizeit kleine Sachen direkt in Maschinensprache schreibst, weil Dir die höheren Sprachen zu umständlich sind ;-))
          • kgrill
            Azubi
            • 19.06.2020
            • 4

            #7
            Labmaster

            Danke für deine präzise Erklärung, jetzt habe ich es auch verstanden und es funktioniert prächtig.

            Kommentar

            Lädt...