FB_CreateJsonFormattedString Esempio

Panoramica

L'esempio che segue mostra come creare un testo STRING in formato JSON servendosi del blocco funzioneFB_CreateJsonFormattedString. Una volta creato il testo STRING, questo viene salvato in un nuovo file nel file system del controller tramite il blocco funzione FB_WriteFile.

Esempio di programma

//JSON Example - Declaration Part
PROGRAM SR_Main
VAR
    xStart : BOOL;
    xReset : BOOL;
    etResult : FFU.ET_Result;
    xJsonStringInvalid : BOOL;
    xProcessCompleted : BOOL;
    sResultMsg : STRING(80):= 'Ready for start';
    xErrorWriteFile : BOOL;    
    dtTimestamp : DATE_AND_TIME;
    udiMessageId : UDINT := 12587;
    rTotalEnergy : REAL    := 35.6;
    rMaxVoltage : REAL    := 402.56;
    rLowVoltage : REAL    := 399.03;
    rMaxCurrent : REAL    := 18.459;
    rTemperatureSensor1 : REAL    := 21.65;
    rTemperatureSensor2 : REAL    := 32.47;
    rTemperatureSensor3 : REAL    := 36.52;
    rTemperatureSensor4 : REAL    := 47.35;
    iState : INT;
    xErr : BOOL;
    xStartOld : BOOL;
    udiResult : UDINT;
    sJsonString : STRING(FFU.GPL.Gc_udiJsonMaxLengthOfString);
    fbJson : FFU.FB_CreateJsonFormattedString;
    fbWriteFile : FFU.FB_WriteFile;
END_VAR

//JSON Example - Implementation Part
CASE iState OF
0 : //Idle
    IF xStart AND NOT xStartOld THEN
        iState := 10 ;
        xProcessCompleted := FALSE ;
    END_IF
    xStartOld := xStart ;
    xStart := FALSE ;

10 : //Prepare data
    dtTimestamp := DWORD_TO_DT ( SysTimeRtc.SysTimeRtcGet ( udiResult ) ) ; // get the RTC of the controller
    iState := 20 ;

20 : //Create String
    xErr := FALSE ;
    xErr S= NOT fbJson.New ( ) ;
    xErr S= NOT fbJson.AddNameValuePairObject ( 'Header' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'MachineId' , 'SEMSOL-M251MESE-F40A0B07' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'MachineType' , 'SMR-550' ) ;
    xErr S= NOT fbJson.AddNameValuePair ( 'Timestamp' , dtTimestamp ) ;
    xErr S= NOT fbJson.AddNameValuePair ( 'MessageId' , udiMessageId ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ; // close object header'
    xErr S= NOT fbJson.AddNameValuePairObject ( 'Values' ) ;
    xErr S= NOT fbJson.AddNameValuePairObject ( 'Configuration' ) ;
    xErr S= NOT fbJson.AddNameValuePairArray ( 'Devices' ) ;
    xErr S= NOT fbJson.ObjectOpen ( ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'ID' , '1' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Category' , 'Controller' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Type' , 'TM251MESE' ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ;
    xErr S= NOT fbJson.ObjectOpen ( ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'ID' , '2' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Category' , 'ServoDrive' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Type' , 'Lexium32M' ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ;
    xErr S= NOT fbJson.ArrayClose ( ) ; // close array Devices
    xErr S= NOT fbJson.ObjectClose ( ) ; // close object Configuration
    xErr S= NOT fbJson.AddNameValuePairObject ( 'Status' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Machinestate' , 'Running' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Errorstate' , 'NoError' ) ;
    xErr S= NOT fbJson.AddNameValuePairString ( 'Warning' , 'Filllevel low' ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ;
    xErr S= NOT fbJson.AddNameValuePairArray ( 'Processdata' ) ;
    xErr S= NOT fbJson.ObjectOpen ( ) ;
    xErr S= NOT fbJson.AddNameValuePairArray ( 'Energy' ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rTotalEnergy ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rMaxVoltage ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rLowVoltage ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rMaxCurrent ) ;
    xErr S= NOT fbJson.ArrayClose ( ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ;
    xErr S= NOT fbJson.ObjectOpen ( ) ;
    xErr S= NOT fbJson.AddNameValuePairArray ( 'Temperature' ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rTemperatureSensor1 ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rTemperatureSensor2 ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rTemperatureSensor3 ) ;
    xErr S= NOT fbJson.ArrayAddValue ( rTemperatureSensor4 ) ;
    xErr S= NOT fbJson.ArrayClose ( ) ;
    xErr S= NOT fbJson.ObjectClose ( ) ;
    xErr S= NOT fbJson.ArrayClose ( ) ; // close array Processdata
    xErr S= NOT fbJson.ObjectClose ( ) ; // close object Values

    // copy the string, not mandatory for the present processing but for presentation of the feature
    fbJson.Copy ( i_anyBuffer := sJsonString ) ;

    IF xErr OR NOT fbJson.IsJsonStringValid THEN
        iState := 100 ;
        xJsonStringInvalid := NOT fbJson.IsJsonStringValid ;
    ELSE
        iState := 30 ;
    END_IF

30 : //Start write file
    fbWriteFile (
        i_xExecute := TRUE ,
        i_sFilePath := 'MachineData.json' ,
        i_etModeFileOpen := FFU.ET_ModeFileOpen.CreatePlus ,
        i_timTimeout := ,
        i_pbyBuffer := fbJson.PointerToJsonString ,
        i_udiSize := fbJson.LengthOfJsonString ,
        q_xDone => ,
        q_xBusy => ,
        q_xError => ,
        q_etResult => ,
        q_sResultMsg => ,
        q_udiFileSize => ) ;

    iState := 40 ;

40 : // Wait for write file complete
    IF fbWriteFile.q_xDone THEN
        iState := 0 ;
        xProcessCompleted := TRUE ;
    ELSIF fbWriteFile.q_xError THEN
        iState := 100 ;
        xErrorWriteFile := TRUE ;
        etResult := fbWriteFile.q_etResult ;
        sResultMsg := fbWriteFile.q_sResultMsg ;
    END_IF

        fbWriteFile ( i_xExecute := ( iState = 40 ) ) ;

100 : //Error detected
    IF xReset THEN
        iState := 0 ;
        etResult := FFU.ET_Result.Idle ;
        sResultMsg := 'Ready for start' ;
        xJsonStringInvalid := FALSE ;
        xErrorWriteFile := FALSE ;
        xReset := FALSE ;
    END_IF
END_CASE

File JSON risultante

G-SE-0067538.1.gif-high.gif

 

 

NOTA: il testo originaleSTRING non contiene spazi vuoti o interruzioni di riga. La strutturaJSON visualizzata nella figura soprastante è stata creata automaticamente quando il file è stato aperto con un editor di testi che supporta il formatoJSON.