MsgFilterSQL + DATETIME aus Variable bzw. E/A-Feld

ThomasMaulwurf

Level-1
Beiträge
41
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich möchte eine Filteroption für Alarme erstellen. (WinCC 6.0) Nach Eingabe von Anfangs- und Endzeit soll per Buttonclick dementsprechend gefiltert werden. (Das ganze soll für den DAU sein, der nicht mit den WinCC-eigenen Filtern umgehen kann oder die Finger davon lassen soll)

Bisher habe ich folgende C-Anweisung auf dem Button:

Code:
SetPropChar(lpszPictureName, "OLE-Control1","MsgFilterSQL","#VisibleOnly\\DATETIME >= ' "GetTagChar ("Zeit_Von")" ' AND DATETIME <= ' "GetTagChar ("Zeit_Bis")" ' ");

... aber da meckert er " error (0040): ')' expected before 'GetTagChar' "


Die Variablen habe ich als 16-Bit Textvariablen angelegt und die Eingabefelder wiefolgt vorstrukturiert: 'JJJJ-MM-TT HH:MM:SS.mmm'

Anscheinend frisst MsgFilterSQL diese Art von Deklaration nicht. Gibt es eine Möglichkeit die Zeiten im Ganzen oder zerstückelt (Einzeleingabe Jahr, Monat, Tag, etc.) hier reinzubiegen?

Danke im Voraus!
 
Das ist C, da lassen sich nicht einfach Strings hintereinanderhängen wie es bei diversen Skriptsprachen möglich ist.

Du musst den SQL Abfragestring erst als lokale Variable mit den diversen Zeichenkettenfunktionen (strcpy, strcat oder sprintf) zusammensetzen, und dann diesen an die Funktion SetPropChar übergeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meine C-Kenntnisse sind leider mehr als schwach und das einzige, was ich im Netz / hier gefunden hab, was mir für mein Vorhaben hilfreich erscheint ist:

http://www.sps-forum.de/hmi/77741-wincc-prof-umwandlung-string-nach-datetime.html

Leider existiert die Funktion "SetTagDateTime" z.B: garnicht und ich weiß nicht, wie ich es selbst zusammenschreiben könnte.

Hat noch wer einen erweiterten Ansatz zu diesem Problem?
 
Probier mal so:
Code:
char sql_string[255];

sprintf(sql_string, "#VisibleOnly\\DATETIME >= '%s' AND DATETIME <= '%s'", GetTagChar("Zeit_Von"), GetTagChar("Zeit_Bis"));
SetPropChar(lpszPictureName, "OLE-Control1", "MsgFilterSQL", sql_string);
Ob der String dann richtig ist musst du selber wissen, ich weiß zumindest nicht was das "#VisibleOnly\" bewirken soll.

Es wird an den Stellen wo %s steht der Text der Variablen "Zeit_Von" und "Zeit_Bis" eingesetzt.
 
Grandios! Ich danke dir ungemein! Das klappt direkt ohne Mucken :D

"#VisibleOnly" Sagt hier: "Zeige mir in angegebenem Alarmcontrol (OLE-Control1) nur Meldungen mit angegebenen Eingenschaften"


So kann ich z.B. auch via DropDown-Menü Meldungen einzelner Teilanlagen selektieren indem ich Meldeblock mit Inhalt vom Textfeld abgleiche:

Code:
switch (GetTagWord ("Teilanlage_Textliste"))
{
case 0: SetPropChar(lpszPictureName, "OLE-Control1","MsgFilterSQL","#VisibleOnly\\TEXT2 IN('Teilanlage A')");
break;
case 1: SetPropChar(lpszPictureName, "OLE-Control1","MsgFilterSQL","#VisibleOnly\\TEXT2 IN('Teilanlage B')");
break;
case 2: SetPropChar(lpszPictureName, "OLE-Control1","MsgFilterSQL","#VisibleOnly\\TEXT2 IN('Teilanlage C')");
break;
default: SetPropChar(lpszPictureName, "OLE-Control1","MsgFilterSQL","#VisibleOnly\\TEXT2 IN()");
break;
}
 
Zurück
Oben