Aus Datenbank lesen & schreiben

Robi123

Level-2
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin gerade dabei das Datenloggen in eine Datenbank mittels TF6420 zu realisieren. Für die Anwendung steht eine MS SQL Datenbank zur Verfügung. Sowohl schreiben als auch lesen habe ich bereits einzeln zum laufen bekommen.

Folgendes Szenario, das SPS Programm soll beim Neustart, nach Origin Reset oder Datenverlust immer erst die aktuellsten Daten aus der Datenbank lesen. Dadurch kann ich meine SPS Variablen mit den Datenbankwerten füllen und von dort aus weiter hoch- oder runterzählen.

Mein Plan war es für jeweils einen Datentyp zwei AutoLogGroups anzulegen. Eine konfiguriert mit: Direction: „DeviceAsTarget“ und eine konfiguriert mit Direction: „DeviceAsSource“, die DeviceAsTarget AutoLogGroup wollte ich dann einmal mittels FB_PLCDBAutoLogEvt.RunOnce(hAutoLogGrpID := x) auszuführen. Hier kommt mein Problem zu Stande, immer wenn eine AutoLogGroup erstellt wird, wird diese Automatisch mit AutoLogGrpID: 1 erstellt, diese ID lässt sich gar nicht ändern und somit kann ich die Groups auch nicht gesondert ansteuern.

Wie würdet ihr das lösen? Wäre da ein ganz anderer Ansatz denkbar?
 
Dadurch kann ich meine SPS Variablen mit den Datenbankwerten füllen und von dort aus weiter hoch- oder runterzählen.

Wären persistente Variablen was für Dich? Dann müsstest Du nur in die Datenbank schreiben, aber nicht nach einem Neustart lesen. Es wäre aber eine USV erforderlich. Manche CX haben eine 1S-USV "on Board".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wären persistente Variablen was für Dich? Dann müsstest Du nur in die Datenbank schreiben, aber nicht nach einem Neustart lesen. Es wäre aber eine USV erforderlich. Manche CX haben eine 1S-USV "on Board".
Würde ich nur als letzten Ausweg machen wollen, die werden ja beim Origin Reset wieder zurückgesetzt. Klar, sollte man das eigentlich nicht mehr machen müssen, wenn die Maschine einmal läuft, würde es aber trotzdem gerne umgehen.
 
Nachtrag: In der config datei der AutoLogGroup (.tcdbsrvauto) lässt sich die ID manuell ändern und wird dann auch in TwinCAT erkannt.
Leider habe ich dann gemerkt, dass ich mit der Methode RunOnce zwar bestimmte ID's Adressieren kann, mit Start aber leider nicht und dann werden alle AutoLogGroups gleichzeitig gestartet.

Schon mal das hier gesehen?
https://infosys.beckhoff.com/index.php?content=../content/1031/tc3_plc_intro/2529719179.html&id=
Ich habe es zwar noch nicht getestet, sollte aber funktionieren.

Ich habe übrigens "Origin Reset" noch nie gebraucht.
Wie machst du es, wenn sich an der Konfiguration was ändert, da werden meines Wissens nach auch alle Variablen zurückgesetzt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es einfach nur darum geht die Daten unabhängig von der PLC Laufzeit zu speichern / zu laden so dass du die Daten auch nach einem Origin-Reset oder einer Neu-Installation es Systems noch da sind: Könnte der Weg über JSON Dateien für deine Anwendung evtl. zweckmässiger sein?

JSON In-/Export in Dateien kannst du dir mit der Standard Tc3_JsonXML library (keine TF-Lizenz nötig) zusammen bauen, oder du kannst mich falls dafür JSON was sein könnte, für unten stehenden fertigen FB kontaktieren. Wenn die Steuerung ein USV hat, ist via JSON-Dateien ein Verhalten wie bei persistenten Variablen möglich, nur dass die so gespeicherten Daten egal was die Laufzeit macht, dauerhaft gesichert und wieder restaurierbar sind oder auch z.b. von einem USB-Stick restauriert werden können.

1739532485421.png
 
Hallo Robi123
Die DB Lösung finde ich auch viel eleganter und sicherer als Persistente Vars...
Bei der Beckhoff Lib würde ich aber die SQL Expert Mode verwenden, dann hast du die volle Flexibilität und Zugriff auf deine Daten. Du musst dich dann halt etwas mit der SQL Sprache auseinandersetzten, aber das ist keine Hexerei.
Neben der Beckhoff Lösung habe ich auch schon SQL4automation eingesetzt. Kostet mehr, ist aber stabiler, da nicht alles über ADS läuft und es gibt einfache Beispielprojekte. 🤷‍♂️
 
Hallo Robi123
Die DB Lösung finde ich auch viel eleganter und sicherer als Persistente Vars...
Bei der Beckhoff Lib würde ich aber die SQL Expert Mode verwenden, dann hast du die volle Flexibilität und Zugriff auf deine Daten. Du musst dich dann halt etwas mit der SQL Sprache auseinandersetzten, aber das ist keine Hexerei.
Neben der Beckhoff Lösung habe ich auch schon SQL4automation eingesetzt. Kostet mehr, ist aber stabiler, da nicht alles über ADS läuft und es gibt einfache Beispielprojekte. 🤷‍♂️
Sehe ich auch so, bin grade dabei, dass in Betrieb zu nehmen komme aber gerade nicht weiter.
Habe mir als Beispiel das Beckhoff Szenario "Production Register" angeschaut und mit meiner hier vorhandenen Datenbank eingerichtet.
Bei folgendem Befehl:
Code:
fbSQLStoredProcedure.ExecuteDataReturn(pParameterStrc:= ADR(nCustomerID), cbParameterStrc:= SIZEOF(nCustomerID), pSQLDBResult:= ADR(fbSQLResult))
bekomme folgenden Fehler:

Error 19.02.2025 11:41:21 253 ms | 'MAIN.fbSQLStoredProcedure.ExecuteDataReturn()': Syntax error or access violation

Weiß da jemand weiter?
 
Zurück
Oben