Zum Hauptinhalt springen

CODESYS V2.3 / SQL4CODESYS

Target: "Standard"

Voraussetzungen

Die SQL4CoDeSys.lib Bibliothek verwendet die Sockets-Funktionen der CoDeSys Bibliothek SysLibSockets.lib welche im Projekt in der Bibliotheksverwaltung ebenfalls angeschlossen werden muss.

Das Beispielprojekt kann auf der Soft-SPS CoDeSys SP PLCWinNT oder einer Hardware SPS ausgeführt werden. Voraussetzung ist, dass die Steuerung einen TCP/IP Anschluss hat und die SysLibSockets.lib unterstützt.

Funktionsbaustein

Funktionsbaustein

Globale Konstanten

Einige globale Konstanten können projektspezifisch angepasst werden. Je nach Grösse der zu lesenden oder schreibenden Datenmengen werden hier die Arraygrössen bestimmt. Diese globalen Parameter sind in Ihrem Projekt deklariert (GVL_SQL4CoDeSys). Nach Änderungen müssen Sie das komplette Projekt neu übersetzen.

VAR_GLOBAL CONSTANT
diMaxRows : DINT := 50; (* max. Anzahl Datensätze, aus Table-Array *)
diMaxColumns : DINT := 15; (* max. Anzahl Spalten, aus Table-Array *)
diStringLength : DINT := 40; (* Stringlänge in der Table-Array*)
diMaxReturnParameter : DINT := 5; (* max. Anzahl Return Parameter, aus Return Parameter-Array *)
diUBoundRequest Array : DINT := 20; (* Obergrenze Request-String-Array *)
diRequestStringLength : DINT := 80; (* Stringlänge Request-String-Array *)
diReadDataBuffer : DINT := 4096; (* max. Anzahl Bytes des Lese-Puffers *)
diSendDataBuffer : DINT := 2048; (* max. Anzahl Bytes des Sende-Puffers *)
END_VAR
Einige globale Konstanten können projektspezifisch angepasst werden

Globale Variablen

VAR_GLOBAL
saRequest : ARRAY[1..diUBoundRequestArray] OF STRING(diRequestStringLength); (* Request-Array *)
saColumnsName : ARRAY[1..diMaxColumns] OF STRING(diStringLength); (* Spaltennamen-Array *)
saTableValues : ARRAY[1..diMaxRows, 1..diMaxColumns] OF STRING(diStringLength); (* Werte-Array *)
saReturnParameters : ARRAY[1..diMaxReturnParameter] OF STRING(diStringLength); (* Return Parameter-
Array *)
END_VAR

Instanz / Interface

Instanz der SQL4CoDeSys-Target-Library und lokale Variablen anlegen.

DB_Connection : SQL4CoDeSys; (* Instanz von SQL4CoDeSys Funktionsblock *)

xExecute : BOOL; (* Datenbankabfrage starten *)
xAbort : BOOL; (* Reset *)
sIPAddress : STRING(15) ; (* Eingestellte IP-Adresse des SQL4automation-Connectors *)
iPort : UINT; (* Eingestellte Port-Nummer des SQL4automation-Connectors *)
xHoldConnection : BOOL; (* Behält nach einer Datenbankabfrage die Socketverbindung offen *)
timTimeOut : TIME; (* Timeout *)
xReady : BOOL; (* Bereit für eine Datenbankabfrage *)
xBusy : BOOL; (* Datenbankabfrage läuft *)
xDone : BOOL; (* Datenbankabfrage abgeschlossen *)
xError : BOOL; (* Datenbankabfrage endete mit einem Fehler *)
diResultState : DINT; (* Status Datenbankabfrage / Fehlernummer *)
diResultReturnParameters : DINT; (* Anz. erhaltene Return und Output Parameter aus der DB-Abfrage *)
diResultRows : DINT; (* Anz. erhaltene Zeilen aus der Datenbankabfrage *)
diResultColumns : DINT; (* Anz. erhaltene Spalten aus der Datenbankabfrage *)

Instanz im Programm aufrufen und lokale Variablen zuweisen.

