pokud by nekoho zajimal zdrojak..
T
// Program pro odesilani informaci na portal.merenienergie.cz
// JM vypocitava virtualni celkovy (3fazovy) elektromer
// zobrazuje na interni HTML strance
// nove: 1/4hod vypocet posledni hod hodnoty L1-L3 /jemnejsi rozliseni/
// popis promennych, zapis do 4-S0 /sys[469] - kvuli zobrazeni na eportal
// pridan virtualni cas mezi pulsy - ram[99]
// pridany ram[16-19] max hodnoty fazi
// ochrana aktualnich vykonu v ram[21-23] < 10kW /45A/
// omezeni echo vypisu /kratsi udaje,cas na jednom radku/
// ochrana aktualniho vykonu pred chybnym udajem , sys[592-4] = 0
// reset max hodnot odberu pomoci sys[149] = 1
// zmena odesilanych hodnot na portal - misto akt.vykonu max ve 1/4 hod..RAM[95-98]]
// vypocet mn.vody v bojleru, pouziva ram[9] jako temp a ram[15] jako vystup v litrech
// posledni uprava 3.10.2016 vypocet mn. vody v bojleru (ram[15])
// *********** upozorneni **************
// echotime pouziva RAM[0-5]
// portal pouziva RAM[100-110]
// pokud se bude pouzivat dalsi http_get, e-mail, atd., pozor na timeouty pro dobehnuti GETu
// pozor na pouzivani sys[64] odpocitavani casu - muze dojit k omezeni funkce portalu
// ******* promenne k portalu **********
var _portal_vstup; //index S0 vstupu
var _portal_konst; //prepoctova konst S0 vstupu
var _portal_ram; //index ram pole
var _portal_pom; //pomocna
var _portal_dns; //je dostupny preklad dns
var _portal_data; //typ odesilanych dat
var _portal_timeout; //timeout pro odesilani dat
var _portal_timeoutget; //timeout pro chybu serveru
var _portal_timeoutdns; //timeout pro dns_resolve
// ******* vase promenne sem **********
var thishour; //flag že tuhle hod už procedury proběhly
var thismin;
// ******* globalni procedury **********
echotime
{
ram[0]=sys[8] / 10;
ram[1]=sys[8] % 10;
ram[2]=sys[9] / 10;
ram[3]=sys[9] % 10;
ram[4]=sys[10] / 10;
ram[5]=sys[10] % 10;
//echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5]);
}
// ******* procedury portalu **********
odesli_data_na_portal
{
if (_portal_timeoutget==0) goto odesli_data_na_portal_get; //odeslat data
//pred odeslanim dat zkontrolovat zda nebezi predchozi pozadavek
if (sys[65]==0 && _portal_timeoutget>=sys[3]) goto odesli_data_na_portal_end; //jeste bezi, ale mam cas delam neco jineho
if (_portal_timeoutget<sys[3]) goto odesli_data_na_portal_chyba; //uz neni cas - chyba
if ((sys[65]!=1024) || (sys[75] != 200)) {
goto odesli_data_na_portal_chyba;
} else {
if (_portal_data==1) {
echotime();
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' S0 odeslano na server, OK.');
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5]':', ram[95]':', ram[96]':', ram[97]':', ram[98],);
}
if (_portal_data==2) {
echotime();
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' Temp A odeslano na server, OK.');
}
_portal_data++;
_portal_timeoutget=0;
if (_portal_data>4) {
_portal_timeout=sys[3]+90000; //interval
_portal_data=0; //vynulovat
goto odesli_data_na_portal_end;
}
}
label odesli_data_na_portal_get:
if (_portal_dns==1) {
//mam dns
if (_portal_data==1) { //sys[595] nahrazeno ram[99] JM24112015 ; sys[592-595] nahrazeno ram[95-98] max hodnota v 1/4 hod
// http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', sys[592], '&av2=', sys[593], '&av3=', sys[594], '&av4=', ram[99], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);
http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', ram[95], '&av2=', ram[96], '&av3=', ram[97], '&av4=', ram[98], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);
//nulovani 1/4 hod maxim
ram[95] = 3600000; // max odber ve 1/4hodine L1
ram[96] = 3600000; // max odber ve 1/4hodine L2
ram[97] = 3600000; // max odber ve 1/4hodine L3
ram[98] = 3600000;
}
if (_portal_data==2) {
http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datatemp.php?ver=1&line=a&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t1=', sys[310], '&t2=', sys[311], '&t3=', sys[312], '&t4=', sys[313], '&t5=', sys[314], '&t6=', sys[315], '&t7=', sys[316], '&t8=', sys[317], '&t9=', sys[318], '&t10=', sys[319], '&t11=', sys[320], '&t12=', sys[321], '&t13=', sys[322], '&t14=', sys[323], '&t15=', sys[324], '&t16=', sys[325]);
}
} else {
//nemam dns
if (_portal_data==1) {
http_get(77,93,211,207,'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', sys[592], '&av2=', sys[593], '&av3=', sys[594], '&av4=', sys[595], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);
}
if (_portal_data==2) {
http_get(77,93,211,207,'eportal.merenienergie.cz','/datatemp.php?ver=1&line=a&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t1=', sys[310], '&t2=', sys[311], '&t3=', sys[312], '&t4=', sys[313], '&t5=', sys[314], '&t6=', sys[315], '&t7=', sys[316], '&t8=', sys[317], '&t9=', sys[318], '&t10=', sys[319], '&t11=', sys[320], '&t12=', sys[321], '&t13=', sys[322], '&t14=', sys[323], '&t15=', sys[324], '&t16=', sys[325]);
}
}
_portal_timeoutget=sys[3]+1500; //15sekund pro potvrzeni ze serveru
goto odesli_data_na_portal_end;
label odesli_data_na_portal_chyba:
echo(' Chyba komunikace s www serverem, http: ', sys[75]);
_portal_timeout=sys[3]+90000; //interval
_portal_data=0; //vynulovat
_portal_timeoutget=0; //vynulovat
_portal_timeoutdns=0; //vynulovat
label odesli_data_na_portal_end:
}
portal_nastav
{
_portal_timeout=0; //zrovna se odesilaji data
_portal_timeoutget=0; //vynulovat timeout predchozich get pozadavku
_portal_timeoutdns=0; //vynulovat timeout predchoziho dns resolveru
_portal_dns=0; //nemam dns
_portal_data=1;
}
portal_dns
{
if (_portal_timeoutdns==0) {
echotime();
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv()');
dns_resolv('eportal.merenienergie.cz');
_portal_timeoutdns=sys[3]+1500; //15sek timeout
}
if (sys[65] == 512) {
echotime();
echo (ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv() OK:', sys[65]);
_portal_dns=1;
return;
}
if (_portal_timeoutdns<sys[3]) {
echotime();
echo (ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv() chyba:', sys[65]);
_portal_dns=2;
}
}
// ******* moje procedury **********
virtualni_elektromer_3f // virtualni elmer - pocita z 3x jednofazovy elektromer
{
// pouzite promenne ram
// ram[20]= celkovy odber 3 faze /v kWh/
// ram[21]= hodnota aktualniho odberu L1
// ram[22]= hodnota aktualniho odberu L2
// ram[23]= hodnota aktualniho odberu L3
// ram[24] = aktualni odber ve vsech fazich
// temp ram[31-33]
// ram[99] = virtualni cas mezi pulsy /msec/
ram[31] = sys[592]; // vypocet casu elektromer L1
if (sys[625] > ram[31] && ram[31] > 100 ) {
ram[31] = sys[625];
}
if (ram[31] < 3600000){
ram[21] = 3600000/ram[31];
}
else
{
ram[21] = 0 ; // mene nez 1 Watt
}
ram[32] = sys[593]; // vypocet casu elektromer L2
if (sys[626] > ram[32] && ram[32] > 100) {
ram[32] = sys[626];
}
if (ram[32] < 3600000){
ram[22] = 3600000/ram[32];
}
else
{
ram[22] = 0 ; // mene nez 1 Watt
}
ram[33] = sys[594]; // vypocet casu elektromer L3
if (sys[627] > ram[33]&& ram[33] > 100) {
ram[33] = sys[627];
}
if (ram[33] < 3600000){
ram[23] = 3600000/ram[33];
}
else
{
ram[23] = 0 ; // mene nez 1 Watt
}
// --- ochrana aktualniho vykonu pred velkou hodnotou (>10kW)
if (ram[21] > 10000){
ram[21] = 1;
}
if (ram[22] > 10000){
ram[22] = 1;
}
if (ram[23] > 10000){
ram[23] = 1;
}
// vysledne hodnoty
sys[496]= (sys[493]+sys[494]+sys[495]); // zapis hodnoty z elmeru do 4.vstupu S0
ram[20] = (sys[493]+sys[494]+sys[495]) /1000; // celkovy stav elmeru - jen cele kWh
ram[24] = ram[21] + ram[22] + ram[23]; // celkovy odber ve 3 fazich (/10)
if (ram[24] > 1)
{
ram[99] = 3600000 / ram[24]; // vypocet casu pulsu virtualniho elmeru
}
else
{
ram[99] = 3600000; //1 Watt
}
}
// ****************************************************************
spotreba_hodiny // pocita a uklada vzorky kazdou hodinu
{
// pouzite promenne ram
// ram[29] = hodnota 3faz za posledn9 hodinu
// ram[30] = hodnota 3faz za poslednich 24 hod
// temp ram[50-73]
// rotace hodnot pro vypocet spotreby 3f za poslednich 24hod
// aktualizovano kazdou hodinu
//ram[74] = ram[73]; // 24 hod
ram[73] = ram[72];
ram[72] = ram[71];
ram[71] = ram[70];
ram[70] = ram[69];
ram[69] = ram[68];
ram[68] = ram[67];
ram[67] = ram[66];
ram[66] = ram[65];
ram[65] = ram[64];
ram[64] = ram[63];
ram[63] = ram[62];
ram[62] = ram[61];
ram[61] = ram[60];
ram[60] = ram[59];
ram[59] = ram[58];
ram[58] = ram[57];
ram[57] = ram[56];
ram[56] = ram[55];
ram[55] = ram[54];
ram[54] = ram[53];
ram[53] = ram[52];
ram[52] = ram[51];
ram[51] = ram[50];
ram[50] = sys[493]+sys[494]+sys[495]; //aktualni stav
// ----- vypocet hodnoty spotreby za 24 hod-----
if (ram[50] > ram[73]){
ram[30] = ram[50] - ram[73];
}
else
{
ram[30] = 0; // pokud je nesmyslna hodnota nebo neni naplneno
}
//---vypocet spotreby 3f za posledni hodinu-----------------------
//if (ram[50] > ram[51]){
// ram[29] = ram[50] - ram[51];
//}
//else
//{
// ram[29] =0; // pokud je nesmyslna hodnota nebo neni naplneno
//}
// takhle by to stacilo - bude to jemnejsi ve 1/4hod intervalu
// musi byt v 1/4hod
//ram[29] = ram[26] + ram[27]+ ram[28];
//--------------
echotime(); // zapis cas
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' spotreba 24h: ',ram[30],' [Wh]',);
}
//------------------------------------------------------------------------------
spotreba_minuty { // uklada a pocita vzorky kazdou 1/4 hodinu
// pouzite promenne ram
// ram[26] = hodnota L1 za posledni hodinu
// ram[27] = hodnota L2 za posledni hodinu
// ram[28] = hodnota L3 za posledni hodinu
// ram[29] = hodnota 3f za posledni hodinu
// ram[80-83] buffer posledni 1/4 hodiny L1
// ram[85-88] buffer posledni 1/4 hodiny L2
// ram[90-93] buffer posledni 1/4 hodiny L3
//nacteni hodnoty elmer L1
ram[83] = ram[82]; // posunu hodnotu - 4 x 1/4hod
ram[82] = ram[81];
ram[81] = ram[80];
ram[80] = sys[493]; // ulozeni jako aktualni hodnota
if (ram[80] > ram[83]) {
ram[26] = ram[80] - ram[83];
}
else
{
ram[26] =0; // pokud je nesmyslna hodnota nebo neni naplneno
}
//nacteni hodnoty elmer L2
ram[88] = ram[87]; // posunu hodnotu - 4 x 1/4hod
ram[87] = ram[86];
ram[86] = ram[85];
ram[85] = sys[494]; // ulozeni jako aktualni hodnota
if (ram[85] > ram[88]) {
ram[27] = ram[85] - ram[88];
}
else
{
ram[27] =0; // pokud je nesmyslna hodnota nebo neni naplneno
}
//nacteni hodnoty elmer L3
ram[93] = ram[92]; // posunu hodnotu - 4 x 1/4hod
ram[92] = ram[91];
ram[91] = ram[90];
ram[90] = sys[495]; // ulozeni jako aktualni hodnota
if (ram[90] > ram[93]) {
ram[28] = ram[90] - ram[93];
}
else
{
ram[28] =0; // pokud je nesmyslna hodnota nebo neni naplneno
}
// 3-Fazovy elektromer hodnota za posledni hodinu
ram[29] = ram[26] + ram[27]+ ram[28];
//-------------------------------------------
echotime(); // zapis cas
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' L1:',ram[26],' L2:',ram[27],' L3:',ram[28],' 3f:',ram[29],' [Wh].1/4 hod');
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' L1max:',ram[17],' L2max:',ram[18],' L3max:',ram[19],' 3fmax:',ram[16]);
}
//*******B o j l e r ****************
bojler {
// vypocitava ze 2 teplot dostupnou vodu v bojleru
// vystup je v ram[15] - litry vody
// temp je ram[9]
// vstupy v sys[320]-dolni cidlo
// sys[321]-horni cidlo
//vypocet prumeru
ram[9]= sys[321] + sys[320];
ram[9] = ram[9] / 200;
// prumer je vic nez 40st
if (ram[9] > 40){
//ram[15] = ram[9] * 4; //vysledek
ram[15] = 100;
}
//prumer je mene nez 40st,ale horni je vice nez 40st
if (ram[9] < 40){
if(sys[321] > 4000){
//ram[15] = (ram[9] * 4)/3; //vysledek
ram[15] = (ram[9] - 30)*10;
}
}
if (ram[9] < 30){
ram[15] = 1; // je malo teploty
}
// horni teplota je mene nez 40st
if(sys[321] < 4000){
ram[15] = 0;
}
//prekroceni rozsahu,porucha cidla apod..
if(sys[320] > 10000){
ram[15] = 999; //priznak poruchy
}
if(sys[321] > 10000){
ram[15] = 999;
}
//ram[15] = sys[321] / 100; //pro debug
}
// ******* startovaci procedury **********
init
{
echotime();
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' Start programu');
sys[77]=0; //http_get odpovet nechci do ram[]
sys[78]=0; //http_get odpovet nechci do ram[]
_portal_timeout=1; //odeslat data ihned
// ******* uzivatelsky nastavitelne promenne ***********
// ------- init -------
// nastavi aktualni stav,aby po startu byla shoda
thishour= 0; // pocitadlo hodin reset
thismin = 0; // pocitadlo 1/4 hodin
ram[50] = sys[493]+sys[494]+sys[495]; // posledni hod a 24 hod 3f celkovy elmer
sys[496] = sys[493]+sys[494]+sys[495]; //zapis do pocitadla 4. vstupu S0
//ram[74] = ram[50];
ram[73] = ram[50];
ram[72] = ram[50];
ram[71] = ram[50];
ram[70] = ram[50];
ram[69] = ram[50];
ram[68] = ram[50];
ram[67] = ram[50];
ram[66] = ram[50];
ram[65] = ram[50];
ram[64] = ram[50];
ram[63] = ram[50];
ram[62] = ram[50];
ram[61] = ram[50];
ram[60] = ram[50];
ram[59] = ram[50];
ram[58] = ram[50];
ram[57] = ram[50];
ram[56] = ram[50];
ram[55] = ram[50];
ram[54] = ram[50];
ram[53] = ram[50];
ram[52] = ram[50];
ram[51] = ram[50];
spotreba_hodiny();
//-- 1/4 hod ------
ram[80] = sys[493];
ram[81] = ram[80];
ram[82] = ram[80];
ram[83] = ram[80];
ram[85] = sys[494];
ram[86] = ram[85];
ram[87] = ram[85];
ram[88] = ram[85];
ram[90] = sys[495];
ram[91] = ram[90];
ram[92] = ram[90];
ram[93] = ram[90];
spotreba_minuty();
ram[99] = 3600000; //1 Watt
ram[16] = 0; //max hodnota 3f
ram[17] = 0; // max hodnota L1
ram[18] = 0; // max hodnota L2
ram[19] = 0; // max hodnota L3
ram[95] = 3600000; // max odber ve 1/4hodine L1
ram[96] = 3600000; // max odber ve 1/4hodine L2
ram[97] = 3600000; // max odber ve 1/4hodine L3
ram[98] = 3600000; // max odber ve 1/4hodine 3f
ram[13] = 50; // min teplota
ram[14] = -25; //max teplota
}
//------------------------------------------------------------------------------------------
main
{
//odeslani dat na portal v nastaveny interval ---------------------
if (_portal_timeout>0 && _portal_timeout<sys[3]) portal_nastav();
if (_portal_dns==0) portal_dns();
if (_portal_dns!=0 && _portal_data>0) odesli_data_na_portal();
// ------- volani vlastnich procedur sem -------
bojler(); // vypocet mnozstvi vody v bojleru (a 40st C)
virtualni_elektromer_3f(); // vypocet virtualniho 3f elektromeru,
wait(1500);
if (sys[9]==0 && thishour!=sys[8]){ // v kazde hodine v nulte minute sejme vzorek spotreby
spotreba_hodiny();
thishour = sys[8];
}
if (sys[9]==0 ||sys[9]==15 || sys[9]==30 ||sys[9]==45 ){ // v kazde ctvrthodine sejme vzorek spotreby
if(thismin!=sys[9]){
spotreba_minuty(); //kazdou 1/4 hodinu ulozi vzorek
thismin = sys[9];
}
}
// test na nejvyssi hodnotu odberu L1
if (ram[21] > ram[17] ){
ram[17] = ram[21];
}
// test na nejvyssi hodnotu odberu L2
if (ram[22] > ram[18] ){
ram[18] = ram[22];
}
// test na nejvyssi hodnotu odberu L3
if (ram[23] > ram[19] ){
ram[19] = ram[23];
}
// test na nejvyssi hodnotu odberu 3faz
if (ram[24] > ram[16] ){
ram[16] = ram[24];
}
// nejvyssi odber ve 1/4 hod - nejnizsi hodnota casu mezi pulsy
// posila se misto AktualnihoVykonu na portal
if (sys[592] < ram[95] && sys[592] > 1){
ram[95] = sys[592]; // L1
}
if (sys[593] < ram[96] && sys[593] > 1){
ram[96] = sys[593]; // L2
}
if (sys[594] < ram[97] && sys[594] > 1){
ram[97] = sys[594]; // L3
}
if (ram[99] < ram[98] && ram[99] > 1){
ram[98] = ram[99]; // 3faz
}
// zjistovani min a max teploty venkovni
// venkovni = sys[310]
if (sys[310]/100 > ram[14] && sys[310]/100 < 80){
ram[14] = sys[310]/100;
}
if (sys[310]/100 < ram[13] && sys[310]/100 < 80){
ram[13] = sys[310]/100;
}
// reset min a max teplot
if (sys[149] == 2 ){
ram[13] = 50; // min teplota
ram[14] = -25; //max teplota
sys[149] = 0;
}
// RESET HODNOT MAX VYKONU
if (sys[149] == 1 ){
ram[16] = 1;
ram[17] = 1;
ram[18] = 1;
ram[19] = 1;
sys[149] = 0;
echotime(); // vypis na konzoli
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' reset max hodnot');
}
} //-------------------- main end ----------------------------------------------------------------