2 regels veroorzaken 1 tot 2 reboots per dag

Software vragen voor ESP chip familie
Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 25 Jan 2021, 00:42

Ik ben erachter gekomen dat 2 regels in mijn code 1 soms 2 x per dag een reboot veroorzaken.

Ik snap alleen niet waarom.

ik lees dus waardes (actuele opbrengst in watt) in van een modbus over tcp server (Solaredge inverter voor zonnepanelen), 1 is de daadwerkelijk waarde (uint16_t) en de andere is de scale factor (idem uint16_t).

ik heb nu een work-arround die foutloos zonder reboots werkt (versie 0.75 zie script). Maar het is natuurlijk niet netjes zoals het hoort .....

De scalefactor is in het begin al als globale variabele gedefinieerd als float omdat dit vereist is voor de pow() functie.
Nu viel mij al zowiezo op dat 1 reboot altijd plaats vond aan het einde van de opbrengst, dus als de waarde richting 0 ging.

Kan iemand mij vertellen wat er fout is aan de 2 regels die ik uitgeschakeld heb (staat //0.75 removed achter)?

Ik kan helaas niet het hele scripts plaatsen (>2000 regels ....)

Code: Alles selecteren
      if (!debugmodus) {
      //Reading some registers
      //Current power
      registervalue = regvalue[40084-register_start]; //registervalue is uint16_t
      //scalefactor = regvalue[40085-register_start]; //scalefactor is float //0.75 removed
      //if (scalefactor > 32768) {scalefactor = (65536 - scalefactor) * -1;} //scalefactor must be -2, -1, 0, 1, 2 //0.75 removed
      scalefactor = 0;//0.75 added
      if (regvalue[40085-register_start] == 65532) {scalefactor = -4;} //0.75 added
      if (regvalue[40085-register_start] == 65533) {scalefactor = -3;} //0.75 added
      if (regvalue[40085-register_start] == 65534) {scalefactor = -2;} //0.75 added
      if (regvalue[40085-register_start] == 65535) {scalefactor = -1;} //0.75 added
      if (regvalue[40085-register_start] == 0) {scalefactor = 0;} //0.75 added
      if (regvalue[40085-register_start] == 1) {scalefactor = 1;} //0.75 added
      if (regvalue[40085-register_start] == 2) {scalefactor = 2;} //0.75 added
      if (regvalue[40085-register_start] == 3) {scalefactor = 3;} //0.75 added
      if (regvalue[40085-register_start] == 4) {scalefactor = 4;} //0.75 added
      current[Daypart] = round(registervalue * pow(10.0,scalefactor)); //current[x] is uint16_t
      strCurrent = String(current[Daypart]);
      if (maxtoday<current[Daypart]) {maxtoday = current[Daypart];} //Set maximum of the day.
      }
sudo rm -rf /
(Don't Drink and Root)

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor Gij Kieken » 25 Jan 2021, 10:10

In die regel probeer je een negatief getal op te slaan in een (2-byte enkel positieve getallen) formaat.
Ofwel kun je kiezen voor een beter getal formaat ofwel zal je moeten casten.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor shooter » 25 Jan 2021, 15:17

40085 is een int terwijl er ook float in de regel staan, ofwel de compiler moet maar uitzoeken welk formaat de getallen staan. oplossing is om eerst netjes alles in het juiste formaat te zetten. of alles in INT is beter en sneller, want een float heeft lang niet de precisie.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 25 Jan 2021, 16:15

Hoi Gij,

waar dan? De scalefactor is al gedefinieerd als float en mag dus negatief zijn.

volgens "de regels van pow()" moest base en exponent een float zijn en is de uitkomst een double

(volgt iemand het nog?)

de uitkomst (double) zet ik m.b.v. round() in de current[x] (uint16_t)

er komt dus geen negatief getal in de uint16_t (current) maar het wordt berekend met pow()

10^-2 is dus *0.02
10^3 is dus *1000
10^5 is dus *100000
10^0 is dus *1

23867 * 10^-2 = 238.67 -> round -> 239
23867 * 10^-1 = 2386.7 -> round -> 2387

de crashes ( exception 28 en soms 29) treden dus echt aan het begin en het eind op, ik vermoed als dus bij een héééél laag vermogen en bij een scalefactor van -5 of nog kleiner .....
sudo rm -rf /
(Don't Drink and Root)

Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 25 Jan 2021, 16:21

Hoi Shooter, ik moest voor scalefactor voor float kiezen omdat op internet stond dat het moest voor de pow() functie.

Wellicht een tussenvariabele gebruiken omdat ik ban ben in geval van 65535 het resultaat een breuk wordt....

volgens de modbus regels is de SF een 16-bit register van-32768 tot 32767 ....

als ik tijdelijk een int variabel maak, kan ik dan een uint16_t naar de tijdelijke int verplaatsen? en hoe doe ik dat, met shiftbits?

en kan ik daarna de int omzetten naar de float van scalefactor?

of zouden de regels van pow() gewoon onzin zijn en kan ik daarvoor gewoon de int gebruiken als exponent?

Wellicht zoals dit?
Code: Alles selecteren
      uint16_t temp_sf_uint16 = regvalue[40085-register_start]; //scalefactor is float //0.75 removed

      int temp_sf_int = 0;
      if (temp_sf_uint16 > 32768) {temp_sf_int = (65536 - temp_sf_uint16) * -1;} else {temp_sf_int = temp_sf_uint16;}



en kan ik daarna scalefactor (wat float is) = temp_sf_int; ?????

of zoals?
Code: Alles selecteren
scalefactor = temp_sf_int *1.0;
sudo rm -rf /
(Don't Drink and Root)

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor shooter » 25 Jan 2021, 21:27

elk getal dat ik in je programma zie kun je beter definieren:
int getal1=65535;
en zo voor elk getal doen dan worden ze ook niet door de compiler verbouwd, maar worden uit je prog gehaald als variabelen.
Wil overigens niet zeggen dat dan alles goed is, want er zijn processoren waar rekenfouten ingebakken zitten.
verzetten van een notatie kan zeker, gebruik dan conversion.
bijvoorbeeld int getal1 = int (65535) dat is voor de compiler duidelijk.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor Gij Kieken » 25 Jan 2021, 22:00

Het is verwarend wat je zegt,ik citeer
"en de andere is de scale factor (idem uint16_t)."
In je code ,
"/if (scalefactor > 32768) {scalefactor = (65536 - scalefactor) * -1;}"
door te vermenigvuldigen met -1 wil je een negatief getal in een uint16_t steken.
@shooter int is toch een range van -32,768 to 32,767

Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 26 Jan 2021, 00:56

hmmm, idd foutje van mij in 1e bericht, nee, scalefactor is float. Excusez moi.

int is volgens mij signed dus met + en - en gaat dus van -32768 tot 32767

het bepalen van tussen de 32768-65535 is dus om te bepalen of de scalefactor negatief is. eigenlijk zoeiets als uint16_t naar int .....

het zou ook mss met map() kunnen, maar dat moet ik nog uitzoeken hoe dat werkt.

In ieder geval heb ik de code veranderd. Ik moet het een paar dagen testen om te weten of het nu werkt.

De reset kans is voornamenlijk bij het beginnen van de grafiek (zon komt net op, zonnepanelen beginnen eerste watt-jes te produceren of mss zelfs nog tussen de 0 en 1 watt ...) en bij het einde van de grafiek.

Mocht de test mislukken zal de club van kale mensen er een lid bij gaan krijgen .....

Code: Alles selecteren
      if (!debugmodus) {
      //Reading some registers
      //Current power
      registervalue = regvalue[40084-register_start]; //registervalue is uint16_t

      uint16_t temp_sf_uint16 = regvalue[40085-register_start];
      int temp_sf_int = 0;
      if (temp_sf_uint16 > 32768) {temp_sf_int = (65536 - temp_sf_uint16) * -1;} else {temp_sf_int = temp_sf_uint16;}
      scalefactor = temp_sf_int*1.0;

      current[Daypart] = round(registervalue * pow(10.0,scalefactor)); //current[x] is uint16_t
      strCurrent = String(current[Daypart]);
      if (maxtoday<current[Daypart]) {maxtoday = current[Daypart];} //Set maximum of the day.
      }



***temp_sf_uint16/int is bedoeld als "temporary scale factor" en heeft niks met temperatuur te maken ....

wat betreft Shooter:
"bijvoorbeeld int getal1 = int (65535) dat is voor de compiler duidelijk."

int kan volgens mij NOOIT 65535 zijn, (-32768 -> 32767 )
vreemd voorbeeld int naar int????
waarom zou je een int gedefinieerde variabele nog eens vertellen dat het int is?
Bedoel je mss int getal1 = uint16_t(65535) (wat dan uiteindelijk -1 of 32767 moet zijn)
sudo rm -rf /
(Don't Drink and Root)

Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 26 Jan 2021, 09:38

p.s.
1 regel veranderd.

Code: Alles selecteren
scalefactor = float(temp_sf_int*1.0);
sudo rm -rf /
(Don't Drink and Root)

Gebruikers-avatar
Berichten: 55
Geregistreerd: 22 Sep 2016, 21:21

Re: 2 regels veroorzaken 1 tot 2 reboots per dag

Berichtdoor rene7777 » 27 Jan 2021, 23:48

===update ====

het lijkt er op dat het probleem niet ligt bij de variabelen en berekening van de scale factor.

het is alleen de regel waarbij de power (tot de macht van) wordt berekend ... pow()

ik heb nu gewoon 7 if...then regels geschreven waarbij ik gewoon de registervalue met waardes vermenigvuldig met 0.001 .... 0.01 .... 0.1 ....1 .....10 etc. etc.

het ziet er tot nu toe goed uit, nof gg 48 uur eens testen .....

Dan zou het toch gek zijn met die pow() functie .....
sudo rm -rf /
(Don't Drink and Root)

Volgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten