Autor Zpráva
jtfcobra
Profil
Dotaz na výpočet impulzů z dne v PHP.

Jde mi o to že když dojde maximum impulzu na meraku např. 65xxx tak to jde znovu od nuly jak to spočítat kolik je za celý den máte někdo nápad?


00:00:00    0
00:45:09    1448
01:15:18    2459
01:45:25    3469
02:15:31    4466
02:45:38    5469
03:15:45    6465
03:45:51    7469
04:15:58    8480
04:46:05    9503
05:16:12    10526
05:46:18    11550
06:16:25    12565
06:46:32    13567
07:16:38    14570
07:46:45    15592
08:16:52    16599
08:46:59    17675
09:17:05    19299
09:47:12    20914
10:17:19    22531
10:47:25    24149
11:17:32    25756
11:47:39    27475
12:17:46    29099
12:47:52    30839
13:17:59    32909
13:48:06    35629
14:18:12    38522
14:48:19    41511
15:18:26    44508
15:48:33    47523
16:18:39    50525
16:48:46    53536
17:18:53    56463
17:49:00    58274
18:19:06    59606
18:49:13    60698
19:19:20    61797
19:49:26    62790
20:19:33    63785
20:49:40    64783
21:19:47    248
21:49:53    1247
22:20:00    2249
22:50:07    3238
23:20:13    4223
23:50:20    5213
23:59:00    5213
juriad
Profil
Prostě budeš počítat, kolikrát se to protočilo.
<?php
function get_max($file) {
        $rows = file($file);

        $cycles = 0;
        $previous = -1;
        foreach ($rows as $row) {
                list($time, $value) = explode('    ', $row);
                $value = intval($value); # převedení na číslo
                if ($value < $previous) {
                        $cycles++;
                }
                $previous = $value;
        }

        return $cycles * 65536 + $value;
}

echo get_max('input.txt');
jtfcobra
Profil
Jaky bude vysledek tak jak jsi to napsal?

To bude jen pocet otocnei

nebo to bude 65xxx + 5213 ?

Moc děkuji za radu
juriad
Profil
V tomto případě je to 70749.
To číslo 65xxx je s vysokou pravděpodobností 65536 = 2^16, tedy jde o obyčejné aritmetické přetečení.

Ale, koukám, že to nevychází, asi tam je nějaká chybka.
Opraveno, přidán 9. řádek.
jtfcobra
Profil
Takle to mam do ted nactu zacatek a konec dne ale nenacitam vse jak to udelat abych spocital ty impulzy z celeho dne cca 48 zaznamu?

Moc diky


  <?php // Zacatek dne
$macadresa=  $_GET["mac"];
$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$qr=mysql_query("SELECT * FROM merenisystem.quido WHERE DATE(DATUM) = DATE(NOW()) AND `MAC` LIKE '%".$macadresa."%' ORDER BY ID ASC LIMIT 0,1",$db);
$rows=mysql_num_rows($qr);
while($data=mysql_fetch_array($qr)){  
$caszacatek=$data["CAS"];
$datumzacatek=$data["DATUM"];
$impulzyzacatek1=$data["VSTUP1"];
$impulzyzacatek2=$data["VSTUP2"];
$impulzyzacatek3=$data["VSTUP3"];
$impulzyzacatek4=$data["VSTUP4"];
$impulzyzacatek5=$data["VSTUP5"];
$impulzyzacatek6=$data["VSTUP6"];
$impulzyzacatek7=$data["VSTUP7"];
$impulzyzacatek8=$data["VSTUP8"];
$impulzyzacatek9=$data["VSTUP9"];
$impulzyzacatek10=$data["VSTUP10"];
$impulzyzacatek11=$data["VSTUP11"];
$impulzyzacatek12=$data["VSTUP12"];
$impulzyzacatek13=$data["VSTUP13"];
$impulzyzacatek14=$data["VSTUP14"];
$impulzyzacatek15=$data["VSTUP15"];
$impulzyzacatek16=$data["VSTUP16"];
$impulzyzacatek17=$data["VSTUP17"];
$impulzyzacatek18=$data["VSTUP18"];
$impulzyzacatek19=$data["VSTUP19"];
$impulzyzacatek20=$data["VSTUP20"];
}
?>
  
