PicoC emulator

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #1

    PicoC emulator

    Hallo alle zusammen,

    Ich bin damit beschäftigt, im Programmbaustein zu experimentieren
    Ich benutze das Programm VS Code. aber ich suche eigentlich etwas zum debuggen oder emulieren.
    Hast du mehr Erfahrung damit?

    Programm Hilfe:

    eine kurze Beschreibung dessen, was ich will.
    Ich möchte jede Minute einen Impuls auf AI1 (Minutenimpuls) geben, wobei ein Wert zu "i" addiert werden muss.

    Zyklen 1: "i" = 1 + 1 (Impuls) = 2
    Zyklen 2: "i" = 2 + 1 = 3
    Zyklen 3: "i" = 3 + 1 = 4
    bis das "endVal" erreicht ist.

    Am Ende möchte ich "i" mit AI2 vergleichen. dann möchte ich AQ1 auf true setzen und den erreichten Wert in AQ2 platzieren.

    Ich weiß, dass Loxonblöcke dafür sind, aber ich würde das gerne von dort lernen.

    Code:
    //--------initializing--------//
    int puls, targetTime, reset;
    //--------Read Inputs--------//
    puls = getinput(0);
    targetTime = 1440*getinput(1); // Target time in days must be multiplex by 1440 to minutes
    reset = getinput(2);
    
    while(TRUE)
    {
    //--------Program Settings--------//
    //--------Program--------//
    startVal = 1;
    endVal = targetTime;
         for(i = startVal; i <= endVal; i++)
    printf("%2d\n", i);
    return;
    //--------Write Outputs--------//   
        setoutput(0, i);
        //setoutput(1, sum);
        setoutput(2, startVal);
        setoutput(4, endVal)
    sleeps(100);
    }
    Zuletzt geändert von Davejje; 31.12.2018, 10:58.
  • ledchab
    LoxBus Spammer
    • 10.02.2016
    • 425

    #2
    Gutes Thema - versuche gerade selbst die ersten Schritte bin aber auch noch keinen Milimeter weiter

    Kommentar

    • Davejje
      Extension Master
      • 24.11.2017
      • 173

      #3
      Niemand, der das hier kontrolliert und mir helfen kann?

      Kommentar

      • Christian Fenzl
        Lebende Foren Legende
        • 31.08.2015
        • 11236

        #4
        PicoC-Debugger für Loxone gibt’s keinen.
        Deine Anforderung ist so trivial mit Bausteinen zu lösen, dass es keinen Sinn macht, die eigene Installation mit PicoC zu gefährden, um beim Debuggen zu helfen (weils nunmal keinen Debugger gibt).

        PS: Aber vielleicht hilft das: https://www.loxwiki.eu/plugins/servl...t/view/5046382
        Zuletzt geändert von Christian Fenzl; 01.01.2019, 14:39.
        Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

        Kommentar

        • Davejje
          Extension Master
          • 24.11.2017
          • 173

          #5

          Vielen Dank für deinen Kommentar!

          Wir haben jedoch alle mit 1 + 1 = 2 begonnen, so dass dies auch für das Lernen von PicoC gilt. Beginnen Sie hier mit einer einfachen Formel- oder Funktionssumme. um zu verstehen, was passiert. Danach geht man noch einen Schritt weiter und es wird komplexer
          Es ist also sehr kurz durch die Kurve, um zu sagen, dass dies ein Funktionsbaustein ist. Wenn ich klar sage, dass dies mit einem functi-Block möglich ist, lerne ich es doch.

          Das Thema kann blockieren, wenn Sie nicht Lust darauf haben

          Kommentar

          • Jan W.
            Lox Guru
            • 30.08.2015
            • 1369

            #6
            @Davejje: es gibt leider weder einen Debugger für ein Pico-C Programm innerhalb der Loxone Umgebung, noch einen Emulator, um das Programm z.B. auf dem PC zu testen. Den Pico-C Code gibt es schon, aber es fehlen alle "Loxone-"Funktionen, wie z.B. getinput und setoutput. Dafür müsstest Du Dir einen Emulator selbst schreiben. Ich habe selbst zwei Pico-C Programme geschrieben (Windmesser und Helios Lüftersteuerung) und mich mit "printf" Befehlen für eine Debug-Ausgabe (mit entsprechendem #define DEBUG) beholfen.

            Zu Deinem Testprogramm: Deine For-Schleife schreibt die Zahlen von startval bis endval in das Loxone Log und gibt dann startval und endval an zwei Ausgängen aus. Wofür ist das "return"?

            Um einen Programmbaustein zu programmieren, musst Du einfach nur dem Beispiel 1 in der Loxone Anleitung folgen. Die "getinput" Befehle müssen als innerhalb der While (true) Schleife stehen. Am Ausgang TeQ des Programmbausteins kannst Du den Status Deines Programmes oder einen Syntaxfehler erkennen: Status=start, wenn es läuft, ansonsten die Zeile mit dem Fehler.

            Gruß Jan
            Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
            Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
            Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
            Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
            Node-RED: IKEA Tradfri

            Kommentar

            • Jan W.
              Lox Guru
              • 30.08.2015
              • 1369

              #7
              Nochwas zu Deiner gewünschten Funktion:
              Ich möchte jede Minute einen Impuls auf AI1 (Minutenimpuls) geben
              Mit "getinput" kannst Du nur Zustände, d.h. Werte lesen und keinen Impuls direkt erkennen. Um eine steigende Flanke zu erkennen, muss folgendes erfüllt sein:

              Code:
              while(TRUE) {
               puls = (int)getinput(0);
               if (lastPuls==0 && puls == 1) {
                 // neuer Impuls gelesen
                 pulsCounter++;
                 if (pulsCounter > targetTime) {
                   // hier steht der Code, wenn die Anzahl von Impulsen erreicht ist
                   ...      
                   pulsCounter = 0;
                 }
               }
               lastPuls = puls;
               ...
               sleep(100);
              }
              Falls der Impuls nur sehr kurz ist, dann hast Du ein kleines Problem: am Ende wartest Du eine gewisse Zeit, hier 100ms (Hinweis: in Deinem Code hast Du sleeps verwendet, also 100 Sekunden "geschlafen"). Falls Dein Impuls nur 10ms dauert, dann wirst Du Ihn wahrscheinlich verpassen. Die Zeit für das Schlafen sollte daher kleiner sein, als die Impulslänge. Eine kurze Zeit für das Schlafen, verbraucht aber deutlich mehr CPU Zeit.

              Mit der Funktion "getinputevent" könntest Du noch die CPU Zeit optimieren, denn es müssen die Inputs nur dann gelesen werden, wenn sich ein Input geändert hat (siehe Loxone Doku, erstes Beispiel). Da die EventMask aber je nach Programmbaustein unterschiedlich ist, wird der Code komplizierter. Das bringt nur dann geringe Vorteile, wenn die Schlafenszeit im Milisekunden-Bereich liegt.

              Ich finde es gut, wenn Du Dich mit Pico-C beschäftigst, um die Funktionsweise kennenzulernen. Insgesamt muss ich aber sagen, dass die Anwendung, also das Zählen von Minutenimpulsen eher ungünstig in Pico-C realisiert werden kann. Wenn Du vorher weisst, in welchem Intervall die Impulse kommen, dann kannst Du genau diese Zeit "schlafen" und das spart deutlich CPU Zeit.
              Zuletzt geändert von Jan W.; 01.01.2019, 19:28.
              Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
              Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
              Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
              Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
              Node-RED: IKEA Tradfri

              Kommentar

              • Davejje
                Extension Master
                • 24.11.2017
                • 173

                #8
                Jan,

                Vielen Dank für Ihren Beitrag!
                Ich bin mit Ihrer Reaktion zufrieden, das hilft mir wahrscheinlich weiter.

                Kommentar

                • Davejje
                  Extension Master
                  • 24.11.2017
                  • 173

                  #9
                  Kann in einer Textausgabe ein Wert angezeigt werden, der sich bereits im Programm befindet?

                  Zum Beispiel
                  setoutputtext(0, " *value 1* wochen und *value 2* tage ");

                  Kommentar

                  • Jan W.
                    Lox Guru
                    • 30.08.2015
                    • 1369

                    #10
                    Ja, das geht ganz einfach über sprintf und dann den String mit setoutputtext ausgeben. Siehe auch https://www.loxone.com/dede/kb/script-programming/

                    Die 3 Beispiele in der angegebenen Beschreibung / Dokumentation von Loxone solltest Du Dir schon mal näher ansehen. Deine Frage wird direkt im 1. Bespiel beantwortet.
                    Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                    Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                    Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                    Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                    Node-RED: IKEA Tradfri

                    Kommentar


                    • Davejje
                      Davejje kommentierte
                      Kommentar bearbeiten
                      danke, probier es aus oder es funktioniert!
                  • Davejje
                    Extension Master
                    • 24.11.2017
                    • 173

                    #11
                    danke es funktioniert!


                    Ist es möglich, eine Werte in einer anderen Dezimalzahl anzuzeigen?

                    Ich hatte erwartet, dass dies "% .1f" sein würde, um zum Beispiel 19.5 anzuzeigen. anstelle von 19.50763987
                    Zuletzt geändert von Davejje; 08.01.2019, 11:26.

                    Kommentar


                    • Davejje
                      Davejje kommentierte
                      Kommentar bearbeiten
                      gefunden, dass es%d anstelle von%f sein muss
                  • Labmaster
                    Lox Guru
                    • 20.01.2017
                    • 2576

                    #12

                    check printf format parameters, eg here: http://www.cplusplus.com/reference/cstdio/printf/
                    i would say float "%f" is correct
                    see: http://tpcg.io/wGWwc1
                    Zuletzt geändert von Labmaster; 08.01.2019, 15:25.

                    Kommentar

                    Lädt...