1 Naposledy upravil: technomagg (2015-12-11 18:26:14)

Téma: pomoc s desetiným místem v programu

Dobrý den,

trápím se s jedním bugem v programu a neumím to dát dohromady, mám toto:

Je to pro přepočet proudu z napětí aplok modulu na čidle když je proudu blízký nule je napětí 4,647V, tento vzorec to přepočítá na proud.

vzorec                                                    výsledek       / poznámka
Ram 62 = 4647                                                                  naměřené napětí na čidle x1000        
ram[65] = ram[62] * 255;                      1184985            násobič        
ram[66] = ram[65] – 1180800;        185                   odečet koeficientu        
ram[67] = ram[66] /10                        18,5                Výsledek – toto to má naměřit hodnota x1000
ram[68] = ram[67] / 1000;            0                před desetinou čárkou        
Ram[68] = ram[67] % 1000;            185                PROBLEM - za desetinou řárkou        
                        
            0,0185    MĚLO BY TO ZOBRAZIT TOTO        
            0,185    ALE ZOBRAZÍ TO TOTO:

neumím to opravit, jakmile je hned za desetiným místem první nula a až pak další hodnoty tak jsem v koncích a program ukazuje nesmysly (respektive nulu vynechá a ukáže první další číslo což je hodně špatně, pokud je první za desetinou čárkou cokoliv jiného (1-9) tak to ukazuje korektně.

Děkuji za případnou radu.

2

Re: pomoc s desetiným místem v programu

Hoď sem ten kód celý a beze změn- hlavně to jak to zobrazuješ. Tenhle kód s komentáři už taky není v pořádku - na třetím řádku nemá být 18,5 ale tu pětku to dělení zahodí.  A dále zbytek po celočíselném dělení 1000 nebo  10000 (čísla menšího než 1000) bude vždy stejný - ten posun řádku při zobrazení musíš provést ty.

3

Re: pomoc s desetiným místem v programu

krome zapomenuteho stredniku za ram[67] = ram[66] /10 ;  nic dalsiho nevidim.



honza

4

Re: pomoc s desetiným místem v programu

odesli_data
{
var elektromer1_odecet;
var elektromer2_odecet;
var elektromer3_odecet;
var elektromer1_vykon;
var elektromer2_vykon;
var elektromer3_vykon;



   elektromer1_odecet = sys[493];
   ram[1] = elektromer1_odecet / 1000; //pred desetinou carkou
   ram[11] = elektromer1_odecet % 1000; //za desetinou carkou

   elektromer2_odecet = sys[494]; 
   ram[2] = elektromer2_odecet / 800; //pred desetinou carkou
   ram[12] = elektromer2_odecet % 1000; //za desetinou carkou

   elektromer3_odecet = sys[495]; 
   ram[3] = elektromer3_odecet / 1000; //pred desetinou carkou
   ram[13] = elektromer3_odecet % 1000; //za desetinou carkou

   elektromer1_vykon = 3600000 / sys[592]; 
   ram[4] = elektromer1_vykon; 

   elektromer2_vykon = 4500000 / sys[593];
   ram[5] = elektromer2_vykon;

   elektromer3_vykon = 3600000 / sys[594]; 
   ram[6] = elektromer3_vykon;

   ram[7] = ((ram[3] - ram[1]) * 3700) / 1000;  //celkem vyrobena energie za kč

//prezentovaná_hodnota = (SoC_digitální_změrená_hodnota - nulová_konstanta) / (přepočtová_konstanta/100) .

// AD prevodnik 1
ram[50] = sys[431] * 1000;
ram[51] = sys[436] / 100;
ram[52] = ram[50] / ram[51];  // 1000x vetsi hodnota - uzitecne pro vypocty
ram[53] = ram[52] / 1000; // pred desetinou carkou
ram[54] = ram[52] % 1000; // za desetinou carkou

 echo('AD 1 ', ram[53],'.', ram[54], sys[438]);

// AD prevodnik 2

ram[60] = sys[432] * 1000;
ram[61] = sys[440] / 100;
ram[62] = ram[60] / ram[61];  // 1000x vetsi hodnota - uzitecne pro vypocty
ram[63] = ram[62] / 1000; // pred desetinou carkou
ram[64] = ram[62] % 1000; // za desetinou carkou
 echo('AD 2 ', ram[63],'.', ram[64], sys[442]);

// AD prevodnik - vypocet proudu
ram[65] = ram[62] * 255;
ram[66] = ram[65] - 1184800; //1184800
ram[67] = ram[66] / 10;
ram[68] = ram[67] / 1000;
ram[69] = ram[67] % 1000;

// k odeslání do jiné desky patří hodnota ram[67] je to 10000* proud (takze o 4 desetinna mista)

 echo('proud v panelech ', ram[68],'.', ram[69], sys[442]);

// echo('AD 2 ', ram[63],'.', ram[64], sys[442]); //zatim netreba
  
// AD prevodnik 3

ram[70] = sys[433] * 1000;
ram[71] = sys[444] / 100;
ram[72] = ram[70] / ram[71]; // 1000x vetsi hodnota - uzitecne pro vypocty
ram[73] = ram[72] / 1000; // pred desetinou carkou
ram[74] = ram[72] % 1000; // za desetinou carkou

echo('AD 3 ', ram[73],'.', ram[74], sys[446]);

// vypocet druhe poloviny baterie

ram[100] = ram[52] - ram[72];
ram[101] = ram[100] / 1000;
ram[102] = ram[100] % 1000;

echo('druhy blok baterie ma', ram[101],'.', ram[102], sys[438] );

// balancování baterie - výpočet

ram[105] = ram[72] - ram[100];
ram[106] = ram[105] / 1000;
ram[107] = ram[105] % 1000;

echo('baterie je rozbalancovana o', ram[106],'.', ram[107], sys[438] );

// AD prevodnik 4 / zatim vypnuto - netreba

//ram[80] = sys[434] * 1000;
//ram[81] = sys[448] / 100;
//ram[82] = ram[80] / ram[81]; // 1000x vetsi hodnota - uzitecne pro vypocty
//ram[83] = ram[82] / 1000; // pred desetinou carkou
//ram[84] = ram[82] % 1000; // za desetinou carkou

// echo('AD 3 ', ram[83],'.', ram[84], sys[450]);
  
   // ram[20] az ram[24] je vypocet ceny za spotrebovanou energii
   // vypocet ceny za spotrebu po odectu - cenu dopiste do ram[22] vynasobenou 100x
   // ram[20] je stav elektromeru minus pocet pulsu po poslednim odectu
   // ram[21] za deleno je pocet pulsu na KW
   
   ram[20] = elektromer2_odecet - 4405899;
   ram[21] = ram[20] / 8; // pocet pulzu deleno 100
   ram[22] = ram[21] * 302; // 3.02 kc za / kwh - cena X 100
   ram[23] = ram[22] / 10000; // vydelime 10000
   ram[24] = ram[22] % 10000; //za desetinou carkou

dns_resolv('api.thingspeak.com');
 
 //pockam az probehne funkce do konce
label cekam_na_dns:
 if (sys[65] == 0) goto cekam_na_dns; 
 //otestujeme úspěch DNS překladu
 if (sys[65] == 512) goto mam_dns_preklad;
 
 //neuspech
 return;

label mam_dns_preklad: 

  
  // TADY upravit za /update?key= vas api key
 http_get(sys[66],sys[67],sys[68],sys[69], 'api.thingspeak.com''/update?key=tady davam api&field1=',ram[1]'.'ram[11], '&field2=', ram[2]'.'ram[12], '&field3=', ram[3]'.'ram[13], '&field4=', ram[4], '&field5=', ram[5], '&field6=', ram[6], '&field7=', ram[7], '&field8=', ram[23]'.'ram[24]);
   echo('odeslano');
 //pockam az probehne funkce do konce
label cekam_na_http:
 if (sys[65] == 0) goto cekam_na_http; 
 
 //pokud server má problém:
 if ((sys[65] != 1024)||(sys[75] != 200)) goto chyba_www_serveru;
 
 //neni problem, takze ok - napiseme na konzoli
 echo('OK.');
 
 //vse hotovo
 return;  
 
label preskocit_protoze_chyba_DNS:
 
 echo('DNS err ', sys[65]);
 
 return;  
 
label chyba_www_serveru:
 //obsluha chyby - www server
 
 echo('http err ', sys[75]);
 
  
}  

odesli_data2
{
dns_resolv('api.thingspeak.com');

 //pockam az probehne funkce do konce
label cekam_na_dns2:
 if (sys[65] == 0) goto cekam_na_dns2;
 //otestujeme úspěch DNS překladu
 if (sys[65] == 512) goto mam_dns_preklad2;

 //neuspech
 return;

label mam_dns_preklad2:


  // TADY upravit za /update?key= vas api key
 http_get(sys[66],sys[67],sys[68],sys[69], 'api.thingspeak.com''/update?key=tady davam API&field1=',ram[105]);
   echo('odeslano2');
 //pockam az probehne funkce do konce
label cekam_na_http2:
 if (sys[65] == 0) goto cekam_na_http2;

 //pokud server má problém:
 if ((sys[65] != 1024)||(sys[75] != 200)) goto chyba_www_serveru2;

 //neni problem, takze ok - napiseme na konzoli
 echo('OK2.');

 //vse hotovo
 return;

label preskocit_protoze_chyba_DNS2:

 echo('DNS err2 ', sys[65]);

 return;

label chyba_www_serveru2:
 //obsluha chyby - www server

 echo('http err2 ', sys[75]);


}
main
{
  echo('start');

label opakovat:  
  echo('opakuji');

 odesli_data();
 odesli_data2();

//pockame 5 sekund (lze zde upravit)
sys[64] = 5;
label cekej:
if (sys[64] != 0) goto cekej;

//znovu
goto opakovat;

}

}

5

Re: pomoc s desetiným místem v programu

Není to provokace ale myslím to vážně :-)
tvůj řádek echo('proud v panelech ', ram[68],'.', ram[69], sys[442]);
nahraď řádkem
echo('proud v panelech ', ram[67],'mA', sys[442]);

Ta konverze čísla s desetinou tečkou na  text je zde vzhledem k nedostatku textových funkcí poměrně náročná. Problém je že např 123%1000, 123%10000 či mod 123%100000 je vždy stejných 123 a ty úvodní nuly za tečkou by jsi tam musel přidávat např. dalšími testy v cyklech, nebo zápisem čísla to textového pole a posun jednotlivých znaků doprava s doplěním tečky,...