Beispiel mit dem FB_DBRecordInsert und FB_DBRecordSelect Baustein

In diesem Beispiel gezeigt, wie mehrere Werte in eine Datenbank aus der SPS heraus mit dem Funktionsbaustein FB_DBRecordInsert geloggt werden. Speziell in diesem Beispiel werden mehrere SPS-Variablen in einen Datensatz geloggt. Des Weiteren kann mit dem Funktionsbaustein FB_DBRecordSelect ein Datensatz aus dieser Datenbank ausgelesen werden.

Download: TcDBSrv_InfoSysSamples.zip

Beispiel mit dem FB_DBRecordInsert und FB_DBRecordSelect Baustein 1:

Verwendeter Datenbanktyp

MS Access

Kompatible Datenbanktypen

MS SQL, MS Compact SQL, MS Access, MySQL, PostgreSQL, DB2, Oracle, InterBase/Firebird, XML

Verwendete Funktionsbausteine

FB_DBRecordInsert, FB_DBRecordSelect

Einzubindende Bibliotheken

"Tc2_Database", "Tc2_System", "Tc2_Standard", "Tc2_Utilities"

Download Dateiliste

TcDBSrv_InfoSysSamples.tszip, CurrentConfigDataBase.xml, TestDB_Access.mdb

In folgende Tabellenstruktur wird geschrieben:

Spaltenname

Datentyp

Timestamp

datetime

PLC_TestValue1

float

PLC_TestValue2

float

PLC_TestValue3

float

PLC_TestValue4

String

Variablendeklaration

(* Declaration *)PROGRAM MAIN
VAR
    eState            : E_SQLStatement;

    NT_GetTime1       : NT_GetTime;
    bTimestart        : BOOL;
    tTime             : TIMESTRUCT;

    FB_FormatStringDateTime: FB_FormatString;
    sDateTimeString   : T_MaxString;

    TestValue1        : REAL := 123.456;
    TestValue2        : REAL := 234.567;
    TestValue3        : REAL := 345.678;
    TestValue4        : STRING(255) := 'No error occurred';

    FB_FormatString1  : FB_FormatString;
    sInsertString     : T_MaxString;
    bError            : BOOL;
    nErrid            : UDINT;

    FB_DBRecordInsert1: FB_DBRecordInsert;
    bStartstopInsert  : BOOL;
    bBusyInsert       : BOOL;
    bErrInsert        : BOOL;
    nErridInsert      : UDINT;
    stSQLStateInsert  : ST_DBSQLError;

    stRecord          : ST_Record;

    FB_DBRecordSelect1: FB_DBRecordSelect;
    nRecIndex         : UDINT := 0;
    bStartstopSelect  : BOOL;
    bBusySelect       : BOOL;
    bErrorSelect      : BOOL;
    nErrIDSelect      : UDINT;
    stSQLStateSelect  : ST_DBSQLError;
    nRecordCount      : UDINT;
END_VAR

Enum E_SQLStatement

TYPEE_SQLStatement:(
    eSQL_INSERT  := 0,
    eSQL_SELECT  := 1
);
END_TYPE

Struct ST_Record

TYPEST_Record :
STRUCT
    Timestamp : DT;
    PLC_Value1: REAL;
    PLC_Value2: REAL;
    PLC_Value3: REAL;
    PLC_Value4: STRING;
END_STRUCT
END_TYPE

SPS-Programm

CASEeState OF
    eSQL_INSERT:
        (*Create the timestamp*)
        NT_GetTime1( START:= bTimestart, TIMESTR=> tTime);
        IF NOT NT_GetTime1.BUSY THEN
            bTimestart:= NOT bTimestart;
        END_IF

        FB_FormatStringDateTime(
            sFormat   := '%D.%D.%D %D:%D:%D',
            arg1      := F_WORD(tTime.wYear),
            arg2      := F_WORD(tTime.wMonth),
            arg3      := F_WORD(tTime.wDay),
            arg4      := F_WORD(tTime.wHour),
            arg5      := F_WORD(tTime.wMinute),
            arg6      := F_WORD(tTime.wSecond),
            sOut       => sDateTimeString);
        
        (*Create the SQL-INSERT command*)
        FB_FormatString1(
            sFormat   := 'INSERT INTO tbl_Test VALUES($'%S$',%F,%F,%F,$'%S$')',
            arg1      := F_STRING(sDateTimeString),
            arg2      := F_REAL(TestValue1),
            arg3      := F_REAL(TestValue2),
            arg4      := F_REAL(TestValue3),
            arg5      := F_STRING(TestValue4),
            sOut       => sInsertString,
            bError     => bError,
            nErrId     => nErrid);
        
        (*Write the record to the database*)
        FB_DBRecordInsert1(
            sNetID    := ,
            hDBID     := 1,
            sInsertCmd:= sInsertString,
            bExecute  := bStartstopInsert,
            tTimeout  := T#15s,
            bBusy      => bBusyInsert,
            bError     => bErrInsert,
            nErrID     => nErridInsert,
            sSQLState  => stSQLStateInsert);

    eSQL_SELECT:
        (*Read one record from the database*)
        FB_DBRecordSelect1(
            sNetID    := ,
            hDBID     := 1,
            sSelectCmd:= 'SELECT * FROM tbl_Test',
            nRecordIndex:= nRecIndex,
            cbRecordSize:= SIZEOF(stRecord),
            pDestAddr := ADR(stRecord),
            bExecute  := bStartstopSelect,
            tTimeout  := T#15s,
            bBusy      => bBusySelect,
            bError     => bErrorSelect,
            nErrID     => nErrIDSelect,
            sSQLState  => stSQLStateSelect,
            nRecords   => nRecordCount);
END_CASE

Um dieses Beispiel zu benutzen, müssen Sie die Access Datenbank „Sample7.mdb“ in der XML‑Konfigurationsdatei deklarieren.
Durch die Erzeugung einer positiven Flanke an der Variable „bStartstopInsert“ wird ein Datensatz mit den vier SPS-Werten und dem Timestamp in der Datenbank angelegt.

Beispiel mit dem FB_DBRecordInsert und FB_DBRecordSelect Baustein 2:

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v3.0.0

PC oder CX (x86)

Tc2_Database