Zacatek dne OK</p>
<p>
  <?php // Konec dne
$macadresa=  $_GET["mac"]; 
$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$qr=mysql_query("SELECT * FROM merenisystem.quido WHERE DATE(DATUM) = DATE(NOW()) AND `MAC` LIKE '%".$macadresa."%' ORDER BY ID DESC LIMIT 0,1",$db);
$rows=mysql_num_rows($qr);
while($data=mysql_fetch_array($qr)){  
$caskonec=$data["CAS"];
$datumkonec=$data["DATUM"];
$impulzykonec1=$data["VSTUP1"];
$impulzykonec2=$data["VSTUP2"];
$impulzykonec3=$data["VSTUP3"];
$impulzykonec4=$data["VSTUP4"];
$impulzykonec5=$data["VSTUP5"];
$impulzykonec6=$data["VSTUP6"];
$impulzykonec7=$data["VSTUP7"];
$impulzykonec8=$data["VSTUP8"];
$impulzykonec9=$data["VSTUP9"];
$impulzykonec10=$data["VSTUP10"];
$impulzykonec11=$data["VSTUP11"];
$impulzykonec12=$data["VSTUP12"];
$impulzykonec13=$data["VSTUP13"];
$impulzykonec14=$data["VSTUP14"];
$impulzykonec15=$data["VSTUP15"];
$impulzykonec16=$data["VSTUP16"];
$impulzykonec17=$data["VSTUP17"];
$impulzykonec18=$data["VSTUP18"];
$impulzykonec19=$data["VSTUP19"];
$impulzykonec20=$data["VSTUP20"];
}
?>
jtfcobra
Profil
Mám to takle je to dobrý nebo to mám nějak upravit

Ale problém je že třeba na začátku to má číslo 32939 v 0:01:00 takze jak to napsat aby to cetlo prvni cislo a pak se to z toho odecetlo


         <?php

function get_max($file) {
        $rows = file($file);
 
        $cycles = 0;
        $previous = -1;
        foreach ($rows as $row) {
                list($time, $value) = explode(',', $row);
                $value = intval($value); # převedení na číslo
                if ($value < $previous) {
                        $cycles++;
                }
                $previous = $value;
        }
 
        return $cycles * 65536 + $value;
}

$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$hledat=  $_GET["mac"];
$hledat2=  $_GET["merak"];
$datum= $_GET["rok"]."-". $_GET["mesic"]."-".$_GET["den"];
$result = mysql_query("SELECT * FROM merenisystem.quido WHERE `MAC` = '".$hledat."'  AND `DATUM` LIKE '%".$datum."%'",$db);
$radku = mysql_num_rows($result);

printf("<table border=0 width=350px>\n<tr>\n");
printf("<td></td><td></td></tr>\n");
printf("<td bgcolor='#FF9900'><font color='black'>Datum,ulozeni</td><td bgcolor='#FF9900'><font color='black'>Cas,ulozeni</td><td bgcolor='#FF9900'><font color='black'>Impulzu</td></tr>\n");

$soubor=fopen("data.txt", "w+");
//$soubor = fopen("data.txt", "a+");

for($i=0;$i<$radku;$i++)
{
printf("<td bgcolor='#FFDAB9'> %s</td>\n",
mysql_result($result,$i,"datum"));
printf("<td bgcolor='#FFEFD5'> %s</td>\n",
mysql_result($result,$i,"cas"));
$cas = mysql_result($result,$i,"cas");
if ($hledat2 == 'VSTUP1') { $text = $cas.",".mysql_result($result,$i,"vstup1")."\n"; }
fwrite($soubor, $text);
if ($hledat2 == 'VSTUP1') { printf("<td bgcolor='#FFDAB9'> %s</td></tr>\n", mysql_result($result,$i,"vstup1"));}
}
fclose($soubor);
mysql_close($db);
printf("<td></td><td></td></tr>\n");

