Elin Programování Mosaic 21. 4. 2021 15:18 21. 4. 2021 9:04

Dobrý den,

prosím o pomoc s vyčítáním hodnot ze zařízení SDS-MINI (http://www.onlinetechnology.cz). Mám na něm připojen elektroměr a vodoměr. Zařízení čte impulzy a poskytuje stav čítače v různé podobě. Jednou je XML, který obsahuje více hodnot v jednom dotazu. Formát xml ale nenačítá korektně fb fbXmlPageParser přímo ze zažízení (http://192.168.100.99/s0.xml?p=0). Čtení se "sekne" ve struktuře s02 - viz přiložený soubor.  Ručně načtený soubor sice lze zpracovat fb fbXmlFileParser. Nechtěl jsem toto ale takto řešit opakovaným stahováním souboru a jeho zpracováním. Proto jsem hledal jinou možnost. Pokusil jsem se to tedy řešit http dotazem ( např. http://192.168.100.99/getsys[494] ) přímo na jednu hodnotu, kterou jedinou potřebuji číst. Tento dotaz ale zase neumím převést na číslo v Mosaicu. Používám pro čtení fb fbHttpRequestL2, spojení funguje, data se přenášejí do buferu THttpBuffer, kde reprezentuji první znaky. Nenačítá se mi ale korektně délka a pak také nevím, jakou funkci použít na převod na číslo do proměnné. Přikládám ukázku čtení z linuxu pomocí wget a také ukázku z Mosaicu. Mohu poskytnout i celý projekt, ale běz zařízení by to asi stejně nešlo ladit. Případně jakou jinou metodu čtení použít?  JSON formát to neposkytuje. Dále to umí jen SNMP.

Děkuji za radu. 

S pozdravem Radek Novotný   

Odpovědi 2

M.B. 20. 4. 2021 14:40

Dobrý den,
zkusil jsem zaslaný xml soubor nahrát na webový server a přepársovat pomocí funkčního bloku fbXmlPageParser z knihovny XmlLibEx 2.0 a nezaznamenal jsem žádné chyby. Máte volání bloku uzavřené v cyklu REPEAT...UNTIL XmlParser.break END_REPEAT; ? Tento cyklus je důležitý, protože blok musí vypársovat všechny tagy, které mu přišli v daný cyklus komunikací, aby bylo možné další cyklus přijmout nová data, jak je naznačeno v příkladu v helpu.
Co se týká druhého řešení, blok fbHttpRequestL2 ve chvíli, kdy přijme data nastaví výstup DataReady na TRUE a v DataLen je kolik dat komunikací dorazilo. Obecně můžou data přijít i na několikrát, ale ve Vašem případě lze předpokládat, že krátká data dorazí najednou a nebude je potřeba skládat do proměnné, která vy sloužila jako mezipaměť.

V takovém případě stačí:

VAR
    HttpRequest : fbHttpRequestL2;
    recvData : THttpBuffer;
    numString : STRING;
    recvNumber : REAL;
END_VAR

...

IF HttpRequest.DataReady THEN
  MemcpyPtr0(length := MIN(80,UINT_TO_UDINT(HttpRequest.DataLen)), source := ADR(recvData), dest := ADR(numString));
  recvNumber := STRING_TO_REAL(numString);
END_IF;


 

 

Elin 21. 4. 2021 9:04

Dobrý den,

vyřešeno. Převod MemcpyPtr0 mi funguje. Moc děkuji za radu. XML jsem znovu netestoval, ale věřím, že by to také asi šlo uchodit. Pokud bude fungovat bez problémů druhé řešení, tak je pro mě dostačující co se týče získaných informací. 

 

Tento dotaz je vyřešený.