Loggen einer SPS-Variablen mit FB_DBWrite

In diesem Beispiel werden das Loggen einer SPS-Variablen aus der SPS in eine Datenbank und die Funktionsweise der einzelnen Schreibmodi gezeigt.

Download: TcDBSrv_InfoSysSamples.zip

Loggen einer SPS-Variablen mit FB_DBWrite 1:

Verwendeter Datenbanktyp

MS SQL

Kompatible Datenbanktypen

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

Verwendete Funktionsbausteine

FB_DBWrite

Einzubindende Bibliotheken

Tc2_Database, Tc2_System, Tc2_Standard

Download Dateiliste

TcDBSrv_InfoSysSamples.tszip, CurrentConfigDataBase.xml, SQLQuery.sql

Um dieses Beispiel verwenden zu können, müssen Sie den Servernamen und die Authentifizierung in der XML-Konfigurationsdatei (CurrentConfigDataBase.xml) anpassen. Beachten Sie, dass keine "TestDB"-Datenbank vorhanden ist, bevor Sie das SQLQuery.sql Script ausführen.

Beispiel Aufbau:

Mithilfe der Variable „eWriteMode“ kann eingestellt werden, mit welchem Schreibmodus geloggt werden soll.
Mit einer steigenden Flanke an der Variable „bSTART“ kann dann der Schreibvorgang gestartet werden.

Tabellenzuordnung:

Verwendete Tabellenstruktur

Spaltenname

Datentyp

Null zulässig

Eigenschaft

ID

Bigint

nein

IDENTITY(1,1)

Timestamp

datetime

nein

 

Name

Ntext

nein

 

Value

Float

nein

 

Variablendeklaration

PROGRAM MAIN
VAR
(*Test symbol which will be logged into the different database tables*)
    lrTestValueVar       : LREAL := 123.456;

    eState               : E_SampleState := eIdle;
    R_TRIG1              : R_TRIG;

(*With a rising edge at bStart the FB_DBWrite block will be start once*)
    bSTART               : BOOL;

(*With eWriteMode you can select which FB_DBWrite block will be used*)
    eWriteMode           : E_SampleState := eWriteAppend;

    FB_DBWrite_Append    : FB_DBWrite;
    FB_DBWrite_Update    : FB_DBWrite;
    FB_DBWrite_RingBuffer: FB_DBWrite;

(*Status outputs from the three FB_DBWrite blocks*)
    bBusy                : BOOL;
    bErr                 : BOOL;
    bErrid               : UDINT;
    stSqlstate           : ST_DBSQLError;
END_VAR

Enum E_SampleState

TYPE E_SampleState :(
    eIdle           := 0,
    eWriteAppend    := 1,
    eWriteUpdate    := 2,
    eWriteRingBuffer:= 3
);
END_TYPE

SPS-Programm

CASE eState OF
    eIdle :
        R_TRIG1(CLK:=bSTART);
        IF R_TRIG1.Q THEN
            lrTestValueVar  := lrTestValueVar + 1;
            eState          := eWriteMode;
            bSTART          := FALSE;
        END_IF
    (*Add a new record to the table tbl_Append*)
    eWriteAppend : 
        FB_DBWrite_Append(
            sNetID          := ,
            hDBID           := 1,
            hAdsID          := 1,
            sVarName        := 'MAIN.lrTestValueVar',
            nIGroup         := ,
            nIOffset        := ,
            nVarSize        := ,
            sVarType        := ,
            sDBVarName      := 'lrTestValueVar',
            eDBWriteMode    := eDBWriteMode_Append,
            tRingBufferTime := ,
            nRingBufferCount:= ,
            bExecute        := TRUE,
            tTimeout        := T#15s,
            bBusy            => bBusy,
            bError           => bErr,
            nErrID           => bErrid,
            sSQLState        => stSqlstate);

        IF NOT bBusy THEN
            FB_DBWrite_Append(bExecute := FALSE);
            eState          := eIdle;
        END_IF
    (*Add a new record to the table tbl_Update if it not exist 
     else the existing record will be updated*) 
    eWriteUpdate :
        FB_DBWrite_Update(
            sNetID           := ,
            hDBID            := 2,
            hAdsID           := 1,
            sVarName         := 'MAIN.lrTestValueVar',
            nIGroup          := ,
            nIOffset         := ,
            nVarSize         := ,
            sVarType         := ,
            sDBVarName       := 'lrTestValueVar',
            eDBWriteMode     := eDBWriteMode_Update,
            tRingBufferTime  := ,
            nRingBufferCount := ,
            bExecute         := TRUE,
            tTimeout         := T#15s,
            bBusy             => bBusy,
            bError            => bErr,
            nErrID            => bErrid,
            sSQLState         => stSqlstate);

        IF NOT bBusy THEN
            FB_DBWrite_Update(bExecute := FALSE);
            eState           := eIdle;
        END_IF
    (*Add a new record to the table tbl_RingBuffer. 
     If the maximum count is reached the records will be deleted in a FIFO process*) 
    eWriteRingBuffer :
        FB_DBWrite_RingBuffer(
            sNetID           := ,
            hDBID            := 3,
            hAdsID           := 1,
            sVarName         := 'MAIN.lrTestValueVar',
            nIGroup          := ,
            nIOffset         := ,
            nVarSize         := ,
            sVarType         := ,
            sDBVarName       := 'lrTestValueVar',
            eDBWriteMode     := eDBWriteMode_RingBuffer_Count,
            tRingBufferTime  := ,
            nRingBufferCount := 10,
            bExecute         := TRUE,
            tTimeout         := T#15s,
            bBusy             => bBusy,
            bError            => bErr,
            nErrID            => bErrid,
            sSQLState         => stSqlstate);

        IF NOT bBusy THEN
            FB_DBWrite_RingBuffer(bExecute := FALSE);
            eState           := eIdle;
        END_IF
END_CASE
Loggen einer SPS-Variablen mit FB_DBWrite 2:

TwinCAT Database Server

Alle Microsoft SQL Compact Datenbanken, die in der XML-Konfigurationsdatei deklariert sind, müssen vorhanden sein. Sie werden nicht automatisch generiert.

Im Unterschied dazu werden die deklarierten ASCII-Dateien automatisch erzeugt, wenn Sie nicht vorhanden sind.

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v3.0.0

PC oder CX (x86)

Tc2_Database