Sonstiges Softing OPC Toolbox, Problem beim schreiben von Date_and_Time, VB.net

neero

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

derzeit stellt sich mir die Aufgabe einen Zeitstempel und ein paar andere Werte einer S7 zu übergeben.
Deklariert habe ich die Variablen in der OPC-Aliasdatei wie folgt:

Code:
wDatum_Uhrzeit    DB160.DBB10:DATE_AND_TIME

Das funktioniert meines Wissens auch bestens, jedenfalls kann ich den darin befindlichen Default-Wert auslsen.
Probleme bereitet mir das schreiben.
Programiert wird meine Windows-Anwendung mit vb.net.
Die Softing Toolbox bietet mir da ja nette Möglichkeiten mit der write-Methode die Daten zu übergeben.
Soweit so gut. Einfache Char-Werte wie ich sie in z.B.:

Code:
wBarcode_1_0    DB160.DBB56:CHAR

schreibe, stellen kein Problem dar. Die werden 1a in den Baustein geschrieben. Hier mein vb.net-Code:

Code:
Dim tmp As String = "16.12.2013 14:09:28"
Dim b(7) As Byte

b(0) = Convert.ToInt32(tmp.Substring(8, 2))
b(1) = Convert.ToInt32(tmp.Substring(3, 2))
b(2) = Convert.ToInt32(tmp.Substring(0, 2))
b(3) = Convert.ToInt32(tmp.Substring(11, 2))
b(4) = Convert.ToInt32(tmp.Substring(14, 2))
b(5) = Convert.ToInt32(tmp.Substring(17, 2))
b(6) = 0
b(7) = 0

Dim itemIdsw As String() = New String() {"S7-F3/wDatum_Uhrzeit", "S7-F3/wBarcode_1_0"}

Dim values As ValueQT() = New ValueQT(1) {}
values(0) = New ValueQT(b, EnumQuality.QUALITY_NOT_SET, New DateTime)
values(1) = New ValueQT(Asc(wvalues(0)), EnumQuality.QUALITY_NOT_SET, New DateTime)

session.Write(itemIdsw, Nothing, values, results, executionOption)

Das erzeugen der Session etc hab ich jetzt mal weggelassen... das klappt ja.

Wichtig wäre mir dieses b, in das ich versuche die von der S7 geforderten Bytes zu schreiben.
Byte 0 = Jahr 90-89
Byte 1 = Monat 01...12
Byte 2 = Tag 1-31
Byte 3 = Stunde 0...23
Byte 4 = Minute 0...59
Byte 5 = Sekunde 0...59
Byte 6 und 7 brauche ich nicht, da setzte ich 0 ein.

Wie schon gesagt, mit dieser Methode funktioniert das schreiben aller Werte, nur das Date_and_Time nimmt den Wert nicht an.

Was übersehe ich da? Kann mir da jemand Helfen?

Schon mal danke fürs anschauen...
 
Hallo,
dein Problem besteht darin, dass du sehr wahrscheinlich kein brauchbares DT übergibst.
In jedem der Bytes steht nicht der jeweilige Wert absolut sondern BCD-codiert drin. Das würde z.B. für das Jahr bedeuten, dass du da nicht 13 (für 2013) hineinschreibst sondern Hex 13 = dezimal 19.
Ich würde jetzt also die Byte-Array-Zuweisung wie folgt ändern :
Code:
b(0) = Convert.ToInt32(tmp.Substring(8, 1)) * 16 + Convert.ToInt32(tmp.Substring(9, 1))
... das mußt du jetzt natürlich für jede weitere Zeile entsprechend machen (wenn du den String als Basisquelle verwenden willst).

An einer Stelle bin ich mir jetzt aber nicht ganz sicher : In einem der Bytes steckt auch der Wochentag drin. Ich hatte schon mal den Fall gehabt, dass das DT nicht angenommen wurde (das war aber n.m.M. bei einem Siemens-Bediengerät) weil der Wochentag nicht passend zum Datum zugewiesen war. das wirst du aber schnell sehen ... (wenn es ohne den trotzdem nicht funktioniert).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

