Vai al contenuto

Lettura oggetto JSON da file

Home Forum Programmazione IEC 61131 (LogicLab) Lettura oggetto JSON da file

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #60322
    Anonimo
    Inattivo

    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 ?

    #60324
    Sergio Bertana
    Amministratore del forum

    Da 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.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.