WinCC VBS Laufzeitfehler Überlauf

Martin3G

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

kann mir jemand sagen warum ich in der Zeile 15, rot markiert, ein Laufzeitfehler Ueberlauf: 'objTag_extern.read' bekomme?
Zeile 18 hingegen bringt keine Ueberlauf Fehler.
Der Code-Abschnitt beschreibt den wechsel der beiden Maschinen zwischen Motor -Generator und Generator - Motor.
Das heißt das generatormotor kein Laufzeitfehler schmeisst und das Script funktioniert wie es soll.
motorgenerator hingegen moechte einfach nicht Funktionieren.

Hat jemand eine Idee, ich komm einfach nicht drauf?

Hex: 40040000 Maschine 1 Motor
Hex: 80020000 Maschine 1 Generator


Code:
Sub OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y)                                                                                                             


Dim a, wshshell, key, b
Dim objExcelApp
Dim objWorkbooks
Dim objSheet
Dim objTag_intern, objTag_extern , Zaehler, Zaehler_Trag, Zeichen
Dim MotorGenerator, GeneratorMotor
Dim Uebersetz_G1, Uebersetz_G2
Dim sIniDir, sFilter, sTitle, oDlg, GetFileDlgEx, wsExcel


'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")


[COLOR=#ff0000]If (objTag_extern.read And &H40040000) = &H40040000 Then[/COLOR]
motorgenerator = 1
generatormotor = 0
Elseif (objTag_extern.read And &H80020000) = &H80020000 Then
motorgenerator = 0
generatormotor = 1
Else MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
Exit Sub
End If


Set objTag_extern = HMIRuntime.Tags("Übersetz_G1")
If objTag_extern.Read = 0 Then 
 MsgBox "Kein Übersetzungsverhältnis für G1 angegeben"
 Exit Sub
Else Uebersetz_G1 = objTag_extern.Read
End If


Set objTag_extern = HMIRuntime.Tags("Übersetz_G2")
If objTag_extern.Read = 0 Then 
 MsgBox "Kein Übersetzungsverhältnis für G2 angegeben"
 Exit Sub
Else Uebersetz_G2 = objTag_extern.Read
End If


'Prüfablaufunterbrechungen auf Null setzen
Set objTag_extern = HMIRuntime.Tags("Trag_DWORD_1")
objTag_extern.Write 0
Set objTag_extern = HMIRuntime.Tags("Trag_DWORD_2")
objTag_extern.Write 0
Set objTag_extern = HMIRuntime.Tags("Trag_DWORD_3")
objTag_extern.Write 0
Set objTag_extern = HMIRuntime.Tags("Trag_DWORD_4")
objTag_extern.Write 0


sIniDir = ("D:\\Belastungsvorgaben\\*") 
sFilter = ("Excel (*.xlsx)|*.xlsx|")  
sTitle = ("Excel Auswahlfenster")  
Set oDlg = CreateObject("WScript.Shell").Exec("mshta.exe ""about:<object id=d classid=clsid:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><script>moveTo(0,-9999);eval(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).Read("&Len(sIniDir)+Len(sFilter)+Len(sTitle)+41&"));function window.onload(){var p=/[^\0]*/;new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(p.exec(d.object.openfiledlg(iniDir,null,filter,title)));close();}</script><hta:application showintaskbar=no />""")  


 
oDlg.StdIn.Write "var iniDir='" & sIniDir & "';var filter='" & sFilter & "';var title='" & sTitle & "';"     'öffnet den dialog
GetFileDlgEx = oDlg.StdOut.ReadAll




If  GetFileDlgEx = Empty Then
MsgBox "Abbruch, Bitte wählen Sie beim nächsten mal eine Excel-Datei aus.",vbSystemModal,"Fehler bei der Auswahl"
Else
Set objExcelApp = CreateObject("Excel.Application")
Set objWorkbooks = objExcelApp.Workbooks.Open (GetFileDlgEx)
With objExcelApp






'Laufzeiten einlesen
For Zaehler = 1 To 120
	.Range("B" & Zaehler + 4).Select
	Set objTag_extern = HMIRuntime.Tags("PS" & Zaehler & "t")
	If .ActiveCell.Value = "" Then
	objTag_extern.Write 0
	Elseif .ActiveCell.Value = 0 Or (.ActiveCell.Value > 9 And .ActiveCell.Value < 9000) Then objTag_extern.Write .ActiveCell.Value
	Else
	MsgBox "Das Einlesen wird gestoppt ab Zelle C" & Zaehler + 4
	Zaehler = 120
	objExcelApp.Workbooks.Close
	' Tabelle schließen
	objExcelApp.Quit
	' Excel schließen
	Set objExcelApp = Nothing
	Exit Sub
	End If
Next


'Solldrehzahl Abtrieb einlesen
For Zaehler = 1 To 120
	.Range("C" & Zaehler + 4).Select
	Set objTag_intern = HMIRuntime.Tags("P" & Zaehler & "n")
	Set objTag_extern = HMIRuntime.Tags("PS" & Zaehler & "n")
	If .ActiveCell.Value = "" Then
	objTag_intern.Write 0
	objTag_extern.Write 0
	Elseif .ActiveCell.Value = 0 Or (.ActiveCell.Value > 9 And .ActiveCell.Value < 5400) Then 
	objTag_intern.Write .ActiveCell.Value
		If Motorgenerator = 1 Then
		objTag_extern.Write  .ActiveCell.Value * Uebersetz_G1 / Uebersetz_G2
		Elseif generatormotor = 1 Then
		objTag_extern.Write  .ActiveCell.Value * Uebersetz_G2 / Uebersetz_G1
		Else objTag_extern.Write 0
		End If
	Else
	MsgBox "Das Einlesen wird gestoppt ab Zelle A" & Zaehler + 4
	Zaehler = 120
	objExcelApp.Workbooks.Close
	' Tabelle schließen
	objExcelApp.Quit
	' Excel schließen
	Set objExcelApp = Nothing
	Exit Sub	
	End If
Next


'Solldrehmoment Abtrieb einlesen
For Zaehler = 1 To 120
	.Range("D" & Zaehler + 4).Select
	Set objTag_extern = HMIRuntime.Tags("PS" & Zaehler & "M")
	If .ActiveCell.Value = "" Then
	objTag_extern.Write 0
	Elseif .ActiveCell.Value = 0 Or (.ActiveCell.Value > 9 And .ActiveCell.Value < 40000) Then 
	objTag_extern.Write .ActiveCell.Value
	Else
	MsgBox "Das Einlesen wird gestoppt ab Zelle B" & Zaehler + 4
	Zaehler = 120
	objExcelApp.Workbooks.Close
	' Tabelle schließen
	objExcelApp.Quit
	' Excel schließen
	Set objExcelApp = Nothing
	Exit Sub
	End If
Next


'Prüfablaufunterbrechungen für Tragbildaufnahmen (T) einlesen
For Zaehler = 1 To 119
	.Range("E" & Zaehler + 4).Select
	Set objTag_extern = HMIRuntime.Tags("Trag_" & Zaehler)
	For Zaehler_Trag = 1 To Len(.ActiveCell.Value) 
 		Zeichen = Mid(.ActiveCell.Value, Zaehler_Trag, 1) 
 		If Zeichen = "T" And .cells((Zaehler+4),3).value > 0 Then
 		objTag_extern.Write 1 
 		End If
	Next
Next


End With


objExcelApp.Workbooks.Close
' Tabelle schließen
objExcelApp.Quit
' Excel schließen
Set objExcelApp = Nothing
MsgBox "Einlesen der Excel-Datei erfolgreich beendet",vbSystemModal


End If


End Sub



mfg Martin3G
 
Vielleicht weil durch das "And &H40040000" das Bit .31 (Vorzeichen) ausgeblendet wird, was VBS vielleicht als unzulässig für den Datentyp ansieht?

Welches WinCC verwendest Du eigentlich? Ist das tatsächlich nötig, mit Objektreferenzen von HMI-Variablen zu arbeiten, kannst Du nicht auch einfacher schreiben:
Code:
Tag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")

If (Tag_extern And &H40040000) = &H40040000 Then
...

HMIRuntime.Tags("Trag_DWORD_1") = 0
...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

arbeite mit Wincc 7.4 Sp1 Up3.
Dein Vorschlag schmeisst leider auch ein Fehler, Das Objekt unterstützt diese Eigenschaft oder Methode nicht.
Wenn ich glatt Hex. 40000000 > bit 30 nehme meckert er auch.


Code:
Dim Tag_extern


'On Error Resume Next
'Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
'If (objTag_extern.read And &H40040000) = &H40040000 Then


[COLOR=#ff0000]Tag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")[/COLOR]
If (Tag_extern And &H40040000) = &H40040000 Then
motorgenerator = 1
generatormotor = 0


'Elseif (objTag_extern.read And &H80020000) = &H80020000 Then


Elseif (Tag_extern And &H80020000) = &H80020000 Then
motorgenerator = 0
generatormotor = 1
Else MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
Exit Sub
End If

mfg Martin3G
 
Stehe bei diesem Thread mal wieder mit dem Zitieren auf Kriegsfuss.
Versuche es deshalb deshalb so

Code:
[COLOR=#ff0000]If (objTag_extern.read And &H40040000) = &H40040000 Then
[/COLOR]    motorgenerator = 1
    generatormotor = 0
Elseif (objTag_extern.read And &H80020000) = &H80020000 Then
    motorgenerator = 0
    generatormotor = 1
Else[B] [COLOR=#0000ff][U][I]MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"[/I][/U][/COLOR] ' [/B][B][I][U][COLOR=#0000ff]>>>===> in die nächste Zeile!?[/COLOR][/U][/I][/B]
    Exit Sub
End If

' also:

Code:
' ...
    generatormotor = 1
[B]Else 
    MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"[/B]
    Exit Sub
' ...

ebenso in
Code:
Set objTag_extern = HMIRuntime.Tags("Ãœbersetz_G1")
If objTag_extern.Read = 0 Then 
    MsgBox "Kein Übersetzungsverhältnis für G1 angegeben"
    Exit Sub
Else [COLOR=#0000ff][U][I][B]Uebersetz_G1 = objTag_extern.Read ' >>>===> in die nächste Zeile!?[/B][/I][/U][/COLOR]
End If

Set objTag_extern = HMIRuntime.Tags("Ãœbersetz_G2")
If objTag_extern.Read = 0 Then 
    MsgBox "Kein Übersetzungsverhältnis für G2 angegeben"
    Exit Sub
Else [COLOR=#0000ff][B][I][U]Uebersetz_G2 = objTag_extern.Read [/U][/I][/B][/COLOR][B][I][U][COLOR=#0000ff]' >>>===> in die nächste Zeile!?[/COLOR][/U][/I][/B]
End If

Oder verkraftet VBS tatsächlich die verwendete Schreibweise? Wenn ja: ich hab nix gesagt! ;o)
Gruss, Heinileini
 
Hi,

ich hab leider nach wie vor das gleiche Problem mit dem Ueberlauf in besagter Zeile, If (objTag_extern.read And &H40040000) = &H40040000 Then.
Hat ein vielleicht noch eine Idee, was den Fehler ausloesen kann?

Wenn ich die Betriebsart umschalte auf generatormotor, Elseif (objTag_extern.read And &H80020000) = &H80020000 Then, Funktioniert alles prima.
Und des gibt keinen Ueberlauf Fehler.


mfg Martin3G
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie genau äußert sich denn dieser Überlauf?
Welche Meldung bekommst du wenn du hinter der betroffenen Zeile ein Trace einfügst.
Welchen Wert und Datentyp hat eigentlich dein HMIRuntime.Tags("Digi_S7_WinCC1").

Also, so auf die Art
Code:
HMIRuntime.Trace(CStr(objTag_extern.read))
TestVar = objTag_extern.read And &H40040000
HMIRuntime.Trace(Err.Description)
HMIRuntime.Trace(CStr(TestVar))
HMIRuntime.Trace(Err.Description)

Oder kommt die Meldung schon vom Compiler? Wie lautet die dann genau?

@heinileini: Das mit der Operation in der selben Zeile mit dem Else sollte jeder Compiler korrekt übernehmen. Dafür sind die Delimiter "Else" und "End If" j ja schließlich da.
 
Zuletzt bearbeitet:
2 Anmerkungen dazu :
Ich kann auch nicht zweifelsfrei sagen, warum du da einen Fehler bekommst. Entscheidender wäre aber für mich zu wissen, was noch geht.
Somit würde ich mir den Wert (objTag_extern.read) erstmal in eine Variable schreiben und anschauen, was da din steht.
Dann würde ich dies Maskieren. Danach bräuchtest du nur noch zu überprüfen, ob dein Ergebnis <> 0 ist. Das macht es ggf. auch schon einfacher - also :
Code:
TestVar = objTag_extern.read
TestVar2 = TestVar and &H40040000
TestVar3 = TestVar2 <> 0
... jetzt wüßtest du ggf. etwas präziser, was nicht geht ...

Gruß
Larry
 
Code:
TestVar2 = TestVar and &H40040000
TestVar3 = TestVar2 <> 0
Das ist nicht dasselbe! Ungleich 0 wird es, sobald eines der beiden maskierten Bits 1 ist, nicht erst, wenn beide 1 sind.

@Ronin:
In VBA (was dem VBS nicht unähnlich ist) habe ich früher CompilerMeckereien damit geerntet und deshalb schon ewig nicht mehr probiert, noch etwas anderes als Kommentare in die Else-Zeile zu schreiben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

hier meine Erkenntnisse.

Mit On Error Resume Next gibt er mir das aus:

TestVar = objTag_extern.read
TestVar2 = TestVar and &H40040000
TestVar3 = TestVar2 <> 0

M1_Mot: Hex: 40040000
TestVar = 1074017024
TestVar2 = 1074003968
TestVar3 = Wahr
also müsste das doch hinhauen


TestVar = objTag_extern.read
TestVar2 = TestVar and &H80020000
TestVar3 = TestVar2 <> 0

Betriebsarten Umschaltung
M1_Gen: Hex: 80020000
TestVar = 2147627776
TestVar2 = NULL, also nichts, leer
TestVar3 = Falsch

Wird On Error Resume Next auskommentiert gibt er mir diesen Fehler aus.

Als ob Digi_S7_WinCC1 ein Überlauf produziert.
Schalte ich die Betriebsart um komme ich in die &H40040000 Schleife.

============Laufzeitfehler in Microsoft VBScript============
Application : PDLRT
Picture : Prueflauf1.pdl_Events
Function : Sub Button8_OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y)
Line : 17
Error : Überlauf: 'objTag_extern.read'
============Laufzeitfehler in Microsoft VBScript============





mfg Martin 3G
 
Zuletzt bearbeitet:
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")

... dann muss ich jetzt mal anders fragen :
Woher kommt denn die Sub-Methode 'read' ? Es sieht für mich so aus als wenn dein Object diese Methode nicht hat.
Was passiert denn, wenn du das .read wegläßt ?

Gruß
Larry
 
ok ich werte das jetzt über die Dezimalzahlen aus, das Funktioniert wenigstens.
Und Produziert kein Überlauf.

Code:
'On Error Resume Next


Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")


'If (objTag_extern.read And &H40043300) = &H40043300 Then


If (objTag_extern.read = 1074017024) Then
MsgBox "Motorgenerator"
motorgenerator = 1
generatormotor = 0


'Elseif (objTag_extern.read And &H80023300) = &H80023300 Then


Elseif (objTag_extern.read = 2147627776) Then
MsgBox "Generatormotor"
motorgenerator = 0
generatormotor = 1
Else 
MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
Exit Sub
End If

Würde mich trotzdem interessieren voran das liegt, wenn jemand was weiß, Bitte schreiben.

Danke an alle

mfg Martin3G
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn ich das read weglasse bei

If (objTag_extern.read And &H40043300) = &H40043300 Then

also so

If (objTag_extern And &H40043300) = &H40043300 Then

, wenn ich das richtig verstanden habe.
Gibt er mir ein Fehler aus:

Das Objekt unterstützt diese Eigenschaft oder Methode nicht.


mfg Martin3G
 
Für "Error : Überlauf: 'objTag_extern.read' " habe ich keine Erklärung, aber sollen die maskierten Bits mit
UND oder ODER verknüpft werden?
In der ursprünglichen Version war es UND (3a) und jetzt sind wir bei ODER (3b).

Code:
[FONT=courier new]TestVar = objTag_extern.read
TestVar2 = TestVar and &H40040000
TestVar3b = TestVar2 <> 0          ' true, wenn Bit30=1 [B]ODER[/B] Bit18=1
TestVar3a = TestVar2 = &H40040000  ' true, wenn Bit30=1 [B]UND[/B]  Bit18=1

TestVar = objTag_extern.read
TestVar2 = TestVar and &H80020000
TestVar3b = TestVar2 <> 0          ' true, wenn Bit31=1 [B]ODER[/B] Bit17=1
TestVar3a = TestVar2 = &H80020000  ' true, wenn Bit31=1 [B]UND[/B]  Bit17=1
[/FONT]

Meckert Microsoft VBScript etwa, wenn Bit31=1 ist?
Gruss, Heinileini
 
Also ich erinnere, dass es in V7.2 einen Bug gab, da konnte man Bit 31 nicht nutzen.
Fehler kam keiner aber ich hatte es mal als Tastenbit und das hat sich einfach geweigert.
Sollte doch aber gefixt sein inzwischen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was passiert denn, wenn man im ursprünglichen ...

Code:
[COLOR=#ff0000]If (objTag_extern.read And &H40040000) = &H40040000 Then
[/COLOR]    motorgenerator = 1
    generatormotor = 0
Elseif (objTag_extern.read And &H80020000) = &H80020000 Then
    motorgenerator = 0
    generatormotor = 1
Else 
    MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
    Exit Sub
End If
... die Reihenfolge der beiden Abfragen tauscht, also ...
Code:
If (objTag_extern.read And &H80020000) = &H80020000 Then
    motorgenerator = 0
    generatormotor = 1
Elseif (objTag_extern.read And &H40040000) = &H40040000 Then
    motorgenerator = 1
    generatormotor = 0
Else 
    MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
    Exit Sub
End If
...?
Ich vermute/erwarte, dass dann immer noch die erste Abfrage (die jetzt aber eine andere ist) zur Meldung führt.
Es wird anscheinend nicht das "objTag_extern.read" an sich bemeckert, sondern es liegt wahrscheinlich doch an den Daten, die zufällig bei der ersten Abfrage anstehen und eingelesen werden.
Ich habe irgendwie das Bit31 in Verdacht. Wird in objTag_extern.read mit Typ DINT statt UDINT gearbeitet?

Ihr macht mich ganz kribbelig, wenn ich sehe, wie ihr die Masken hin- und her "optimiert". Ich habe keine Ahnung, was die einzelnen Bits zu bedeuten haben, aber irgendjemand sollte sich doch wohl darüber Gedanken gemacht und mit Absicht die jeweils 2 Bits festgelegt haben.

Gruss, Heinileini

PS:
Ich sehe gerade:
Also ich erinnere, dass es in V7.2 einen Bug gab, da konnte man Bit 31 nicht nutzen.
Fehler kam keiner aber ich hatte es mal als Tastenbit und das hat sich einfach geweigert.
Sollte doch aber gefixt sein inzwischen...
Das klingt doch sowas von plausibel!
Der Fix bestand sicherlich darin, jetzt die Meldung zu produzieren!? ;o)
 
Zuletzt bearbeitet:
Mir fällt auf, Du führst mehrmals die Methode Read aus. Das ist zwar nicht die Ursache Deines Problems, ist aber trotzdem nicht in Ordnung. Schreibe mal so:
Code:
'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
objTag_extern.Read

If (objTag_extern.Value And &H40040000) = &H40040000 Then
  motorgenerator = 1
  generatormotor = 0
ElseIf (objTag_extern.Value And &H80020000) = &H80020000 Then
  motorgenerator = 0
  generatormotor = 1
Else
  MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
  Exit Sub
End If

Der Runtime-Error ist vermutlich nicht davon abhängig, mit welchem Wert Du den Value AND-maskierst, sondern davon, welchen Wert der Value hat. Ich erinnere mich, daß ich bei irgendeinem VB-Dialekt in irgendeiner Version Probleme mit AND hatte, wenn das .31 gesetzt ist. Vielleicht ist das auch in VBS bei WinCC V7.4 so?
Probiere mal so:
Code:
'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
objTag_extern.Read

Tag_extern = CLng(objTag_extern.Value)

If (Tag_extern And &H40040000) = &H40040000 Then
  motorgenerator = 1
  generatormotor = 0
ElseIf (Tag_extern And &H80020000) = &H80020000 Then
  motorgenerator = 0
  generatormotor = 1
Else
  MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
  Exit Sub
End If

... oder so:
Code:
'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
objTag_extern.Read

If objTag_extern.Value < 0 Then '.31 gesetzt!
  Tag_extern = (objTag_extern.Value - &H80000000) / &H10000 + &H8000
Else
  Tag_extern = objTag_extern.Value / &H10000
End If

If (Tag_extern And &H4004) = &H4004 Then
  motorgenerator = 1
  generatormotor = 0
ElseIf (Tag_extern And &H8002) = &H8002 Then
  motorgenerator = 0
  generatormotor = 1
Else
  MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
  Exit Sub
End If

Harald
 
PS: irgendwo kommt doch der Wert HMIRuntime.Tags("Digi_S7_WinCC1") her - können dort nicht andere Bits festgelegt werden, oder eine HMI-Variable mit nur den oberen 16 Bits angelegt werden oder noch besser die Prüfung in der SPS ausgeführt werden mit einfachem Ergebnis 0, 1 oder 2 in eine dritte Variable?

Man kann sich in der Visu auch "zu Tode" skripten bei Aufgaben, die eigentlich Aufgabe der SPS sind. ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald
Mir fällt auf, Du führst mehrmals die Methode Read aus. Das ist zwar nicht die Ursache Deines Problems, ist aber trotzdem nicht in Ordnung.
Ist mir auch "aufgestossen". Habe aber Stillschweigen bewahrt, weil ich sehr interessant fand, dass anscheinend immer nur der erste Aufruf bemeckert wird und nie(?) der zweite.

Der Runtime-Error ist vermutlich nicht davon abhängig, mit welchem Wert Du den Value AND-maskierst, sondern davon, welchen Wert der Value hat. Ich erinnere mich, daß ich bei irgendeinem VB-Dialekt in irgendeiner Version Probleme mit AND hatte, wenn das .31 gesetzt ist. Vielleicht ist das auch in VBS bei WinCC V7.4 so?
Ich habe nicht wahrgenommen, dass die AND-Verknüpfung überhaupt Probleme macht.
Aber warum sollen ausgerechnet bei MicroSoft Leute am werkeln sein, die auf die harten Anforderungen dieses Forums Rücksicht nehmen? Wenn man 31 von 32 Bits benutzen kann, sind das doch immerhin schon bemerkenswerte knappe 97%!!! ;o)
Vermutlich ist/war es egal, ob der erste oder zweite Operand die Herausforderung beinhaltet (könnte man ja testen). Ich denke das Problem tritt/trat erst beim Ausführen der Verknüpfung auf.

Gruss, Heinileini
 
puh, ich muss mal gucken ob ich alles zusammen bekomme, wenn was fehlt nochmal schreiben.

so:

Für "Error : Überlauf: 'objTag_extern.read' " habe ich keine Erklärung, aber sollen die maskierten Bits mit
UND oder ODER verknüpft werden?
In der urspruenglichen Version war es UND (3a) und jetzt sind wir bei ODER (3b).

es soll mit UND verknuepft werden da
Bit 30 (M1_Motor) & Bit 18 (M2_Generator) deswegen &H40040000 und
Bit 31 (M1_Generator) & Bit 17 (M2_Motor) deswegen &H80020000

so denk ich mir das

/////////////////////////////////////////////////////////////////////////
Was passiert denn, wenn man im ursprünglichen ...
... die Reihenfolge der beiden Abfragen tauscht, also ...
es wird ebenfalls ein Ueberlauf festgestellt

Ich habe irgendwie das Bit31 in Verdacht. Wird in objTag_extern.read mit Typ DINT statt UDINT gearbeitet?

Wird im Variablenhaushalt mit Vorzeichenloser 32 bit Wert definiert.

/////////////////////////////////////////////////////////////////////////


Der Runtime-Error ist vermutlich nicht davon abhängig, mit welchem Wert Du den Value AND-maskierst, sondern davon, welchen Wert der Value hat. Ich erinnere mich, daß ich bei irgendeinem VB-Dialekt in irgendeiner Version Probleme mit AND hatte, wenn das .31 gesetzt ist. Vielleicht ist das auch in VBS bei WinCC V7.4 so?
Probiere mal so:
Code:
'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
objTag_extern.Read

Tag_extern = CLng(objTag_extern.Value)

If (Tag_extern And &H40040000) = &H40040000 Then
motorgenerator = 1
generatormotor = 0
ElseIf (Tag_extern And &H80020000) = &H80020000 Then
motorgenerator = 0
generatormotor = 1
Else
MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
Exit Sub
End If

CLng Laufzeitfehler Überlauf

... oder so:
Code:
'On Error Resume Next
Set objTag_extern = HMIRuntime.Tags("Digi_S7_WinCC1")
objTag_extern.Read

If objTag_extern.Value < 0 Then '.31 gesetzt!
Tag_extern = (objTag_extern.Value - &H80000000) / &H10000 + &H8000
Else
Tag_extern = objTag_extern.Value / &H10000
End If

If (Tag_extern And &H4004) = &H4004 Then
motorgenerator = 1
generatormotor = 0
ElseIf (Tag_extern And &H8002) = &H8002 Then
motorgenerator = 0
generatormotor = 1
Else
MsgBox "Keine Betriebsart für Maschine 1 und Maschine 2 angegeben"
Exit Sub
End If

M1_Motor + M2_Generator Funktioniert Excel Tabelle kann ausgewaehlt werden.
M1_Generator + M2_Motor IF-Afrage MsgBox "Betriebsart fuer Maschine 1 und Maschine 2 angegeben"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

PS: irgendwo kommt doch der Wert HMIRuntime.Tags("Digi_S7_WinCC1") her - koennen dort nicht andere Bits festgelegt werden, oder eine HMI-Variable mit nur den oberen 16 Bits angelegt werden oder noch besser die Pruefung in der SPS ausgefuehrt werden mit einfachem Ergebnis 0, 1 oder 2 in eine dritte Variable?

Leider nein, wurde im alten Projekt so Festgelegt auf dem ich aufbaue bzw. das Sps-Programm aufbaut.

ich hoffe ich konnte alles beantworten, wenn nicht einfach fragen

mfg Martin3G
 
Zuletzt bearbeitet:
Woher kommt denn die Sub-Methode 'read' ? Es sieht für mich so aus als wenn dein Object diese Methode nicht hat.
Was passiert denn, wenn du das .read wegläßt ?
Das passt schon.
Die .Read-Methode aktualisiert die Eigenschaft .Value des Tag-Objektes und liefert diese auch zurück.
Hier aus dem Beispiel zum Lesen einer Variablen aus dem WinCC-Scripting-Manual
Code:
'Lesen des Wertes einer Variablen "Tag1":
'VBS13
Dim objTag
Set objTag = HMIRuntime.Tags("Tag1")
objTag.Read()
MsgBox objTag.Value
TestVar1 = objTag.Read() - Aktualisert .Value und schreibt den Wert in TestVar1
TestVar1 = objTag - Wird normalerweise wie objTag.Value behandelt und liefert den Wert ohne Aktualiserung retour.
Deshalb ist die Standardvorgehensweise für den Zugriff unter WinCCv7 normalerweise .Read()

Jetzt aber zum Problem.
Die Eigenschaft .Value ist als Long deklariert.

Beispiel:
Code:
On Error Resume Next
Dim objTag, objTag2


Set objTag = HMIRuntime.Tags("Digi_S7_WinCC1_DWORD")
Set objTag2 = HMIRuntime.Tags("Digi_S7_WinCC1_DWORD2")


objTag.Write &H[COLOR=#ff0000][B]7[/B][/COLOR]0020000
objTag2.Write &H[B][COLOR=#ff0000]8[/COLOR][/B]0020000


HMIRuntime.Trace "Err " & Err.Description
Der Code wird fehlerfrei ausgeführt, jedoch landet nur der Wert &H80020000 nicht in der Variablen.
Wenn man die Tags zum Beobachten auf EA-Felder legt, dann erscheint nur der Wert &H70020000. Das andere EA-Feld zeigt den alten Wert.

Jetzt ist dann die Frage wie man das jetzt lösen kann.
 
Zuletzt bearbeitet:
Zurück
Oben