erstmal danke!
Ich hab das jetzt mal so probiert und die INT-Werte in BCD codiert... wie du vorgeschlagen hast.
Da ich ja die Milisekunden nicht benötige, habe ich es so gemacht, dass ich in bit 6 11ms reinschreibe (natürlich in BCD).
In bit 7 (höherwertige Stelle) kommt dann noch zusätliche 1ms und der Wochentag in die niederwertige Stelle. Dabei muss ich beachten, dass die Methode now.DayOfWeek für Sonntag den Wert 0 liefert und in der S7 der Sonntag bei 1 anfängt. Also immer schön +1.

Lange Worte kurzer Sinn... es funktioniert leider immernoch nicht. :-(

So siehts im Code aus aus:

Code:
Dim tmp As String = "18.12.2013 14:58:49"
Dim b(7) As Byte
        b(0) = Convert.ToInt32(tmp.Substring(8, 1)) * 16 + Convert.ToInt32(tmp.Substring(9, 1))
        b(1) = Convert.ToInt32(tmp.Substring(3, 1)) * 16 + Convert.ToInt32(tmp.Substring(4, 1))
        b(2) = Convert.ToInt32(tmp.Substring(0, 1)) * 16 + Convert.ToInt32(tmp.Substring(1, 1))
        b(3) = Convert.ToInt32(tmp.Substring(11, 1)) * 16 + Convert.ToInt32(tmp.Substring(12, 1))
        b(4) = Convert.ToInt32(tmp.Substring(14, 1)) * 16 + Convert.ToInt32(tmp.Substring(15, 1))
        b(5) = Convert.ToInt32(tmp.Substring(17, 1)) * 16 + Convert.ToInt32(tmp.Substring(18, 1))
        b(6) = Convert.ToInt32(1) * 16 + Convert.ToInt32(1)
        b(7) = Convert.ToInt32(1) * 16 + Convert.ToInt32(get_day(n))
Das get_day(n) ermittelt mir den DayOfWeek im "Siemsens-Format".
Und das ist das Ergebnis:

b(0) = 19
b(1) = 18
b(2) = 24
b(3) = 20
b(4) = 88
b(5) = 73
b(6) = 17
b(7) = 20

Das blöde ist, dass man da keine Fehlermeldung bekommt sondern einfach nur nix reingeschrieben wird.
 
Probiere es doch mal mit einem OPC-Test Client, da sollte Softing doch einen mitliefern.
Als erstes versuchst du mit dem Test-Client eine Variable vom Typ Date_and_time zu lesen, und dann zu schreiben.
Dann schaust du mal nach welcher Variant-Datentyp beim OPC-Testclient diese Variable hat.

Ich habe schon OPC-Server gehabt, bei denen ein Date_and_time auf den Variant-Typ String umgesetzt worden ist. Das ist auch nicht unpraktisch, weil es einem dieses BCD-Gepfriemel erspart.

In welchem Datentyp der OPC-Server den Datentyp gerne hätte, sollte er dir im Wert für CanonicalDataType mitteilen.

Ich möchte aber wetten dass das alles im Handbuch zum Softing OPC-Server steht.
 
Hallo,

ok das mit dem umfriemeln in BCD und Byte-Array kann man getrost weglassen... das direkte schreiben als String funktioniert.

Der Demo-Client schreibt und liest natürlich auch... damit hatte ich ja überprüft ob was reingeschrieben wird.
Der Datentyp ist BSTR, das zeigt mir der Demo-Client auch an.

Ich hatte das zwar schon ganz am Anfang probiert... ohne Erfolg... sonst wär ich ja nicht auf das byte da umgestiegen... doch da muss ich in der Zwischenzeit wohl einen anderen Fehler ausgebessert haben und nun geht alles!

Danke Euch beiden für die schnelle Hilfe! Is ja schon fast peinlich... :???:
 
Zurück
Oben