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

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:
- 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_IF
END_CASE
![]() | 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 |