FB_DBRecordSelect

FB_DBRecordSelect 1:

Mit dem Funktionsbaustein FB_DBRecordSelect können einzelne Datensätze mit beliebiger Struktur aus einer Datenbank ausgelesen werden.
Dieser Funktionsbaustein ist nicht kompatibel mit ASCII-Files.

VAR_INPUT

VAR_INPUT
    sNetID      : T_AmsNetID;
    hDBID       : UDINT;
    sSelectCmd  : T_MaxString;
    nRecordIndex: UDINT;
    cbRecordSize: UDINT;
    pDestAddr   : DWORD;
    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.

sSelectCmd: Gibt den SELECT-Befehl an, der ausgeführt werden soll.

nRecordIndex: Gibt den Index des zu lesenden Datensatzes an.

cbRecordSize: Gibt die Größe eines Datensatzes in Byte an.

pDestAddr: Gibt die Adresse der Struktur an, in die der Datensatz geschrieben werden soll.

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 ein Datensatz gelesen werden soll, die nachfolgende Struktur besitzt, muss eine SPS-Struktur erstellt werden, die einen vergleichbaren Aufbau besitzt.

Tabelle:

Spaltenname

Datentyp

ID

Bigint

Timestamp

datetime

Name

Ntext

Value

Float

Struktur:

TYPE ST_Record :
STRUCT
    ID       : T_ULARGE_INTEGER;
    Timestamp: DT;
    Name     : STRING;
    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-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;
    Dummy    : BYTE;
END_STRUCT
END_TYPE 
PROGRAM MAIN
VAR
    FB_DBRecordSelect1: FB_DBRecordSelect;
    cmd               : T_Maxstring := 'SELECT * FROM myTable';
    (* Unter ARM*) 
    (*cmd             : T_Maxstring := 'SELECT ID,Timestamp,Value,Name FROM myTable'*)
    (*----------*)
    record            : ST_Record;
    busy              : BOOL;
    err               : BOOL;
    errid             : UDINT;
    recAnz            : DINT;
END_VAR 

SPS-Programm

FB_DBRecordSelect1(
    sNetID      := ,
    hDBID       := 2,
    sSelectCmd  := cmd,
    nRecordIndex:= 0,
    cbRecordSize:= SIZEOF(record),
    pDestAddr   := ADR(record),
    bExecute    := TRUE,
    tTimeout    := T#15s,
    bBusy       => busy,
    bError      => err,
    nErrID      => errid,
    nRecords    => recAnz);

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v3.0.0

PC oder CX (x86)

Tc2_Database