echo get_max('data.txt');
?>
jtfcobra
Profil
juriad:
Ahoj mohl by jsi mi poslat na sebe kontakt financne bych ti poslal odmenu a prosim o radu
juriad
Profil
jtfcobra:
Zdejšímu fóru se věnuji ve volném čase, nežádám za své odpovědi odměnu. V dohledné době však nebudu mít skoro žádný čas.
Zkusím ti to upravit.
juriad
Profil
<?php
$db = mysql_connect('localhost', 'root', 'root');
mysql_select_db('test', $db);

$hledat = $_GET["mac"];
$datum = $_GET["rok"] . "-" . $_GET["mesic"] . "-" . $_GET["den"];

# Jakého typu je sloupec DATUM? Jak v něm vypadají data?
# Správně by měl být typu DATETIME a žádný sloupec ČAS nemá existovat
$result = mysql_query("SELECT * FROM quido WHERE `MAC` = '" . mysql_real_escape_string($hledat) . "'  AND `DATUM` LIKE '%" . $datum . "%'", $db);
#$result = mysql_query("SELECT * FROM quido", $db);

echo <<<END
<table border="0" width="350px">
    <thead>
        <tr>
            <td>Datum,ulozeni</td>
            <td>Cas,ulozeni</td>
            <td>Impulzu</td>
        </tr>
    </thead>
    <tbody>
END;

$prvni = TRUE;
$zacatek = 0;
$minule = -1;
$cyklu = 0;
while(($row = mysql_fetch_assoc($result)) !== FALSE) {
    if ($prvni) {
        $prvni = FALSE;
        $zacatek = $row['vstup1'];
    }
    if ($row['vstup1'] < $minule) {
        $cyklu++;
    }
    $minule = $row['vstup1'];
    
    $pocet = $cyklu * 65536 + $row['vstup1'] - $zacatek;
    echo <<<END
        <tr>
            <td>$row[datum]</td>
            <td>$row[cas]</td>
            <td>$pocet</td>
        </tr>
END;
}
echo <<<END
    </tbody>
</table>
END;

?>

Pro tabulku v databázi:
+----------+------------+--------+
| cas      | datum      | vstup1 |
+----------+------------+--------+
| 12:28:29 | 2014-07-08 |  14417 |
| 12:28:44 | 2014-07-08 |  43926 |
| 12:28:49 | 2014-07-08 |  45310 |
| 12:28:54 | 2014-07-08 |  29233 |
| 12:28:57 | 2014-07-08 |  10236 |
| 12:29:00 | 2014-07-08 |  29019 |
| 12:29:03 | 2014-07-08 |  48848 |
| 12:29:06 | 2014-07-08 |  26112 |
| 12:32:31 | 2014-07-08 |  49554 |
+----------+------------+--------+

Vrátí tabulku:
<table border="0" width="350px">
    <thead>
        <tr>
            <td>Datum,ulozeni</td>
            <td>Cas,ulozeni</td>
            <td>Impulzu</td>
        </tr>
    </thead>
    <tbody>        <tr>
            <td>2014-07-08</td>
            <td>12:28:29</td>
            <td>0</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:28:44</td>
            <td>29509</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:28:49</td>
            <td>30893</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:28:54</td>
            <td>80352</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:28:57</td>
            <td>126891</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:29:00</td>
            <td>145674</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:29:03</td>
            <td>165503</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:29:06</td>
            <td>208303</td>
        </tr>        <tr>
            <td>2014-07-08</td>
            <td>12:32:31</td>
            <td>231745</td>
        </tr>    </tbody>
</table>
Všimni si, že počet se postupně sčítá a že první řádek má nulu.

Vím, že máš v databázi tabulku jiného tvaru, ale nevyznám se v tom bambiliony sloupců, nejspíš je úplně špatně navržená.
jtfcobra
Profil
Mohl by jsi mi prosim poslat na sebe mail abych ti poslal přístup do DB?


