The following example shows how to build a text STRING in JSON format by using the function block FB_CreateJsonFormattedString. After the text STRING has been created, it is stored in a new file on the file system of the controller by using the function block FB_WriteFile.
//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