Libreria gestione stringhe json
Home › Forum › Controllori SlimLine e Netsyst (LogicLab) › Libreria gestione stringhe json
- Questo topic ha 12 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 4 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Ottobre 4, 2018 alle 12:04 pm #45516
Riccardo Lucatuorto
PartecipanteSalve 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?
Ottobre 4, 2018 alle 1:22 pm #45518Sergio Bertana
Amministratore del forumIn 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.
Ottobre 5, 2018 alle 6:13 am #45519Riccardo Lucatuorto
PartecipanteGrazie 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.
Ottobre 5, 2018 alle 6:19 am #45521Sergio Bertana
Amministratore del forumSi 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à.
Ottobre 5, 2018 alle 9:48 am #45522Riccardo Lucatuorto
PartecipanteIn 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.
Gennaio 16, 2019 alle 7:09 am #46330Stefano
PartecipanteHo 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.
Gennaio 16, 2019 alle 7:42 am #46419Sergio Bertana
Amministratore del forumLa 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.
Novembre 14, 2019 alle 4:15 pm #50975Rubox
PartecipanteSto 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?
Novembre 14, 2019 alle 4:22 pm #51030Sergio Bertana
Amministratore del forumTi 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 extensionDicembre 30, 2020 alle 8:27 am #58631Rubox
PartecipanteVolevo 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.
Dicembre 30, 2020 alle 8:41 am #58645Sergio Bertana
Amministratore del forumCome 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.
Dicembre 30, 2020 alle 9:10 am #58649Rubox
PartecipanteSì, 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.
Dicembre 30, 2020 alle 10:00 am #58654Sergio Bertana
Amministratore del forumCerto 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.