2 regels veroorzaken 1 tot 2 reboots per dag
14 berichten
• Pagina 1 van 2 • 1, 2
2 regels veroorzaken 1 tot 2 reboots per dag
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 ....)
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)
(Don't Drink and Root)
Advertisement
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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.
Ofwel kun je kiezen voor een beter getal formaat ofwel zal je moeten casten.
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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
shooter@home.nl
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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 .....
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)
(Don't Drink and Root)
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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?
en kan ik daarna scalefactor (wat float is) = temp_sf_int; ?????
of zoals?
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)
(Don't Drink and Root)
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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.
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
shooter@home.nl
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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
"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
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
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 .....
***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)
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)
(Don't Drink and Root)
Re: 2 regels veroorzaken 1 tot 2 reboots per dag
===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 .....
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)
(Don't Drink and Root)
14 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast