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.

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:
- ADS_TO_DB_APPEND => eWriteAppend -> "tbl_Append"
- ADS_TO_DB_UPDATE => eWriteUpdate -> "tbl_Update"
- ADS_TO_DB_RINGBUFFER => eWriteRingBuffer -> "tbl_RingBuffer"
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
![]() | Alle Microsoft SQL Compact Datenbanken, die im XML-Konfigurationsfile deklariert sind, müssen vorhanden sein. Sie werden nicht automatisch generiert. |