Beckhoff TwinCAT V3 / SQL4TwinCAT3
Target: "Standard" / "UTF-16"
Voraussetzungen
Der SQL4TwinCAT3 Funktionsblock benötigt folgende Bibliotheken: Tc2_TcpIp.lib, Tc2_Standard, Tc2_System. Diese müssen im Projekt unter References hinzugefügt werden.
Die Tc2_TcpIp.lib ist Bestandteil der TCP/IP Server Lizenz, welche bei Beckhoff bestellt werden muss (Bestell-Nr. TF6310 - TC3 TCP/IP). Zu Testzwecken kann eine 7-tägige Testlizenz unter System-License aktiviert werden. Diese Aktivierung kann mehrmals durchgeführt werden.
Das Beispielprojekt kann auf der Soft-SPS von TwinCAT3 oder einer Hardware-SPS ausgeführt werden.
Voraussetzung ist, dass die Steuerung einen TCP/IP Anschluss hat und die Tc2_TcpIp.lib unterstützt.
Für die Soft-SPS von TwinCAT3 (Bestell-Nr. TC1200- TC3 PLC) kann ebenfalls eine 7-tägige Testlizenz aktiviert werden. Diese Aktivierung kann mehrmals durchgeführt werden.
Funktionsbaustein
Globale Konstanten
Einige globale Konstanten können projektspezifisch angepasst werden. Je nach Größe der zu lesenden oder schreibenden Datenmengen werden hier die Arraygrößen bestimmt. Diese globalen Parameter sind in Ihrem Projekt deklariert (GVL_SQL4TwinCAT3). Nach Änderungen müssen Sie das komplette Projekt neu übersetzen.
VAR_GLOBAL CONSTANT
gc_diMaxRows : DINT := 200; // max. Anzahl Datensätze (Table-Array)
gc_diMaxColumns : DINT := 15; // max. Anzahl Spalten (Table-Array)
gc_diStringLength : DINT := 40; // Stringlänge im Table-Array
gc_diUBoundRequestArray : DINT := 20; // Arraygrösse Request-Array
gc_diRequestStringLength : DINT := 80; // Stringlänge Request-Array
gc_diReadDataBuffer : DINT := DINT#8192; // max. Anzahl Bytes des Lese-Buffers
gc_diSendDataBuffer : DINT := DINT#8192; // max. Anzahl Bytes des Schreibe-Buffers
gc_xSetOptionsAllowed : BOOL := TRUE; // Aktiviert / deaktiviert Socket Setting Options, muss bei
einigen Steuerungen deaktiviert werden.
END_VAR
Globale Variablen
Die globalen Variablen für die Daten sind in Ihrem Projekt zu deklarieren (GVL_SQL4TwinCAT3).
VAR_GLOBAL
g_saRequest : ARRAY[1..diUBoundRequestArray] OF STRING(diRequestStringLength); // Request-Array
g_saColumnName : ARRAY[1..diMaxColumns] OF STRING(diStringLength); // Spaltennamen-Array
g_saTableValue : ARRAY[1..diMaxRows, 1..diMaxColumns] OF STRING(diStringLength); // Werte-Array
END_VAR
Instanz / Interface
Instanz des SQL4TwinCAT3 Funktionsblocks und lokale Variablen anlegen:
VAR
DB_Connection : SQL4TwinCAT3; // Instanz von SQL4TwinCAT3 Funktionsblock
xExecute : BOOL; // Datenbankabfrage starten
xAbort : BOOL; // Reset
sIPAddress : STRING(15); // Eingestellte IP-Adresse des SQL4automation-Connectors
uiPort : UINT; // Eingestellte Port-Nummer des SQL4automation-Connectors
xHoldConnection : BOOL; // Behält nach einer Datenbankabfrage die Socketverbindung offen
tTimeOut : 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
diResultRows : DINT; // Anz. erhaltene Zeilen aus der Datenbankabfrage
diResultColumns : DINT; // Anz. erhaltene Spalten aus der Datenbankabfrage
END_VAR
Instanz im Programm aufrufen und lokale Variablen zuweisen:
sIPAddress := '192.168.1.20'; // auch 'localhost' möglich
uiPort := 11001;
DB_Connection( xExecute:= xExecute,
xAbort:= xAbort,
sIPAddress:= sIPAddress,
uiPort:= uiPort,
xHoldConnection:= xHoldConnection,
tTimeOut:= T#30S,
pRequest:= ADR(g_saRequest),
pColumnName:= ADR(g_saColumnName),
pTableValue:= ADR(g_saTableValue),
xReady=> xReady,
xBusy=> xBusy,
xDone=> xDone,
xError=> xError,
diResultState=> diResultState,
diResultRows=> diResultRows,
diResultColumns=> diResultColumns,
Socket=> );
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-Nummer | Fehler-Beschreibung |
|---|---|
| 1 | Unbekannter SQL Befehl |
| 2 | Abfrage ergibt mehr Datensätze als mit gc_diMaxRows definiert, Abfrage anpassen oder gc_diMaxRows vergrößern |
| 3 | Abfrage ergibt mehr Spalten als mit gc_diMaxColumns definiert, Abfrage anpassen oder gc_diMaxColumns vergrößern |
| 5 | Abfrage gibt min. ein Wert zurück, der größer ist als mit MaxStringLength definiert, Abfrage anpassen oder MaxStringLength vergrößern |
| 10 | Interner Connector Fehler |
| 11 | Interner Connector Fehler, Datenbank kann nicht geöffnet werden |
| 21 | Keine IP-Adresse definiert / sIPAddress=’’ |
| 22 | Keine Portnummer definiert / uiPort=0 |
| 23 | Request-String ist leer / pRequest^[1]=’’ |
| 24 | Anzahl MaxRows nicht definiert / gc_diMaxRows=0 |
| 25 | Anzahl MaxColumns nicht definiert / gc_diMaxColumns=0 |
| 26 | Pointer auf TableValue-Array ist nicht definiert |
| 27 | Pointer auf ColumnName-Array ist nicht definiert |
| 28 | Pointer auf Request-Array ist nicht definiert |
| 29 | Sendepuffer zu klein (gc_diSendDataBuffer<=gc_diRequestStringLength) |
| 30 | Sendepuffer zu klein ( gc_diSendDataBuffer<5) |
| 51 | Request-string ist größer als der Sendepuffer. (gc_diSendDataBuffer) |
| 71 | Verbindung zum SQL4automation-Connector kann nicht geschlossen werden |
| 99 | Timeout |
| >100 | Fehlernummern der ODBC Datenbankanbindung (anbei ein paar bekannte Fehlernummern) |
| 40002 | Allgemeiner Fehler bei der SQL Abfrage, Request-String ist ungültig |
Beispielprojekt SQL4TwinCAT3 Sample program
Als Beispielprojekt wurde eine Microsoft Visual Studio Solution erstellt. Diese befindet sich im Ordner „SQL4TwinCAT3 Sample program“. Ebenfalls sind ein PLC-Projektarchiv und ein Solution-Projektarchiv vorhanden.
Es können aber auch nur der Funktionsblock „SQL4TwinCAT3“ und die globale Variablenliste „GVL_SQL4TwinCAT3“ in ein vorhandenes Projekt hinzugefügt werden.
Das Projekt kann auf der TC3 Soft-SPS 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.
