FB_CsvWrite Example

Overview

The following example shows how to implement the FB_CsvWrite function block to write data to an existing CSV file. For further information, also refer to the EcoStruxure Machine Expert CSV File Handling Example Guide.

Buffer

The buffer provided by the application contains the elements to be written to the CSV file:

Array Index

0

1

2

3

4

5

6

0

2017-02-24

09:30:10

OpMode

Machine - AutoMode

1

2017-02-24

09:35:27

Error

Module1 - ErrorID 16#A123

2

2017-02-24

09:35:27

State

Machine - ErrorStop

3

4

5

6

7

––

Example Program

PROGRAM SR_Example
VAR
    fbWrite : FFU . FB_CsvWrite ;
    xCmdWrite : BOOL ;
    xCmdErrReset : BOOL ;
    asCsvHeader : ARRAY [ 0 .. 0 , 0 .. c_uiNumOfColumns - 1 ] OF STRING ( c_uiLengthOfValue ) := [
'Date' , 'Event' , 'Event-type' , 'Event' , '' , '' , '' ] ;
    asCsvTable : ARRAY [ 0 .. c_uiNumOfRows - 1 , 0 .. c_uiNumOfColumns - 1 ] OF STRING (
c_uiLengthOfValue ) ;
    stCsvTable : FFU . ST_CsvTable ;
    udiNumOfRowsToWrite : UDINT ;
    xInitDone : BOOL ;
    xCreateFileWithHeader : BOOL ;
    iState : INT ;
END_VAR
VAR CONSTANT
    c_uiNumOfRows : UINT := 8 ;
    c_uiNumOfColumns : UINT := 7 ;
    c_uiLengthOfValue : UINT := 80 ;
END_VAR

IF NOT xInitDone THEN
    xInitDone := TRUE ;
    SysMem . SysMemSet ( ADR ( asCsvTable ) , 0 , SIZEOF ( asCsvTable ) ) ;
    asCsvTable [ 0 , 0 ] := '2017-02-24' ;
    asCsvTable [ 0 , 1 ] := '09:30:10' ;
    asCsvTable [ 0 , 2 ] := 'OpMode' ;
    asCsvTable [ 0 , 3 ] := 'Machine - AutoMode' ;

    asCsvTable [ 1 , 0 ] := '2017-02-24' ;
    asCsvTable [ 1 , 1 ] := '09:35:27' ;
    asCsvTable [ 1 , 2 ] := 'Error' ;
    asCsvTable [ 1 , 3 ] := 'Module1 - ErrorID 16#A123' ;

    asCsvTable [ 2 , 0 ] := '2017-02-24' ;
    asCsvTable [ 2 , 1 ] := '09:35:27' ;
    asCsvTable [ 2 , 2 ] := 'State' ;
    asCsvTable [ 2 , 3 ] := 'Machine - ErrorStop' ;

    udiNumOfRowsToWrite := 3 ;
END_IF

CASE iState OF
    0 : // wait for write command
        IF xCmdWrite THEN
            iState := 10 ;
            xCmdWrite := FALSE ;
        END_IF

    10 : // prepare the write process and reset the function block
        IF xCreateFileWithHeader THEN
            fbWrite . i_stTableWriteValues . pbyTable := ADR ( asCsvHeader ) ;
            fbWrite . i_stTableWriteValues . uiNumOfRows := 1 ;
            fbWrite . i_stTableWriteValues . uiNumOfColumns := c_uiNumOfColumns ;
            fbWrite . i_stTableWriteValues . udiSizeOfTable := SIZEOF ( asCsvHeader ) ;

            fbWrite . i_stWriteParameter . sDelimiter := ';' ;
            fbWrite . i_stWriteParameter . etModeFileOpen := FFU . ET_ModeFileOpen . Create ;
            fbWrite . i_stWriteParameter . udiNumOfRow := 1 ;
            fbWrite . i_stWriteParameter . udiNumOfColumn := c_uiNumOfColumns ;
        ELSE
            fbWrite . i_stTableWriteValues . pbyTable := ADR ( asCsvTable ) ;
            fbWrite . i_stTableWriteValues . uiNumOfRows := c_uiNumOfRows ;
            fbWrite . i_stTableWriteValues . uiNumOfColumns := c_uiNumOfColumns ;
            fbWrite . i_stTableWriteValues . udiSizeOfTable := SIZEOF ( asCsvTable ) ;

            fbWrite . i_stWriteParameter . sDelimiter := ';' ;
            fbWrite . i_stWriteParameter . etModeFileOpen := FFU . ET_ModeFileOpen . Append ;
            fbWrite . i_stWriteParameter . udiNumOfRow := udiNumOfRowsToWrite ;
            fbWrite . i_stWriteParameter . udiNumOfColumn := c_uiNumOfColumns ;
        END_IF
        fbWrite ( i_xExecute := FALSE ) ;
        iState := 20 ;

    20 : // wait until the execution of the function block is completed
        fbWrite (
            i_xExecute := TRUE ,
            i_sFilePath := './myfiles/Example.csv' ) ;

        IF fbWrite . q_xError THEN
            iState := - 1 ;
        ELSIF fbWrite . q_xDone THEN
            IF xCreateFileWithHeader THEN
                xCreateFileWithHeader := FALSE ;
                iState := 10 ;
            ELSE
                iState := 0 ;
            END_IF
        END_IF

    - 1 : // error handling
        IF fbWrite . q_etResult = FFU . ET_Result . FileNotExists THEN
            xCreateFileWithHeader := TRUE ;
            iState := 10 ;
        ELSIF xCmdErrReset THEN
            xCmdErrReset := FALSE ;
            iState := 0 ;
        END_IF
END_CASE

Example CSV File

Content of example.csv after executing the example code above. Provided that the file did not exist before:

Date;Time;Even-type;Event;;;
2017-02-24;09:30:10;OpMode;Machine - AutoMode;;;
2017-02-24;09:35:27;Error;Module1 - ErrorID 16#A123;;;
2017-02-24;09:35:27;State;Machine - ErrorStop;;;