FB_DBRecordArraySelect

FB_DBRecordArraySelect 1:

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 

ST_DBSQLError

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