[TwinCat 3] CX5140 Daten in Datenbank (SQL) speichern

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo excelite,

ich habe ein ähnliches Problem wie du mit der Datenbankverbindung. Der Funktionsbaustein FB_PLCDBCmd braucht zu lange um die Verbindung zur SQL Datenbank herzustellen, die Daten einzufügen und abschließend die Verbindung wieder abzubauen. Daher gehen mir Daten verloren. Nun muss ich mir auch einen Puffer für die zu schreibenden Daten bauen. Könntest du vielleicht etwas genauer darauf eingehen, wie dein Datenpuffer funktioniert?

Vielen Dank schon einmal!

 
Hallo,

ich habe damals das wie folgt gelöst:

1. Array of Struct anlegen
Im Struct sind alle Infos drin die ich in die DB Tabelle schaufeln will. Also z.b.
- Timestamp
- Text Spalte 1
- Text Spalte 2
- usw.
das Struct sah dann z.b. so aus:
iState: ENUM_DBEntryState;
sTimestamp : STRING;
sValueName : STRING;
sValumContent : STRING;

Nun habe ich ein PRG erstellt der die Daten aus dem Array of Struct in die Db schickt, wie gesagt per InsertEX, nicht dein CMD...
Per Funktion konnte ich nun von überallher aus dem Programm einen Eintrag in dieses Array of Struct anhängen. Die Funktion ist ziemlich simpel. Hatte einen globalen Schreibzeiger den aktuellen Index des Array of STruct beinhaltet. Da dann bei Aufruf der Einfügefunktion prüfen ob der Speicherplatz frei ist (darum das ENUM_DBEntrystate) und wenn frei sofort anfügen und fertig. Wenn nicht frei nach einem Platz suchen, wenn kein Leerplatz mehr frei Fehlermeldung ausgeben.
Mit "anfügen" meine ich den Datensatz des Array mit den Daten die der Funktion übergeben wurden überschreiben.

z.B.

PRG_Database.SetRecord(
sValueName := "Sensor -25B2",
sValueConent := "Sensor ausgelöst Unterdruck"
);

Habe den Code leider im Moment nicht zur Hand, sonst hätte ich es einfach hier gepostet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie im anderen Thema erwähnt würde ich nicht den standalone Konfiguration nutzen, sondern das XAE Supplement dann ist das nicht "ausgelagert" und das Lizenzthema sollte einfacher von Statten gehen.

Desweiteren lege ich die DB und die jeweiligen Tabellen immer manuell über (bei MS SQL) die Server Management Studio (SSMS) an. Das ist recht einfach. Am längsten habe ich benötigt um die Rechtevergabe des MS SQL korrekt einzustellen damit überhaupt eine Verbindung möglich ist. Ich beschreibe kurz was ich gemacht habe (ist sicherlich nicht die beste IT technisch sicherste Lösung aber für den ersten Test ideal).

1. User im SSMS anlegen z.b. TwinCAT mit Passwort (wichtig: nicht die Windows auth.. nutzen, sondern Benutzername und Passwort)
2. Der angelegten Datenbank mit Rechtsklick-> Sicherheit-> den User TwinCat hinzufügen und alle Berechtigungen geben
3. Das muss wohl auch gemacht werden, wieso auch immer: Der angelegten Tabelle ebenfalls mit Rechtsklick->Sicherheit den User Twincat hinzufügen

Wenn das so gemacht wurde ist alles für den User Twincat geöffnet. Man kann dann auch das SSMS schließen, neu öffnen und nicht die WinAuth Methode wählen, sondern sich mit dem neu angelegten User Twincat nun hier einloggen. Dann mal einen Eintrag in der Tabelle mache ob das funktioniert. Wenn ja weiß man, dass der User Schreibrechte hat und Leserecht. Dann geht es in Twincat. Hier alles wie lt. Doku anlegen

Hier die Doku:
https://download.beckhoff.com/downl...on/twincat3/TF6420_TC3_Database_Server_DE.pdf
Auf Seite 23 seht ihr das oben erwähnte supplement anstatt der Standalonevariante
Auf Seite 24 dann direkt die Beispielkonfig für einen SQL

Ich nutze allerdings nicht die autologging Funktion, sondern einfach den FB SQLInsertEx (oder so ähnlich). Man gibt dann einfach ein SQL Statement als String an und fertig: "INSERT INTO DB.Table (xy1, xy2,xy3) VALUES ('12','23','12')

Was mir aufgefallen ist, wenn man sehr viele Inserts hintereinander durchführt kann es sein, dass diese u.U. nicht richtig durchgeführt wurden obwohl der Baustein keinen Fehler meldet. Ich habe etwas die Ursachen gesucht und ich denke es liegt an der ODBC Schicht oder was auch immer im Hintergrund die Schnittstelle zwischen TC und DB schafft.
Um das Problem zu eliminieren habe ich folgendes gemacht:

1. Interner Puffer im TC der alle zu sendende Kommandos zwischenspeichert
2. Durchlaufen dieses Puffers und z.B. 10 Datensätze auf einmal als Bulk zusammenfassen. Das sieht dann so aus:
"INSERT INTO DB.Table (xy1, xy2,xy3) VALUES ('12','23','12'), ('12','23','12'), ('12','23','12'), ('12','23','12'), ('12','23','12'), ('12','23','12'), ('12','23','12')
Dann überträgt das System mit einem Rutsch x Datensätze und die Zugrifffrequenz nimmt deutlich ab
3. Wichtig: Die Länge des Insertstrings ist begrenzt. Mit der FB EX Variante sind glaube ich 10000 Zeichen möglich. Das muss im Code halt abgefangen werden, dass der String nicht länger wird, sonst -> Problem


Hi,
habe da direkt eine Frage an dich. Ich hatte mir am Freitag die Database Lizenz geholt. Ich wollte nur in einer bereits vorhandenen Datenbank, werte Speichern. Die DB sieht circa so aus:

ROW_IDROW_CREATE_USERROW_CREATE_TIMEROW_UPDATE_USERROW_UPDATE_TIME_Hoehe_Ist_Schaltkraft_MP_4_Laenge_Soll_Laenge_Ist_Schaltkraft_MP_8_PN_Schaltkraft_MP_2_Schaltkraft_MP_6_Hoehe_Soll_Personalnummer_Seriennummer

Diese Daten sammel ich jetzt über einen Messzyklus. Am Ende der Messung betätige ich einen Bestätigungstaste. Hiernach sollen die gesammelten Daten (Strings) in die DB gespeichert werden.
Brauche ich hierfür nur de SQLInsertEx Baustein oder noch andere? Muss ich ein DB Verbindungsbaustein nutzen oder ist die Verbindung bereits aktiv zum schreiben?
Gruß
Daniel
 
Zurück
Oben