Pico C Programm wird nach Update deaktiviert

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • easyf
    Dumb Home'r
    • 18.09.2015
    • 10

    #1

    Pico C Programm wird nach Update deaktiviert

    Hallo zusammen,

    musste leider ein Update meines MS1 von 11.x auf 13.1 durchführen. Jetzt wird mir ein relativ einfaches Pico-C Programm deaktiviert (liest ne REST-Schnittstelle aus und füllt damit die Ausgänge). Leider steht da nicht weiter bei warum. Ich habe ein fast ähnliches Programm welches weiterhin tadellos funktioniert. An beiden Programmen sind die Eingänge leer und die Ausgänge mit Merkern und virtuellen Status verbunden. Wenn ich das Coding in ein neues Programm kopiere, funktioniert das neue Programm. Wenn ich im alten Programm einfach nur durch eine printf-Ausgabe einbaue, bleibt es trotzdem deaktiviert.

    Jemand ne Idee was das sein kann?

    sehr aussagekräftige Log-Infos:

    2022-10-31 15:12:47.992;Disabled PicoC program ETA-Programm 2n Speicher_Kessel because it caused an error.
    Zuletzt geändert von easyf; 31.10.2022, 15:17.
  • darkrain
    MS Profi
    • 25.08.2015
    • 553

    #2
    Naja wenn dein PicoC Code in einem neuen Programmbaustein unter V13 läuft (zumindest hab ich das jetzt so rausgelesen), dann wird es bestimmt ein Migrationsbug sein. Bist du von der V11 direkt auf die V13 gegangen?

    Kommentar

    • easyf
      Dumb Home'r
      • 18.09.2015
      • 10

      #3
      Ja, bin ich. Das Coding hat allerdings keinen Syntaxfehler. Wie funktioniert den das Melden eines Bugs bei Loxone? Der Code läuft auch in einen neuen Baustein nicht stabil...
      Zuletzt geändert von easyf; 01.11.2022, 13:28.

      Kommentar

      • darkrain
        MS Profi
        • 25.08.2015
        • 553

        #4
        Wenn du den Code ihr mal posten würdest, dann kann man sich mal den Syntax reingucken.

        Kommentar

        • easyf
          Dumb Home'r
          • 18.09.2015
          • 10

          #5
          Gerne:

          Code:
          // write program here in PicoC
          // read webpage from 192.168.0.85:8080 (every 60 seconds + time of request)
          
           printf("Start Abfrage Loxone webservices");
           while(TRUE)
           {
          
           char* pRet0 = httpget("192.168.0.85:8080","/user/var/40/10241/0/0/12197"); // Aussentemperatur C
           if ((pRet0 != NULL) && (*pRet0 != 0))
           {
           char* p0 = strstrskip(pRet0,"advTextOffset=");
           if (p0 != NULL)
           {
           setoutput(0,atof(p0 + 4)/10); // Aktuelle Aussentemperatur C
           }
           free(pRet0);
           }
          
           char* pRet1 = httpget("192.168.0.85:8080","/user/var/120/10251/0/0/12132"); // Warmwasserspeicher Soll C
           if ((pRet1 != NULL) && (*pRet1 != 0))
           {
           char* p1 = strstrskip(pRet1,"advTextOffset=");
           if (p1 != NULL)
           {
           setoutput(1,atof(p1 + 4)/10); // Warmwasserspeicher Soll C
           }
           free(pRet1);
           }
          
           char* pRet2 = httpget("192.168.0.85:8080","/user/var/120/10251/0/0/12271"); // Warmwasserspeicher C
           if ((pRet2 != NULL) && (*pRet2 != 0))
           {
           char* p2 = strstrskip(pRet2,"advTextOffset=");
           if (p2 != NULL)
           {
           setoutput(2,atof(p2 + 4)/10); // Aktuell Warmwasserspeicher C
           }
           free(pRet2);
           }
          
           char* pRet3 = httpget("192.168.0.85:8080","/user/var/40/10021/0/0/12001"); // Kessel Soll C
           if ((pRet3 != NULL) && (*pRet3 != 0))
           {
           char* p3 = strstrskip(pRet3,"advTextOffset=");
           if (p3 != NULL)
           {
           setoutput(3,atof(p3 + 4)/10); // Kesseltemperatur Soll C
           }
           free(pRet3);
           }
          
           char* pRet4 = httpget("192.168.0.85:8080","/user/var/40/10021/0/0/12161"); // Kessel C
           if ((pRet4 != NULL) && (*pRet4 != 0))
           {
           char* p4 = strstrskip(pRet4,"advTextOffset=");
           if (p4 != NULL)
           {
           setoutput(4,atof(p4 + 4)/10); // Kesseltemperatur Ist C
           }
           free(pRet4);
           }
          
           char* pRet5 = httpget("192.168.0.85:8080","/user/var/40/10021/0/0/12180"); // Kesseldruck
           if ((pRet5 != NULL) && (*pRet5 != 0))
           {
           char* p5 = strstrskip(pRet5,"advTextOffset=");
           if (p5 != NULL)
           {
           setoutput(5,atof(p5 + 4)/100); // Kesseldruck
           }
           free(pRet5);
           }
          
           char* pRet6 = httpget("192.168.0.85:8080","/user/var/120/10251/0/0/12242"); // Puffer C
           if ((pRet6 != NULL) && (*pRet6 != 0))
           {
           char* p6 = strstrskip(pRet6,"advTextOffset=");
           if (p6 != NULL)
           {
           setoutput(6,atof(p6 + 4)/10); // Puffertemperatur Ist C
           }
           free(pRet6);
           }
          
           sleeps(60);
           }
          ​

          Kommentar

          • Labmaster
            Lox Guru
            • 20.01.2017
            • 2574

            #6
            Ich könnte mir Denken, daß Loxone mittlweile Task abschießt die zuviel Zeit am Stück brauchen.

            Erst im sleeps werden andere Tasks im Miniserver wieder ausgeführt.

            Du hast da 7 http Requests am Stück hintereinander wo bei jedem auf dessen ergebnis gewartet wird.

            Einzelne Abschnitte zwischen sleeps sollten wirklich immer so knapp und kurz wie nur möglich sein.

            Kannst ja mal einafch ausprobieren indem du zwischen jedem Request ein kurzes Sleep von z.B. 9s machst anstatt dem 60s nach allen.


            Kommentar

            • darkrain
              MS Profi
              • 25.08.2015
              • 553

              #7
              Der Programmcode läuft bei mir soweit ohne Probleme, hab bei mir nur mal andere URLs genommen. War mein Testserver M1 und mit V13.1. Könnte mir jetzt auch nur vorstellen, das es ein Timeingproblem ist. Prüf auch mal, ob deine Webschnittstelle schnell genug antwortet. Bei meinen Codeblöcken habe ich alle URLs aus dem Code verbannt und wo es geht auf virtuelle HTTP Eingänge gesetzt. Muss ich mit Chars arbeiten, dann gehe ich den Weg über ein separates Webscript, was das schon für mich erledigt.

              Kommentar

              • guido4096
                Dumb Home'r
                • 11.10.2015
                • 18

                #8
                There is a potential memory leak:
                pRet.. should always be deleted if not null. This condition (*pRet0 != 0) prevents freeing pRet in case an empty string is returned.

                So just write it like below. removing the test for (*pRet0 != 0). And that should fix the possible memory leak.

                Code:
                // write program here in PicoC
                // read webpage from 192.168.0.85:8080 (every 60 seconds + time of request)
                
                printf("Start Abfrage Loxone webservices");
                while(TRUE)
                {
                
                char* pRet0 = httpget("192.168.0.85:8080","/user/var/40/10241/0/0/12197"); // Aussentemperatur C
                if (pRet0 != NULL)
                {
                  char* p0 = strstrskip(pRet0,"advTextOffset=");
                  if (p0 != NULL)
                  {
                    setoutput(0,atof(p0 + 4)/10); // Aktuelle Aussentemperatur C
                  }
                  free(pRet0);
                }​
                ...
                Zuletzt geändert von guido4096; 05.11.2022, 10:36.

                Kommentar

                • easyf
                  Dumb Home'r
                  • 18.09.2015
                  • 10

                  #9
                  Zitat von Labmaster
                  Ich könnte mir Denken, daß Loxone mittlweile Task abschießt die zuviel Zeit am Stück brauchen.

                  Erst im sleeps werden andere Tasks im Miniserver wieder ausgeführt.

                  Du hast da 7 http Requests am Stück hintereinander wo bei jedem auf dessen ergebnis gewartet wird.

                  Einzelne Abschnitte zwischen sleeps sollten wirklich immer so knapp und kurz wie nur möglich sein.

                  Kannst ja mal einafch ausprobieren indem du zwischen jedem Request ein kurzes Sleep von z.B. 9s machst anstatt dem 60s nach allen.

                  Hallo, Das habe ich jetzt mal so umgebaut. Mal sehen was passiert. Wie kann man eigentlich ein Programm wieder aktivieren? Selbst wenn das Coding komplett entfernt wird, bleibt es deaktiviert.

                  Kommentar

                  • Labmaster
                    Lox Guru
                    • 20.01.2017
                    • 2574

                    #10
                    Ich würde einen neuen Program Baustein anlegen und dort den Code rein kopieren.
                    guido4096​ hat im übrigen auch mit den Pointern recht, auch das gehört geändert.

                    Kommentar

                    Lädt...