Home › Forum › Programmazione IEC 61131 (LogicLab) › Lettura oggetto JSON da file
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 2 anni, 10 mesi fa da Sergio Bertana.
-
AutorePost
-
Giugno 16, 2021 alle 10:07 am #60322AnonimoInattivo
Sto usando la funzione:
i:=Sysfread(ADR(doorJSONConf), TO_INT(SIZEOF(doorJSONConf)), 1, Fp);
Dove doorJSONConf è dichiarata come
doorJSONConf : STRING[ 300 ]; (* JSON object *)
Il file originale contiene:
{ "door": 1, "name": "LOC. A", "interlock": 2, "emergency": 2, "privacy": 0, "recovery": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "semaphore": [9,9,210,100,18,82,98,210,210], "to_dooropen": 60, "configure": 1 }
In totale 279 caratteri, leggo però dalla funzione Sysread
'{ "door": 2, "name": "LOC. B", "interlock": 2, "emergency": 2, "privacy": 0, "recovery": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "semaphore": [9,9,210,100,18,82,98,2ѽÃ'
Pur tornandomi 279 come caratteri letti?
Ci sono delle limitazioni sulla stringa da leggere o accorgimenti ?Giugno 16, 2021 alle 10:13 am #60324Sergio BertanaAmministratore del forumDa quello che dici immagino tu stia leggendo da un file su disco, quindi ho provato a fare il semplice programmino JSONFRead (Ecco il download) per verificare la tua situazione. Ma intanto il contenuto del file che tu hai indicato è 236 caratteri e non 279. Ecco il programma che ho realizzato.
// ***************************************************************************** // PROGRAM "JSONFRead" // ***************************************************************************** // Read JSON object from file. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // FILE READ // ------------------------------------------------------------------------- // Wait for a "Read" command. IF NOT(Read) THEN RETURN; END_IF; Read:=FALSE; //Read command // Open the file, exit on error. Fp:=SysFfopen(ADR('D:/JSONObj.json'), ADR('r')); //File pointer IF (Fp = eNULL) THEN RETURN; END_IF; // Read data from file. i:=Sysmemset(ADR(JSONObj), 0, SIZEOF(JSONObj)); RChars:=Sysfread(ADR(JSONObj), TO_INT(SIZEOF(JSONObj)), 1, Fp); //Number of characters read i:=SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('JSONFRead'), ADR(JSONObj)); i:=Sysfclose(Fp); //Close file // [End of file]
Siccome non mi dici come hai fatto a vedere la stringa letta che era corrotta (Posso immaginare che l’hai vista in dfebug da LogicLab) ma essendo molto lunga io ho preferito ritornarla con una SysWrSpyData e visualizzarla nella console di spionaggio ed il mio programma funziona correttamente. Per decodificare l’oggetto JSON letto puoi utilizzare il FB JSONDecode.
Nota che prima di leggere i dati dal file con Sysfread ho eseguito l’azzeramento dell’intera stringa risultato con Sysmemset perchè la prima volta che esegui il programma la stringa è inizializzata a “0” ma dopo aver letto al suo interno si trovano dei dati e se una successiva lettura legge meno dati di quelli presenti non avendo messo il codice tappo “0” di fine stringa tu vedrai i dati letti seguiti dai dati che seguono presenti nella stringa.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.