Problem ARRAY of STRUCT S7 -> WinCC flex 2008

sps-concept

Level-1
Beiträge
2.240
Reaktionspunkte
251
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

vielleicht stand ja schon mal einer vor dem Problem. Ich habe in der S7 ein Array of STRUCT mit Datentypen DATE_AND_TIME und INT drin. Diese Daten brauche ich jetzt im WinCCflex. Array of Struct sind dort nicht möglich. Nun kam mir die Idee ein Word-Array über die gesamte Grösse zu deklarieren und für die Bestandteile des Struct auf WinCC-Seite je 1 Array anzulegen. Nur wie bekomme ich DATETIME wieder zusammengesetzt ohne dass ein Typkonflikt (rot) kommt.

Code:
' Datum/Uhrzeit auslesen
DT_1 =  SmartTags("DB_Datenbank_1")(Index * Lae_Struct)
DT_2 =  SmartTags("DB_Datenbank_1")(Index * Lae_Struct +1)
DT_3 =  SmartTags("DB_Datenbank_1")(Index * Lae_Struct +2)
DT_4 =  SmartTags("DB_Datenbank_1")(Index * Lae_Struct +3)
SmartTags("Datenbank_DT")(Index) =  ( [COLOR=red]DT_1 & DT_2 & DT_3 & DT_4[/COLOR] ) 
' Typ auslesen  
SmartTags("Datenbank_Typ")(Index) = SmartTags("DB_Datenbank_1")(Index * Lae_Struct +4)

Vielelicht hat auch noch jemand ne zündende Idee die ohne Einzelvariablen auskommt.

André
 
S7_Date_And_Time aus Words rekonstruieren

Hallo André,

Dein Panel-internes Variablenarray "Datenbank_DT" ist doch vom Typ DateTime?

Mit
Code:
SmartTags("Datenbank_DT")(Index) =  ( [COLOR="Red"]DT_1 & DT_2 & DT_3 & DT_4[/COLOR] )
erzwingst Du eine Stringverkettung, das Ergebnis ist ein String, der aber bei der Zuweisung zu "Datenbank_DT" nicht in DateTime konvertiert
werden kann, weil der String nicht im VBS-Datum-Format ist.

Numerisch die Words zu QWord addieren geht leider nicht, weil VBS keinen 64-Bit-Integer hat.
Mir fällt jetzt keine Möglichkeit ein, die SmartTags byteweise zu manipulieren, ohne daß die VBS-Typprüfung/konvertierung dazwischenfunkt.

Du must also die Words zerlegen und daraus ein VBS-Date erzeugen. Probiere mal:
Code:
SmartTags("Datenbank_DT")(Index) = _
      DateSerial( 2000 + (DT_1 \ &H1000000) * 10 + ((DT_1 \ &H10000) AND 15), _
                  ((DT_1 \ &H100) AND 15) * 10 + (DT_1 AND 15), _
                  (DT_2 \ &H1000000) * 10 + ((DT_2 \ &H10000) AND 15) ) _
    + TimeSerial( ((DT_2 \ &H100) AND 15) * 10 + (DT_2 AND 15), _
                  (DT_3 \ &H1000000) * 10 + ((DT_3 \ &H10000) AND 15), _
                  ((DT_3 \ &H100) AND 15) * 10 + (DT_3 AND 15) )
Ich hoffe, das funktioniert so. Ich habe grad kein WinCC flex hier zum testen. Eventuell sind auch H-Byte und L-Byte vertauscht.
DT_4 wird nicht benötigt (enthält Millisekunden und Wochentag).

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Datetime

Hallo Harald,

danke erstmal. Ja Datenbank_DT ist DATETIME. Das mit dem Zusammensetzen war auch nur schematisch gemeint. Leider hab ich keine entsprechenden Befehle gefunden. SHIFT_AND_MASK geht auch nicht für 4 Worte.

Sinn der Übung ist Statistiken gleich vom Panel erzeugen zu lassen bzw bestimmte Datensätze die der Bediener sucht auch gleich dort auszuwählen und nur den Arrayindex an die SPS zu geben. Aber wenn der Aufwand auf HMI-Seite zu gross wird bzw die Geschichte zu unübersichtlich dann werde ich in der SPS ein Bubblesort für die Structs mit verschiedenen Sortierkriterien in der SPS realisieren.

André
 
Wenn es nicht zu viele Daten sind, dann würde ich auch die Daten schon in der SPS so sortieren, wie das Panel die braucht und ohne Aufwand direkt anzeigen kann.

Gruß
Harald
 
sortieren

naja ist ne Lagerbelegung mit ca 2000 Datensätzen mit je 1 * DATETIME, 3 * INT die nach den verschiedensten Kriterien sortiert bzw durchsucht werden sollen. Das hätte das Panel besser erledigt.

André
 
Zurück
Oben