FB_DBRecordArraySelect
Mit dem Funktionsbaustein FB_DBRecordArraySelect können mehrere Datensätze mit beliebiger Struktur aus einer Datenbank ausgelesen werden. Mit diesem Baustein können sie einen SQL-SELECT-Befehl mit bis zu 10000 Zeichen ausführen.
Dieser Funktionsbaustein ist nicht kompatibel mit ASCII-Files.
VAR_INPUT
VAR_INPUT
sNetID : T_AmsNetID;
hDBID : UDINT;
cbCmdSize : UDINT;
pCmdAddr : UDINT;
nStartIndex : UDINT;
nRecordCount : UDINT;
cbRecordArraySize: UDINT;
pDestAddr : POINTER TO BYTE;
bExecute : BOOL;
tTimeout : TIME;
END_VAR
sNetID: String, der die AMS-Netzwerkkennung des Zielgerätes enthält, an das der ADS-Befehl gerichtet wird.
hDBID: Gibt die ID der zu verwendenden Datenbank an.
cbCmdSize: Gibt die Länge des SELECT-Befehls an, der ausgeführt werden soll.
pCmdSize: Gibt die Pointer Adresse einer String Variablen mit dem auszuführenden SQL-Befehl an.
nStartIndex: Gibt den Index des ersten zu lesenden Datensatzes an.
nRecordCount: Gibt die Anzahl der zu lesenden Datensätzen an.
cbRecordArraySize: Gibt die Größe des Strukturarrays in Byte an.
pDestAddr: Gibt die Adresse des Strukturarrays an, in das die Datensätze geschrieben werden sollen.
bExecute: Mit steigender Flanke wird das Kommando ausgeführt.
tTimeout: Gibt die Zeit bis zum Abbruch der Funktion an.
VAR_OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
sSQLState: ST_DBSQLError;
nRecords : UDINT;
END_VAR
bBusy: Kommando wird gerade per ADS übertragen. Solange bBusy auf TRUE ist, wird kein neues Kommando angenommen.
bError: Wird TRUE, sobald ein Fehler eintritt.
nErrID: Liefert bei einem gesetzten bError-Ausgang den ADS Error Code bzw. TcDatabaseSrv_Error_Codes.
sSQLState: Liefert den SQL-Fehlercode des entsprechenden Datenbanktyps.
nRecords: Liefert die Anzahl der Datensätze.
Beispiel in ST
Da die Tabelle, aus der Datensätze gelesen werden sollen, die nachfolgende Struktur besitzt, muss eine SPS-Struktur erstellt werden, die einen vergleichbaren Aufbau besitzt.
Tabelle:
Spaltenname | Datentyp |
---|---|
ID | Bigint |
Timestamp | datetime |
Name | nvarchar(80) |
Value | float |
Struktur:
TYPE ST_Record:
STRUCT
ID : T_ULARGE_INTEGER;
Timestamp: DT;
Name : STRING(80);
VALUE : LREAL;
END_STRUCT
END_TYPE
Um den Datentyp T_ULARGE_INTEGER verwenden zu können, muss die Bibliothek TcUtilities.lib eingebunden werden.
Bei ARM-Prozessoren müssen aufgrund des Byte-Alignements die Datentypen anders geordnet und ein "Dummy-BYTE" hinzugefügt werden.
TYPE ST_Record :
STRUCT
ID : T_ULARGE_INTEGER;
Timestamp: DT;
Value : LREAL;
Name : STRING(80);
Dummy : BYTE;
END_STRUCT
END_TYPE
PROGRAM MAIN
VAR
FB_DBRecordArraySelect1 : FB_DBRecordArraySelect;
cmd : T_Maxstring := 'SELECT * FROM myTable';
(* Unter ARM*)
(*cmd : T_Maxstring := 'SELECT ID,Timestamp,Value,Name FROM myTable'*)
(*----------*)
recordArray : ARRAY [1..5] OF ST_Record;
busy : BOOL;
err : BOOL;
errid : UDINT;
sqlstate : ST_DBSQLError;
recAnz : UDINT;
END_VAR
SPS-Programm
FB_DBRecordArraySelect1(
sNetID:= ,
hDBID:= 1,
cbCmdSize:= SIZEOF(cmd),
pCmdAddr:= ADR(cmd),
nStartIndex:= 0,
nRecordCount:= 5,
cbRecordArraySize:= SIZEOF(recordArray),
pDestAddr:= ADR(recordArray),
bExecute:= TRUE,
tTimeout:= T#15s,
bBusy=> busy,
bError=> err,
nErrID=> errid,
sSQLState=> sqlstate,
nRecords=> recAnz);
Voraussetzungen
Entwicklungsumgebung |
Zielplattform |
Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v3.0.0 |
PC oder CX (x86) |
Tc2_Database |