Libreria gestione stringhe json

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

Home Forum Controllori SlimLine e Netsyst (LogicLab) Libreria gestione stringhe json

Questo argomento contiene 6 risposte, ha 3 partecipanti, ed è stato aggiornato da  Sergio Bertana 7 mesi, 1 settimana fa.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #45516

    Riccardo Lucatuorto
    Partecipante

    Salve avrei intenzione di usare i prodotti slimline per controllare il riscaldamento di casa.

    Dovrei usare 3 o 4 cpu collegate via rete e far dialogare tutto via protocollo MQTT, mi chiedevo se esiste la possibilità di fare il parsing di stringhe json tramite librerie già fatte e non scrivendo tutto il codice io a mano, non vorrei reinventare la ruota insomma:

    Eventualmente esistono formati dati da usare via MQTT usabili in LogicLab?

    #45518

    Sergio Bertana
    Amministratore del forum

    In MQTT non ci sono formati particolari, solitamente si usano stringhe di testo oppure come vuoi fare tu stringhe in formato JSON.

    Nella libreria eLLabRESTSvcLib (Scaricabile da qui) trovi oltre al blocco funzione per la gestione del servizio REST anche i FB per la codifica e decodifica JSON (Estratto manuale).

    Per lo scambio dati tra sistemi sia in rete locale che su Internet dai una occhiata alla libreria eLLabDataExchLib (Vedi topic), che pò essere una alternativa all’MQTT, sopratutto non necessita di un broker ed il trasferimento dei dati è pressochè in tempo reale.

    #45519

    Riccardo Lucatuorto
    Partecipante

    Grazie per la risposta, quindi con i blocchi JSONEncode e JSONDecode posso preparare i messaggi da inviare via MQTT che quelli in ingresso.

    In generale sono abbastanza orientato su MQTT perchè è un paradigma che conosco e che uso già in altre parti, in più non devo preoccuparmi quando invio un messaggio di avere un canale aperto con il PLC, concettualmente mi pare più semplice sia come gestione che come configurazione.

     

    #45521

    Sergio Bertana
    Amministratore del forum

    Si con la JSONEncode puoi creare stringhe JSON da inviare come publisher verso il broker, in pratica ad ogni chiamata del FB accodi alla stringa risultato una coppia nome/valore.

    Con la JSONDecode invece puoi estrarre da una stringa JSON ricevuta dal broker come subscriber il valore della variabile di cui definisci il nome. Se la variabile con quel nome non esiste nella stringa JSON oppure è di tipo diverso (Tu cerchi una stringa mentre la variabile è numerica) viene ritornato errore.

    Ma se per condividere dati verso altri sistemi l’MQTT è la soluzione migliore, per lo scambio dati tra sistemi SlimLine sia per velocità che per facilità di uso consiglio la libreria eLLabRESTSvcLib. Anche se comprendo che essendo usuale l’utilizzo di una tecnica a volte si è restii a cambiare, ma nel cambiamento a volte si scoprono nuove opportunità.

    #45522

    Riccardo Lucatuorto
    Partecipante

    In generale i vari PLC non comunicheranno tra di loro, sarà il sistema centrale (probabilmente un raspberry) ad inviare i messaggi su MQTT con i circuiti da aprire, sul PLC voglio tenere meno logica possibile, giusto quella per la sicurezza tipo non accendo la pompa se non ho almeno un circuito aperto.

    Inoltre avevo intenzione di far pubblicare ad ogni PLC un messaggio circa ogni minuto con lo stato, in modo da verificare se ci sono problemi e se tutto sta andando come previsto. Inoltre su uno dovrò leggere escrivere due slave Modbus, ed inviare al sistema centrale i dati letti.

     

     

    #46330

    Stefano
    Partecipante

    Ho provato ad usare la funzione JSONDecode per decodificare una stringa json che mi ritorna un inverter fronius che riporto qui sotto:

    {
    “Body” : {
    “Data” : {
    “Inverters” : {“1” : { “DT” : 81, “E_Day” : 4132, “E_Total” : 5225190, “E_Year” : 77704.703125, “P” : 1303}},
    “Site” : {“E_Day” : 4132, “E_Total” : 5225190, “E_Year” : 77704.703125, “Meter_Location” : “unknown”, “Mode” : “produce-only”,”P_Akku” : null,”P_Grid” : null, “P_Load” : null, “P_PV” : 1303, “rel_Autonomy” : null, “rel_SelfConsumption” : null},
    “Version” : “11”}
    },
    “Head” : {
    “RequestArguments” : {},
    “Status” : {“Code” : 0, “Reason” : “”, “UserMessage” : “”},”Timestamp” : “2019-01-10T11:38:56+01:00”}
    }

    Se non erro purtroppo, in questo caso, la libreria non funziona per due limiti, il primo e’ il newline che c’e’ dopo l’ultima graffa (ho il dubbio sugli altri newline) e il secondo sono le definizioni annidate, in particolare io avrei voluto leggere: “Body.Data.Inverters.1.P” ma non sono riuscito, sbaglio sintassi?

    Nel mio caso, volevo solo leggere la potenza prodotta istantanea, ho risolto in modo meno pulito anche se piu’ efficente: con una  ricerca  di sottostringa (‘”P” :’) e una scanf ho recuperato il valore.

    #46419

    Sergio Bertana
    Amministratore del forum

    La funzione JSONDecode al momento non è in grado di gestire oggetti JSON annidati, i caratteri di newline e gli spazi non sono un problema.

    La soluzione che hai trovatoe è la migliore, con la funzione SysStrFind cerchi il campo che ti interessa e poi con la funzione SysVarsscanf ne acquisisci il valore.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)

Devi essere loggato per rispondere a questa discussione.