No mam to takto

Mac, Datum Cas Vstup 1 Vstup 2
xxx, 1.1.2014 12:00 0 0
xxx, 1.1.2014 12:01 50 80
xxx, 1.1.2014 12:00 985 300
xxx, 1.1.2014 12:00 65536 0
xxx, 1.1.2014 12:00 0 0
xxx, 1.1.2014 12:00 1 0
xxx, 1.1.2014 12:00 2 0



Ale kdyz to udelam takto:

Tak po každé když je tam nul tak se přičte 65536 a fakt nevim co s tím

<?php // Vypocet impulzu celeho dne

function get_max($file) {
        $rows = file($file);
 
        $cycles = 0;
        $previous = -1;
        foreach ($rows as $row) {
                list($time, $value) = explode(',', $row);
                $value = intval($value); # převedení na číslo
                if ($value < $previous) {
                        $cycles++;
                }
                $previous = $value;
        }
 
        return $cycles * 65536 + $value;
}




$macadresa=  $_GET["mac"];
$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$result=mysql_query("SELECT * FROM merenisystem.quido WHERE DATE(DATUM) = DATE(NOW()) AND `MAC` LIKE '%".$macadresa."%' AND CAS > TIME('00:09:00') ",$db);
$radku = mysql_num_rows($result);
//$qr=mysql_query("SELECT * FROM merenisystem.quido WHERE DATE(DATUM) = DATE(NOW()) AND `MAC` LIKE '%".$macadresa."%' ",$db);
$soubor1=fopen($_GET["mac"]."data1.txt", "w+");
$soubor2=fopen($_GET["mac"]."data2.txt", "w+");
$soubor3=fopen($_GET["mac"]."data3.txt", "w+");
$soubor4=fopen($_GET["mac"]."data4.txt", "w+");
$soubor5=fopen($_GET["mac"]."data5.txt", "w+");
$soubor6=fopen($_GET["mac"]."data6.txt", "w+");
$soubor7=fopen($_GET["mac"]."data7.txt", "w+");
$soubor8=fopen($_GET["mac"]."data8.txt", "w+");
$soubor9=fopen($_GET["mac"]."data9.txt", "w+");
$soubor10=fopen($_GET["mac"]."data10.txt", "w+");

for($i=0;$i<$radku;$i++)
{ 
$cas=mysql_result($result,$i,"CAS");
$datumzacatek=$data["DATUM"];
$text1 = $cas.",".mysql_result($result,$i,"VSTUP1")."\n";
fwrite($soubor1, $text1);
$text2 = $cas.",".mysql_result($result,$i,"VSTUP2")."\n";
fwrite($soubor2, $text2);
$text3 = $cas.",".mysql_result($result,$i,"VSTUP3")."\n";
fwrite($soubor3, $text3);
$text4 = $cas.",".mysql_result($result,$i,"VSTUP4")."\n";
fwrite($soubor4, $text4);
$text5 = $cas.",".mysql_result($result,$i,"VSTUP5")."\n";
fwrite($soubor5, $text5);
$text6 = $cas.",".mysql_result($result,$i,"VSTUP6")."\n";
fwrite($soubor6, $text6);
$text7 = $cas.",".mysql_result($result,$i,"VSTUP7")."\n";
fwrite($soubor7, $text7);
$text8 = $cas.",".mysql_result($result,$i,"VSTUP8")."\n";
fwrite($soubor8, $text8);
$text9 = $cas.",".mysql_result($result,$i,"VSTUP9")."\n";
fwrite($soubor9, $text9);
$text10 = $cas.",".mysql_result($result,$i,"VSTUP10")."\n";
fwrite($soubor10, $text10);

}
fclose($soubor1);
fclose($soubor2);
fclose($soubor3);
fclose($soubor4);
fclose($soubor5);
fclose($soubor6);
fclose($soubor7);
fclose($soubor8);
fclose($soubor9);
fclose($soubor10);

