FB_DBRecordArraySelect

FB_DBRecordArraySelect 1:

Mit dem Funktionsbaustein FB_DBRecordArraySelect können mehrere Datensätze mit beliebiger Struktur aus einer Datenbanken 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          : DWORD;
    bExecute           : BOOL;
    tTimeout           : TIME;
END_VAR

sNetID                              : Ist ein 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 soll.

bExecute                        : Mit der steigende Flanke wird das Kommando ausgeführt.

tTimeout                         : Gibt die Zeit bis zum Abbrechen 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, 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, folgende Struktur besitzt...

Spaltenname

Datentyp

ID

bigint

Timestamp

datetime

Name

nvarchar(80)

Value

float

... muss eine SPS-Struktur erstellt werden, die einen vergleichbaren Aufbau besitzt.

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 auf Grund des Byte-Alignment 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-Program

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 v2.10.0

PC oder CX (x86)

TcDatabase.Lib

TwinCAT v2.10.0

CX (ARM)