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
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.
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v3.0.0 | PC oder CX (x86) | Tc2_Database |