sIPAddress := '192.168.1.20'; (* IP Adresse welche im Connector gesetzt ist *)
iPort := 11001;
DB_Connection( xExecute:= xExecute,
xAbort:= xAbort,
sIPAddress:= sIPAddress,
iPort:= iPort,
xHoldConnection:= xHoldConnection,
tTimeOut:= timTimeOut,
pRequest:= ADR(saRequest),
pColumnName:= ADR(saColumnsName),
pTableValue:= ADR(saTableValues),
ptReturnParameters:= ADR(saReturnParameters),
xReady=> xReady,
xBusy=> xBusy,
xDone=> xDone,
xError=> xError,
diResultState=> diResultState,
diResultReturnParameters=> diResultReturnParameters,
diResultRows=> diResultRows,
diResultColumns=> diResultColumns);

Handshake

Das Handshake verhält sich nach dem Handshake des Standardprotokolls. Das Standardprotokoll wird unter Standard Protokoll beschrieben.

Fehlercodes Return-Value

Die Variable “diResultState” beschreibt den Fehler.

Fehler-NummerFehler-Beschreibung
1Unbekannter SQL Befehl
2Abfrage ergibt mehr Datensätze als mit diMaxRows definiert, Abfrage anpassen oder diMaxRows vergrößern
3Abfrage ergibt mehr Spalten als mit diMaxColumns definiert, Abfrage anpassen oder diMaxColumns vergrößern
5Abfrage gibt min. ein Wert zurück, der größer ist als mit MaxStringLength definiert, Abfrage anpassen oder MaxStringLength vergrößern
10Interner Connector Fehler
11Interner Connector Fehler, Datenbank kann nicht geöffnet werden
21Keine IP-Adresse definiert / sIPAddress=’’
22Keine Portnummer definiert / uiPort=0
23Request-String ist leer / pRequest^[1]=’’
24Anzahl MaxRows nicht definiert / diMaxRows=0
25Anzahl MaxColumns nicht definiert / diMaxColumns=0
26Pointer auf TableValues-Array ist nicht definiert
27Pointer auf ColumnsName-Array ist nicht definiert
28Pointer auf Request-Array ist nicht definiert
29Größe MaxStringLength nicht definiert / diStringLength=0
30Pointer auf ReturnParameter-Array ist nicht definiert
41

Keine Verbindung zum SQL4automation-Connector hergestellt.

Firewall ausschalten.

50Es konnte nicht der gesamte Request-String gesendet werden. Bitte prüfen Sie die Verbindung oder den TCP Puffer Ihres Systems.
51Request-string ist größer als der Sendepuffer. (diSendDataBuffer)
71Verbindung zum SQL4automation-Connector kann nicht geschlossen werden
99Timeout
>100Fehlernummern der ODBC Datenbankanbindung (anbei ein paar bekannte Fehlernummern)
40002Allgemeiner Fehler bei der SQL Abfrage, Request-String ist ungültig

Beispielprojekt SQL4CoDeSysSample

Im Beispielprojekt SQL4CoDeSysSample.pro wurde die SQL4CodeSys Bibliothek bereits eingefügt.

Das Projekt kann zum Beispiel auf der CODESYS Soft-SPS „CoDeSys SP PLCWinNT“ getestet werden. Der Connector muss gestartet und die Verbindung zur Beispiel-Datenbank „S4A_Test_DB.mdb“ konfiguriert sein.

Wie die Verbindung zur Testdatenbank konfiguriert wird, ist unter Einrichten der Verbindung an die Testdatenbank beschrieben.

Durch Forcen von xExecute kann das Programm getestet werden. Im Falle eines Fehlers kann die Verbindung durch Forcen von xAbort zurückgesetzt werden.

Durch Forcen der Variable xStartRequest kann ein automatischer Ablauf einer Datenbankabfrage gemacht werden.

Durch Forcen der Variable xStartRequest kann ein automatischer Ablauf einer Datenbankabfrage gemacht werden

Sobald die Abfrage erfolgreich durchgelaufen ist, befinden sich in den globalen Variablen die empfangenen Datensätze.

Sobald die Abfrage erfolgreich durchgelaufen ist, befinden sich in den globalen Variablen die empfangenen Datensätze