Re: [vyřešeno] předávání dat
Řešil jsem to: http://forum.merenienergie.cz//viewtopic.php?id=259, zřejmě asi jediné možné a mě fungující je to posílat přes sys 140-147.
SDS PLC/PAC: Měření Energie & OnlineTechnology.cz
Network Monitoring System - SDS - Síťový Dohledový Systém
Nejste přihlášen. Přihlaste se, nebo se zaregistrujte.
SDS PLC/PAC: Měření Energie & OnlineTechnology.cz » SDS-MICRO (LM) - light » [vyřešeno] předávání dat
Chcete-li přispívat, musíte se přihlásit nebo projít procesem registrace.
Řešil jsem to: http://forum.merenienergie.cz//viewtopic.php?id=259, zřejmě asi jediné možné a mě fungující je to posílat přes sys 140-147.
Na http://wiki.merenienergie.cz/index.php/ … le_control je to popsáno.
Díky
Přesto nabyla by krátká ukázka programu čtení z jiného SDS ?
Ano, použít http_get() :
Příklad. SDS č. 1 je 192.168.1.100 a SDS č.2 je 192.168.1.200. Z SDS č.1 chceme číst data (čte je SDS č. 2).
http_get(192,168,1,100,'192.168.1.100','/get_sys[123]');
Výsledek je pak podle nastavení v ram[] nebo text[].
Z SDS lze do druhého SDS také zapisovat hodnoty.
http_get(192,168,1,100,'192.168.1.100','/sdscep?sys140=20');
Toto nastaví sys[140] na hodnotu 20.
Pozor však na rozsah funkce sdscep (viz WiKi).
Na začátku je v sys[76] nastaven port 333 na kterém běží druhé zařízení. Pokud běží na portu 80 zaremujte. sys[77] nastavuje vystup do text[]. Zápisem hodnoty do už.proměnné sys[140] bude zobrazena její hodnota (po F5...viz popis v programu).
init
{
sys[76]=333;
sys[77]=2;
echo ('Test http_get do jineho SDS zarizeni.');
echo ('Pozor. Jelikoz http_get bezi na pozadi, neni ihned videt odpoved.');
echo ('Refresh(F5) provede ale take opetovne odeslani stranky - tedy je vse spusteno znovu');
echo ('V normalnim provozu vse ridi c-prog. tam zadny F5 nebude - nereste to.');
}
get
{
echo('http_get()');
http_get(192,168,1,251,'192.168.1.251','/get_sys[',sys[140],']');
sys[140]=0;
//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
echo('Server hlasi 200 OK');
goto final;
label chyba_www_serveru:
//obsluha chyby - www server
echo('Chyba, www server nedostupny nebo nevratil 200 OK - konkretni http kod je: ',sys[75]);
goto final;
label final:
//vypis dat
echo (text[0]);
}
main
{
if (sys[140]>0){
echo('sys140->', sys[140]);
get();
}
}
Díky to je to co jsem potřeboval.
Dobrý den
Podařilo se někomu vůbec přenést údaje z jednoho SDS do druhého ?
Mě se teda nic nedaří, ať zkouším co zkouším, tak se mě nic nemění.
Do jednoho SDS nahraju ten program nahoře.
Kde na druhém SDS-ku dostanu ten údaj ze sys[140], také do sys[140], nebo někam jinam ?
Prosím o radu, sedím na tom cca týden, večer co večer a nedaří se mi :-(
Ano, sice ještě řeším některé problémy, ale z registru do vybraného registru to chodí.
Je o tom poměrně dost tady:
http://forum.merenienergie.cz//viewtopic.php?id=129
Pozor na verzi firmware - s hodně starýma verzema ( cca rok) jsem měl nějaké problémy.
Ano, děkuji za nakopnutí, příklad funguje a konečně jsem to snad pochopil. Já jsem pořád lezl do uživatelských sys a něco tam hledal :-). V sobotu a neděli má pršet, tak se snad dostanu k programování na delší dobu. Děkuji ještě jednou.
Tak jsem stvořil nějaké demo na téma přenos údaje (napětí na AD1) z jednoho sds na druhé
Mám to odladěné na dvou SDS, jedno je micro, druhé je macro s lcd displejem.
Kódy samozřejmně kde kdo pozná použil jsem vše co jsem tady na fóru našel.
Děkuji všem tady na fóru za pomoc a za objasnění problémů, zejména krevlovi :-) za nalezení vlákna na fóru. Nejsem žádný programátor, jenom si tak hraju se zařízeními a toto zařízení mě docela dostalo. Tak malou a chytrou krabičku jsem ještě neviděl. Děkuji výrobcům, programátorům a Všem co se na projektu SDS podílejí. Skvělá práce.
1) V prvním sds je tento program
/*
PROGRAM NA ODESILANI DAT Z JEDNOHO SDS DO DRUHEHO SDS.
1.SDS-ko IP 192.168.1.250:443
TOTO SDS odesola data do druheho SDS (IP 192.168.1.252:333)
*/
var _vstupad; //index S0 vstupu
var _konstad; //prepoctova konst S0 vstupu
var _ramad; //index ram pole
var _pomad; //pomocna
ad
{
_vstupad=431; //ad hodnoty sys[431], sys[432], sys[433], sys[434]
_konstad=436; //konstanty ad sys[436], sys[437], sys[438], sys[439]
_ramad=50; //kam se budou psat hodnoty (ja jsem nastavil ram[50]
label _ad_1:
//AD
_pomad=sys[_vstupad]*100000/sys[_konstad]; //3205 jako 3.205 V
ram[_ramad]=_pomad; //schovat akt.napeti
_vstupad++;
_konstad+=4;
_ramad++;
if (_vstupad<435) goto _ad_1;
}
main
{
ad();
}
2) V druhém SDS je tento program
/*
PROGRAM NA PRIJEM DAT Z JEDNOHO SDS DO DRUHEHO SDS.
2.SDS-ko IP 192.168.1.252:333
TOTO SDS prijima data od prvniho SDS (IP 192.168.1.250:443)
*/
var a;
test
{
sys[76] = 443; // port 1-SDS (192.168.1.250:443)
sys[77] = 1;
echo(' ');
echo('HTTP GET...');
//druhe SDS je 192.168.1.250 -> a z tohoto ctu
http_get(192,168,1,250,'192.168.1.250','/get_ram[50]?rn=4'); // jaky ram na vysilacim SDS nastavim, takovy na prijimacim SDS taky nastavim
goto cekam_na_http;
//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))
{
echo('Chyba komunikace s www serverem ',sys[65],', http: ', sys[75]);
return;
};
echo('PRIJEM ', sys[75],': ram[0]=',ram[0]);
echo(' ');
a = 1;
echo('poz : ram[poz]');
smycka:
echo(a,' : ', ram[a]);
text[a] = ram[a];
a = a+1;
if (a <= ram[0]) goto smycka;
echo(' ');
echo(' PRIJEM : ');
echo(text[1]);
}
main
{
echo('Start programu.');
opakovat:
test();
//pockame 5 sec
sys[64] = 5; //prijimam data kazdych 5 sekund
label cekej:
if (sys[64] != 0) goto cekej;
//znovu
goto opakovat;
}
3) V druhém SDS je tato uživatelská html stránka
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<TITLE>SDS-MACRO </TITLE>
<TITLE>Verze milion.1 ze dne 26.4.2013 21:00 hod</TITLE>
<META content="text/html; charset=windows-1250" http-equiv=Content-Type>
<META content="jaromir.lastovicka" name=author>
<META content="sds-macro, sds-micro, sds, macro, micro, onlinetechnology, csphone" name=keywords>
<META content="sds-macro, sds-micro, sds, macro, micro, onlinetechnology, csphone" name=description>
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="0"> <STYLE title=currentStyle type=text/css media=screen>
body {
font-family:verdana, arial, sans-serif; font-size:12px;
word-wrap:break-word; background:#000; padding:20px;
}
a {text-decoration:none;color:#FEFEA3;}
a:hover {text-decoration:none;color:#FEFEA3;}
#header {color:#aaa}
#footer {clear:both; padding-top:30px;}
#footer p {color:#3366CC;}
#footer a {color:#FEFEA3;}
#footer a:hover {text-decoration:none;}
h1 {font-size:18px; margin:0; padding-bottom:10px; color:#ddd;}
h2 {font-size:15px; margin:0; padding-bottom:5px; color:#3366CC;}
fieldset.rs232 {
border:1px solid #777;
margin: 0px 0px 22px 0px;
padding: 0px 0px 10px 10px;
color:#fff;
text-align:right;
}
fieldset {
border:1px solid #777;
margin: 0px 0px 20px 0px;
padding: 0px 10px 10px 10px;
color:#fff;
text-align:left;
}
legend {
margin-left: 0px;
padding: 0.2em 0.5em;
border:1px solid #777;
color:#0cc;
font-size:14px;
font-weight:bold;
}
</STYLE>
<!--[if lte IE 7]>
<style type="text/css">
body {word-wrap:break-word;}
#outer2 {float:left; display:inline; margin-left:10px; margin-right:10px;}
#wrapper {display:inline-block;}
</style>
<![endif]-->
<!--
ad1, ad2, ad3, ad4 - napěťové vstupy
-->
<script type="text/javascript">
var tt;
var pom;
var reqAD=false; //AD a cas
//AD
function reqADComplete(){
if(reqAD.readyState == 4){
if(reqAD.status == 200){
var rE=reqAD.responseText.split("|");
document.getElementById("ad1").innerHTML=rE[0]/1000+" V";
}
}
}
//smycka pro nacitani hodnot - timeout 2000
function sdsps(){
reqAD=false;
if(window.XMLHttpRequest){
reqAD=new XMLHttpRequest();
}
else if (window.ActiveXObject){
reqAD=new ActiveXObject("Microsoft.XMLHTTP");
}
//AD
if (reqAD){
reqAD.open("GET", "get_txt[1]?rn=5&rand="+Math.random(), true);
reqAD.onreadystatechange = reqADComplete;
reqAD.send(null);
}
t=setTimeout("sdsps()",1000);
}
var sub=false;
function getSub(){
sub=false;
if(window.XMLHttpRequest){
sub=new XMLHttpRequest();
}
else if(window.ActiveXObject){
sub=new ActiveXObject("Microsoft.XMLHTTP");
}
}
function reqSetComplete(){
if(sub.readyState==4){
if(sub.status==200){;}
}
}
</script>
</head>
<body onLoad="sdsps();">
<div id="toppanel">
<div id="header">
<h1>Pokus o přenos ad hodnoty z jednoho SDS-ka na druhé SDS-ko</h1>
<h3>První SDS-ko 192.168.1.250:443</h3>
<h3>Druhé SDS-ko 192.168.1.252:333</h3>
</div>
<div id="control">
<fieldset>
<legend>Analogová hodnota AD1</legend>
<h2>Baterie</h2>
<p class=col1>AD1 Napětí baterie<label class=col2 id="ad1">0.00 V</label></p>
</fieldset>
</div> <!-- control -->
</div> <!-- toppanel -->
<div id="bottpanel">
<div id="tempa">
</div>
</div> <!-- bottpanel -->
<div id="footer">
<div class="content">
<p>Copyright ©2012 onlinetechnology <a href="http://www.onlinetechnology.cz" title="sds-micro">onlinetechnology.cz</a></p>
<p>Copyright ©2012 onlinetechnology <a href="http://www.merenienergie.cz" title="sds-micro">merenienergie.cz</a></p>
<p>Copyright ©2012 onlinetechnology <a href="http://www.eportal.merenienergie.cz" title="eportal.merenienergie">grafy a výsledky měření na eportal.merenienergie.cz</a></p>
<p>Ostrovní elektrárny <a href="http://www.ostrovnielektrarny.cz" title="ostrovnielektrarny">Materiál na ostrovní elektrárny</a></p>
</div>
</div>
<!-- end footer -->
</body>
</html>
Pokročil jsem trochu s pokusem získávání surových dat z MPPT tristar pomocí http_get.
Dostal jsem se ale do mrtvého bodu
Když odesílám dotaz z prohlížeče tak to vypadá takto (teplota heatsinku)
odešlu: http://192.168.1.251:1111/MBCSV.cgi?ID= … &RLO=1
dostanu výsledek: 1,4,2,0,27 (to je 27 °C)
Pokud to pošlu pomocí SDS tak
odešlu: http_get(192,168,1,251,'192.168.1.251','/MBCSV.cgi?ID=1&F=4&AHI=0&ALO=35&RHI=0&RLO=1');
dostanu výsledek: PRIJEM 200: ram[0]=0 (nulová hodnota do ram)
Myslím si, že problémem jsou oddělovače hodnot (čárky) a SDS očekává (|).
Nemáte někdo nápad jak to elgentně vyřešit ?
Protože ten tristar je na portu 1111, je potřeba nejprve nastavit sys[?] na hodnotu 1111, před voláním http_get().
Samotný zápis tak jak je v příspěvku (38) je v pořádku.
SDS neočekává nějaké konkrétní znaky, ty | se používají jen v demo html stránkách... data které SDS obdrží po zavolání http_get() si zpracuje SDS-C program jakkoli chce.
sys[76] mám samozřejmně nastaven na hodnotu 1111 před tím než volám http(get). Budu hledat chybu někde jinde.
Takže tristar pořád odolává, nedaří se mi.
Pro pořádek uvádím celý kód programu a odpověď v CONSOLE.
SDS-MACRO IP 192.168.1.252:333
TRISTAR IP 192.168.1.251:1111
Čučím do toho od převčera, nic mě nenapadá. Kdyby někdo náhodou něco zahlédl co by bylo špatně nebo měl někdo nápad co s tím, tak napište, Díky.
/*
PROGRAM NA PRIJEM DAT Ze zařízení MPPT TRISTAR.
TOTO SDS MACRO ma IP 192.168.1.252:333
SDS MACRO prijima data od MPPT TRISTAR (IP 192.168.1.251:1111)
*/
var a;
test
{
sys[76] = 1111; // port MPPT TRISTAR (192.168.1.251:1111)
sys[77] = 1;
sys[78] = 32;
echo(' ');
echo('HTTP GET...');
//MPPT TRISTAR je 192.168.1.250 -> a z tohoto ctu
http_get(192,168,1,251,'192.168.1.251','/MBCSV.cgi?ID=1&F=4&AHI=0&ALO=35&RHI=0&RLO=1');
goto cekam_na_http;
//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))
{
echo('Chyba komunikace s www serverem ',sys[65],', http: ', sys[75]);
return;
};
echo('PRIJEM ', sys[75],': ram[0]=',ram[0]);
echo(' ');
a = 1;
echo('poz : ram[poz]');
smycka:
echo(a,' : ', ram[a]);
text[a] = ram[a];
a = a+1;
if (a <= ram[0]) goto smycka;
echo(' ');
echo(' PRIJEM : ');
echo(text[1]);
}
main
{
echo('Start programu.');
opakovat:
test();
//pockame 5 sec
sys[64] = 5; //prijimam data kazdych 5 sekund
label cekej:
if (sys[64] != 0) goto cekej;
//znovu
goto opakovat;
}
odpověď console:
CONSOLE:
Start programu.
HTTP GET...
PRIJEM 200: ram[0]=0
poz : ram[poz]
1 : 0
PRIJEM :
Zajímavé je, že pokud data vyčítám z PHP scriptu spuštěného na mém PC (Apache WWW server), který vyčítá data s tristaru, tak vše funguje jak má.
Můžete udělat záchyt pomocí Wiresharku, a to záchyt komunikace mezi Tristarem a PC ?
Pro další postup je potřeba vidět všechny pakety, které se mezi zařízeními vymění.
Chcete-li přispívat, musíte se přihlásit nebo projít procesem registrace.
SDS PLC/PAC: Měření Energie & OnlineTechnology.cz » SDS-MICRO (LM) - light » [vyřešeno] předávání dat