echo "1: ".get_max($_GET["mac"].'data1.txt')." !</br>";
echo "2: ".get_max($_GET["mac"].'data2.txt')." !</br>";
echo "3: ".get_max($_GET["mac"].'data3.txt')." !</br>";
echo "4: ".get_max($_GET["mac"].'data4.txt')." !</br>";
echo "5: ".get_max($_GET["mac"].'data5.txt')." !</br>";
echo "6: ".get_max($_GET["mac"].'data6.txt')." !</br>";
echo "7: ".get_max($_GET["mac"].'data7.txt')." !</br>";
echo "8: ".get_max($_GET["mac"].'data8.txt')." !</br>";
echo "9: ".get_max($_GET["mac"].'data9.txt')." !</br>";
echo "10: ".get_max($_GET["mac"].'data10.txt')." !</br>";
$impulzykonec1=get_max($_GET["mac"].'data1.txt');
$impulzykonec2=get_max($_GET["mac"].'data2.txt');
$impulzykonec3=get_max($_GET["mac"].'data3.txt');
$impulzykonec4=get_max($_GET["mac"].'data4.txt');
$impulzykonec5=get_max($_GET["mac"].'data5.txt');
$impulzykonec6=get_max($_GET["mac"].'data6.txt');
$impulzykonec7=get_max($_GET["mac"].'data7.txt');
$impulzykonec8=get_max($_GET["mac"].'data8.txt');
$impulzykonec9=get_max($_GET["mac"].'data9.txt');
$impulzykonec10=get_max($_GET["mac"].'data10.txt');

?>
Vypocet impulzu OK</p>
<p>
jtfcobra
Profil
Tak prosím o radu zkoušel jsem od www.cem1.cz/cron2015_vypadek.php?mac=00204AF39358&rok=2015&mesic=01&den=15

juriad a bohuzel nefunguje prosim o radu kdo by mnel nejaky typ


Přikládám ukázku z celého dne kde potřebuji vypočítat ty impulzy počítadlo umí 65536 impulzu a pak se přehopne od začátku

je tam vidět vypadnutí elektriky a výmaz impulzu a znova od zacatku 10:42 čas


http://cem1.cz/ukazka.pdf


Poradíte?
Alphard
Profil
jtfcobra [#11]:
Jaká je aktuální verze kódu? Ten půl roku starý [#10] je ošklivý, tam ty proměnné 1 až 10 doporučuji přepsat do dalšího cyklu.
jtfcobra
Profil
Alphard:
Poslal by jsi mi na sebe mail poslal bych ti cele PHP?pokud by to šlo a pomohl by jsi mi to vyřešit?
Alphard
Profil
jtfcobra [#13]:
Nebudu z toho dělat chat, ani řešit problémy soukromě, cítil bych pak nějaké závazky a mám dost jiné práce...
Je možné uvést kontakt, případně i nějakou odměnu a umístit inzerát do Prací a zakázek. Pokud vás tato možno zaujala, nezakládejte duplicity, ale napište sem potřebné informace a já to přesunu.
jtfcobra
Profil
Zasilam zdrojovy kod:
www.cem1.cz/cron2015.txt

DB:

http://cem1.cz/ukazka.pdf


Pokud by to slo nejak napsat v cyklech abych tam nemel takovy paskvil bylo by to super.
Za kazdou radu jsem rad...
Alphard
Profil
jtfcobra [#15]:
Takhle se nedořešíte ani za dalšího půl roku. Když už by vám někdo chtěl pomoci a věnovat tomu čtvrt hodiny, tak mu nepřehledná databáze v pdf znepříjemní jakékoliv snahy. Lepší by bylo vyexportovat tu tabulku do SQL podoby a tu dát k dispozici. Z SQL exportu je 1. zřejmá struktura a 2. stylem copy&paste lze za 5 sekund vytvořit testovací prostředí.
jtfcobra
Profil
Děkuji za radu připravím to

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0