Vai al contenuto

Libreria gestione stringhe json

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

Stai visualizzando 13 post - dal 1 a 13 (di 13 totali)
  • Autore
    Post
  • #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 può 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.

    #50975
    Rubox
    Partecipante

    Sto provando le funzioni per le stringhe JSON: quando vado a decodificare una normale stringa composta da tre oggetti non annidati riesco a leggere solo il primo mentre gli altri due no.

    La stringa è del tipo: {“i”:”[email protected]”,”o”:”Oggetto: 12/11/2019″,”m”:”Messaggio email: i valori sono i seguenti”}

    L’indirizzo me lo legge correttamente, gli altri due campi non riesco.

    Lascio la domanda e mi do una risposta sperando che sia quella corretta: Se la stinga che si mette nell’oggetto JSON contiene dei due punti, come per data e ora, oppure come semplice segno di punteggiatura… non funziona la decodifica. Togliendo i “:” e mettendo altri caratteri funziona perfettamente. Nemmeno inserendoli con $3A funziona (c’ho provato…)

    Mi conferma che è così? C’è un modo per inserire i “:” in una stringa contenuta in un oggetto JSON oppure la funzione di decodifica va in palla perché si ritrova delimitatori dove non li gradisce?

    #51030
    Sergio Bertana
    Amministratore del forum

    Ti sei fatto la domanda e ti sei dato la risposta… Bravo…

    Con la libreria attuale c’è questo problema, problema risolto con la nuova versione della libreria eLLabHTTPLib. Come vedi non c’è più la versione dopo il nome… perchè stiamo rivedendo tutte le librerie in funzione del nuovo prodotto SlimLine su Raspberry.

    Da questa versione in avanti utilizzeremo il versioning delle librerie come gestito da LogicLab, la libreria non è ancora rilasciata e non posso rilasciarla, perchè se compili il tuo programma su XTarget_12 con questa nuova libreria avrai delle warnings. Abbiamo fatto anche altre modifiche sugli ENUM di definizione tipi (Vedi manuale).

    Come workaround se mandi un email al supporto chiedendo la nuova libreria te la invio direttamente, utilizzandola dovrai al momento accettare la comparsa di alcune warnings.

    JSONDecode_v2(207) – warning G0065: VType => Destination may be too small to store current result
    JSONDecode_v2(207) – warning G0059: SysVarsscanf => Operand extension

    #58631
    Rubox
    Partecipante

    Volevo segnalare che ho scaricato la libreria Sfr091c020 Libreria HTTP (eLLabHTTPLib) v3.0.20 del 24/11/2020.

    Quando compilo mi da errore S1305 con riferimento eLLabHTTPLib.plclib(63): SysVsnprintf Funzione sconosciuta.

    #58645
    Sergio Bertana
    Amministratore del forum

    Come puoi vedere in questo articolo, tutte le librerie sono state riscritte per avere la compatibilità con l’architettura XUnified, tu probabilmente stai compilando su di un sistema con architettura XTarget, quindi avendo modificato il nome di alcuni oggetti il compilatore non trova la nuova funzione SysVsnprintf utilizzata nella libreria.

    Per poter utilizzare le nuove librerie con l’architettura XTarget devi aggiungere al tuo progetto la libreria eLLabXTargetAdjLib.

    #58649
    Rubox
    Partecipante

    Sì, ieri sera mi son dato alla lettura delle novità (che mi erano sfuggite).

    Volendo potrei aggiornare la mia CPU MPS054A110 XTarget_12 con SFW198C330 al nuovo firmware XUnified utilizzando le nuove librerie?

    Ho letto che ci sarebbero delle funzioni con nomi modificati e parametri modificati, ma al momento non sarebbe un problema.

    #58654
    Sergio Bertana
    Amministratore del forum

    Certo che è possibile eseguire l’aggiornamento (Vedi articolo) basta scaricare dal sito il package per l’upgrade a XUnified che contiene sia il sistema operativo che le pagine web aggiornate.

    Se includi nel progetto la libreria eLLabXUnifiedAdjLib  potrai compilare il tuo programma senza fare modifiche. Altrimenti dovrai sostituire gli oggetti rinominati nel passaggio da XTarget ad XUnified.

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