Loggen einer SPS-Variable mit FB_DBWrite

Download: "Beispiel Loggen einer SPS-Variable mit FB_DBWrite" sample3.zip

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

Loggen einer SPS-Variable 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

"TcDatabase.lib", "TcSystem.lib", "TcBase.lib", "STANDARD.lib"

Download Dateiliste

FB_DBWrite_Sample.pro, 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. Des Weiteren müssen Sie beachten, das keine "TestDB" Datenbank vorhanden ist bevor Sie das SQLQuery.sql Script ausführen.

Beispiel Aufbau:

Mit Hilfe der Variable "eWriteMode" kann eingestellt werden, mit welchen 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_IFEND_CASE
Loggen einer SPS-Variable mit FB_DBWrite 2:

Alle Microsoft SQL Compact Datenbanken, die im XML-Konfigurationsfile 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.