TIA VBS Umwandlung von String zu Int mit CInt

NewbieSPS

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

Ich braeuchte bei einem semigrossen Problem Hilfe. Das Problem scheint beim Befehl "CInt" in meinem Skript zu liegen.
Momentan arbeite ich an einem etwas ausfuehrlicheren WinCC-Thema mit WinCC Professional V14, weshalb ich euch jetzt die genaue Beschreibung des gesamt Projektes ersparen moechte.
Das Problem bremst alles etwas und tritt in einer meiner Functions auf. Die Function dient dazu in einer for-Schleife eine CSV-Datei zu fuettern. Die Anzahl von Schleifendurchlaeufen unterscheidet sich mit jedem Aufruf der Function in einer unbestimmten Reihenfolge. Die jeweilige Anzahl an Schleifendurchlaeufen ist in einer Textliste der HMI-RT gespeichert. Das Auslesen aus der Textliste funktioniert einwandfrei, allerdings als String.
Da ich dann eine Fehlermeldung bei der For-Schleife bekommen habe (irgendwas in Richtung "Typunverträglichkeit" genau weis ich es leider nicht mehr), wollte ich schlicht und ergreifend den String in eine Integervariable konvertieren mit "CInt(Expression)". Allerdings bekomme ich jetzt die Fehlermeldung "Error: Typenunvertraeglichkeit: 'CInt' als Laufzeitfehler in MS VBScript. Ich habe jetzt schon so einiges probiert bekomme aber den Fehler einfach nicht weg.
- auskommentieren der Zeile mit CInt -> Fehler trat nicht mehr auf
- in eine neue "nackte" Variable geschrieben
- in eine interne HMI-Variable per SmartTags geschrieben
- als zu Konvertierende Variable nicht die Script- sondern die HMI-Variable verwendet
Es kam immer wieder (ausser Punkt 1) zum gleichen Fehler. Unten fuege ich den Code an, falls ich einfach nur etwas wegen Codeblindheit uebersehen habe. (Es sind auch alle Versuche mit eingefuegt)
Vielen Dank schonmal an alle, die sich die Zeit nehmen das hier anzusehen und vor allem an diejenigen, die mir weiterhelfen koennen.

Code:
Sub Batch_Ausgabe(ByVal Fct_Name)

Dim Anz_Sollwerte
Dim TempText

Anz_Sollwerte = 0
TempText = ""
Textlist_Index = 10002
[COLOR=#00ff00]
[/COLOR][COLOR=#008000]'Auslesen wieviele Sollwerte die Funktion hat[/COLOR]
LookupText "FKT01-01_Batch_TempText","FKT01-01_Batch_Textlist_Index",HMIRuntime.Language, Fct_Name
TempText = SmartTags("FKT01-01_Batch_TempText")
[B]
[COLOR=#ff0000]Anz_Sollwerte = Cint(TempText)[/COLOR]

[COLOR=#008000]'Anz_Sollwerte = CInt(SmartTags("FKT01-01_Batch_TempText")) 

'SmartTags("FKT01-01_Batch_Textlist_Index") = CInt(TempText)
'Anz_Sollwerte = SmartTags("FKT01-01_Batch_Textlist_Index")[/COLOR]

[/B]For LoopCount = 1 To Anz_Sollwerte
      [COLOR=#008000]'blabla
      'noch unwichtig[/COLOR]
Next
End Sub
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Momentan hat die Variable TempText den Inhalt 2 aber sie kann prinzipiell einen Wert zwischen 0 und 10 annehmen.
Ich hab mir auch das Ergebnis der Konvertierung ausgeben lassen. Es steht wie gewünscht die Zahl 2 drin, aber ich bekomme im Meldefenster immer trotzdem die Fehlermeldung, was einfach nicht sein dürfte meiner Meinung nach.
 
Zuletzt bearbeitet:
Der oben dargestellte TempText läßt sich NICHT in einen Integer umwandeln - was soll denn deiner Meinung nach der Inhalt 'FKT' als Integer ergeben ?
Wenn dich einzelne Teile daraus interessieren so muss du diese erst mit MID ausschneiden und dann diesen Teil in einen Integer umwandeln ...

Gruß
Larry
 
Hallo Newbie,

Frage zur Logik: wie unterscheiden sich den der Texteintrag und der Index deiner Textliste?
Frage deshalb, da du eine Textliste ja nicht chronologisch indizieren musst und deshalb den Index direkt nutzen könntest.

Frage zur Textliste bzw. zum Befehl LookupText: Ist IMMER sichergestellt, dass der Befehl ein Ergebnis zurückgibt, welches wandelbar ist?


Gruß, Fred
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle,
Erstmal vielen Dank für euer Interesse an meinem Problem und der Lösungsfindung. Um mal der Reihe nach zu antworten:

- @Larry Laffer :Danke für den Tipp mit dem Befehl "MID" und für die Auskunft, dass die Konvertierung so nicht funktionieren kann, dann verbeiße ich mich darin jetzt nicht.
Ich weis jetzt leider nicht welchen Wert du genau mit 'FKT' meinst, aber falls es die HMI-Variable ist, die ich auf TempText schreibe, dann erwarte ich bei jedem Aufruf einen Wert zwischen 0 und 10 als
String. Da ich die Textliste erstellt habe bin ich mir auch 100%ig sicher, dass auch immer ein solcher Wert darin steht und nichts anderes.

-@faust : Der Index der Textliste gibt nur die Stelle an auf der in der Textliste zugegriffen wird. Der Texteintrag ist ein einfacher Textstring und diesem Fall immer ein Wert zwischen "0" und "10"
LookupText gibt immer den Wert als String zurück der bei diesem Index hinterlegt ist. Und wie oben gesagt habe ich die Textliste erstellt und zwar immer nach dem gleichen Schema und ich gehe beim
Funktionsaufruf sicher, dass es die Textliste, ich aufrufen will auf Existiert. Und das Ergebnis ist immer ein String

Ich habe mittlerweile auch Antwort vom Siemens-Support bekommen. Dieser meinte das es eigentlich ganz einfach ist:
Das Ergebnis ist ein String, ein String ist ein Array of Char und ein Array kann/hat mehrere Werte und ein einfacher Integer nur einen, deswegen muss man in ein Array of Integer schreiben oder die Inhalte des Char Arrays entsprechend auswerten und zu einem einzelnen Integer umbauen. Ich hab es bisher noch nicht probiert, aber sobald ich ein Ergebnis habe lasse ich es euch wissen. Danke nochmal.

Gruß Newbie
 
Ich habe mittlerweile auch Antwort vom Siemens-Support bekommen. Dieser meinte das es eigentlich ganz einfach ist:
Das Ergebnis ist ein String, ein String ist ein Array of Char und ein Array kann/hat mehrere Werte und ein einfacher Integer nur einen, deswegen muss man in ein Array of Integer schreiben oder die Inhalte des Char Arrays entsprechend auswerten und zu einem einzelnen Integer umbauen. Ich hab es bisher noch nicht probiert, aber sobald ich ein Ergebnis habe lasse ich es euch wissen. Danke nochmal.

Das halte ich mal für einen typischen Siemens Humbug, normal kannst du aus einen String
ohne Umwege über die Funktion "Clng" und "CInt" einen String in einen Zahl Konvertieren.
Problematisch wird es nur wenn der String irgendwelche Zeichen hat die keiner Zahl entsprechen,
wie da währen wie so oft ein oder mehre "Leerzeichen" (die sieht man ja nicht ;))

Aber die könntest du ganz einfach mit den Befehl "Trim" weg bekommen.
 
@rostiger Nagel danke dir, ist eigentlich sehr naheliegend stimmt :p

Ich hab das ganze jetzt so geregelt, weil ich schließlich auch vorwärts kommen muss und mir das als erstes eingefallen ist.
In einer neuen Funktion vergleiche ich den aus LookupText erzeugte String mit "0" bis "10" und gebe entsprechend einen Integerwert mit der Funktion zurück. Falls kein sinniger Wert aus LookupText hervorgeht gebe ich "-1" zurück, wodurch ich dann eine Fehlermeldung erzeugen kann. Ist zwar nicht gerade schön aber funktioniert.

Code:
Function Batch_AnzSollwerte(ByVal AnzSollwerte)
Dim i
'HMIRuntime.Trace("Batch_AnzSollwerte: AnzSollwerte: " & AnzSollwerte & vbCrLf) 
For i = 0 To 11
'HMIRuntime.Trace("Batch_AnzSollwerte: LoopCount: " & i & vbCrLf)
 Select Case i 
  Case 0: If StrComp (AnzSollwerte, "0") = 0 Then
   Batch_AnzSollwerte = 0
   Exit Function
   End If
  Case 1: If StrComp(AnzSollwerte, "1") = 0 Then
   Batch_AnzSollwerte = 1
   Exit Function
   End If
  Case 2: If StrComp(AnzSollwerte, "2") = 0 Then
   Batch_AnzSollwerte = 2
   Exit Function
   End If
  Case 3: If StrComp(AnzSollwerte, "3") = 0 Then
   Batch_AnzSollwerte = 3
   Exit Function
   End If
  Case 4: If StrComp(AnzSollwerte, "4") = 0 Then
   Batch_AnzSollwerte = 4
   Exit Function
   End If
  Case 5: If StrComp(AnzSollwerte, "5") = 0 Then
   Batch_AnzSollwerte = 5
   Exit Function
   End If
  Case 6: If StrComp(AnzSollwerte, "6") = 0 Then
   Batch_AnzSollwerte = 6
   Exit Function
   End If
  Case 7: If StrComp(AnzSollwerte, " 7") = 0 Then
   Batch_AnzSollwerte = 7
   Exit Function
   End If
  Case 8: If StrComp(AnzSollwerte,"8") = 0 Then
   Batch_AnzSollwerte = 8
   Exit Function
   End If
  Case 9: If StrComp(AnzSollwerte, "9") = 0 Then
   Batch_AnzSollwerte = 9
   Exit Function
   End If
  Case 10: If StrComp(AnzSollwerte, "10") = 0 Then
   Batch_AnzSollwerte = 10
   Exit Function 
   End If 
  Case 11:
   Batch_AnzSollwerte = -1
   Exit Function
 End Select 
Next
End Function
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welchen Datentyp hat die HMI-Variable "FKT01-01_Batch_TempText"?
Warum setzt Du nicht gleich die Skript-lokale Variable TempText in die LookupText-Funktion ein?

Lasse Dir mal den ausgelesenen Text anzeigen vor der Konvertierung:
Code:
LookupText TempText, "FKT01-01_Batch_Textlist_Index", HmiRuntime.Language, Fct_Name
[COLOR="#0000FF"]HMIRuntime.Trace("Batch_Ausgabe: TempText='" & TempText &"'" & vbCrLf)[/COLOR] 
Anz_Sollwerte = CInt(TempText)

Was passiert bei folgendem Code? Kommt da auch der Runtimeerror?
Code:
TempText = "2"
Anz_Sollwerte = CInt(TempText)

PS: der Support-Mitarbeiter war wohl noch neu und/oder sehr unerfahren ...

Harald
 
Hallo Newbie,

vielleicht stehe ich ja auf dem Schlauch, aber so richtig verstehe ich den Zusammenhang noch nicht:

1. Du hast also mehrere Textlisten. Den Namen der gewünschten Textliste übergibst du an dein Script. (Kannst du bitte mal einen Screenshot der besagten Textlisten-Inhalte posten?)
2. In der Variable "FKT01_01_Batch_Textlist_Index" ist ein (gültiger?) Index-Wert vorhanden (Wo kommt dieser Wert übrigens her?), mit dessen Hilfe du per LookupText den zugehörigen Wert des entsprechenden Textlistenelements ermittelst.
3. Diesen Wert vom Typ String wandelst du per CInt in einen Wert vom Typ Integer, um ihn dann als Grenzwert für eine Schleife zu verwenden (Logik innerhalb der Schleife erst einmal egal).

Richtig so?

Ich bleibe bei meiner zuvor gestellten Frage: Wieso nutzt du den Textlistenindex (aus der Variablen "FKT01_01_Batch_Textlist_Index") nicht direkt? Auch diesen Wert muss du ja vor Verwendung deines Scriptes zuweisen, oder?


Gruß, Fred
 
Wieso nutzt du den Textlistenindex (aus der Variablen "FKT01_01_Batch_Textlist_Index") nicht direkt?
In den Textlisteneinträgen steht eigentlich eine Zahl (die von LookupText als String geliefert wird), die mit dem Index aber nichts zu tun hat, z.B.:
Eintrag 0: 0
Eintrag 1: 3
Eintrag 2: 5
Eintrag 5: 3
Eintrag 7: 0
Eintrag 8: 2
Eintrag 9: 8

Den Ablauf an sich hast Du richtig verstanden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

ich hatte mir schon so etwas gedacht, bis jetzt aber noch keine Bestätigung bzw. ein Beispiel vom TE gesehen.

Interessant wäre jetzt die Logik hinter diesen Textlisten:
Ist die Auswahl eines Elements der Textliste eine Bedienerhandlung (Modus: Eingabe), oder wird das Element über die Indexvariable ausgewählt (Modus: Ausgabe)?

Im ersten Fall wäre m.M. nach nämlich der "Umweg" der Wertermittlung nicht nötig, zumal dem Script zwar der Name der verwendeten Textliste übergeben wird, die Indexvariable aber immer die gleiche ist -also vorher sowieso explizit gesetzt werden muss.


Gruß, Fred
 
@PN/DP:
- Die HMI-Variable hat den Datentyp "String"

- Ich setze nicht direkt die Skript Variable ein, da es (vom Support bestätigt) Probleme bei der Funktion "LookupText" gibt. Und Zwar ist es so, dass man im WinCC Advanced eben genau das machen kann, mit den Skriptvariablen die Übergabeparameter für "LookupText" bilden. Mit WinCC Professional geht das aus unbekannten Gründen allerdings nicht. Das Thema wurde jetzt schon mehrfach an die Entwicklung weitergegeben, was so viel heißen soll, dass es noch etwas dauern kann bis es behoben wird, oder eine Änderung in der Doku erfolgt, die darauf hinweist

- wenn ich mir "TempText" wie in deinem ersten Beispiel ausgeben lasse bekomme ich als Ergebnis '2' angezeigt

- Wenn ich direkt die "2" in TempText schreibe und dann konvertiere gibt es keinen Laufzeitfehler

- Da ich selber noch ziemlich "grün hinter den Ohren bin" kann ich dazu keine Einschätzung machen

@faust:
Zu 1.: Ja es gibt mehrere Textlisten deren Name so aufgebaut ist "FKT01-01-XX" (XX hat einen Wert von 01 bis 99) den Namen bilde ich mir im Skript und zähle dabei einfach die letzten beiden Ziffern hoch.
Zu 2.: In den Wert "FKT01_01_Batch_Textlist_Index" schreibe ich im Skript den entsprechenden Wert, da (wie hier) am Index "10002" immer die Anzahl an Schleifendurchläufen hinterlegt ist, bei jeder der einzelnen Textlisten. Mit "LookupText" ermittle ich dann den Wert als String, der an diesem Index in der entsprechenden Textliste steht.
Zu 3.: So war der Plan aber mittlerweile wandle ich mit der Funktion, die ich in #8 gepostet habe.

Die Variable "FKT01_01_Batch_Textlist_Index" wird in der gleichen Funktion mehrfach verwenden um an verschiedenen Stellen der Liste noch andere wichtige Werte auszulesen. Außerdem kommt, das Problem dazu was etwas weiter oben in dem Post schon zu PN/DP's Beitrag geschrieben habe. "LookupText" funktioniert in WinCC Professional momentan nur mit HMI-Variablen und sonst nichts anderem.

Die Textlisten darf ich leider so nicht posten aber ich versuche es mal schematisch darzustellen:

Index
Text
Wait
10
Text1 blabla
20
Initialisieren
100
Start RT
200
ValveTitel
900
END
10000
Funktionsname
10001
Funktionsname short
10002
2
10003
Unit
10004
4
 
Zuletzt bearbeitet:
Die Textlisten darf ich leider so nicht posten aber ich versuche es mal schematisch darzustellen:

Index
Text
0Wait
10
Text1 blabla
Bei dieser Textliste enthalten die Einträge gar keine Zahlen?? :confused: Da kann CInt() nicht funktionieren.

Wann wird Dein Script aufgerufen? Wie oft?
Kann es sein, daß die Index-Variable (oder eine Variable woraus der Index berechnet wird) noch nicht aktualisiert ist oder einen falschen Wert enthält und auf einen nicht vorhandenen Textlisten-Eintrag zeigt?
Werden die Texte in den Textlisten-Einträgen dynamisch erzeugt?

CInt() liefert den Runtimeerror, wenn das Ergebnis der Wandlung nicht in einen INT passt oder wenn der String keine Zahl enthält (z.B. ein leerer String ist).

Ich habe leider kein WinCC Prof V14 um das LookupText zu testen, ich meine mit ein paar Tests und Testausgaben müsste man die Ursache des Problems finden und umgehen können. Vielleicht ist es ratsam, für LookupText exklusive "Arbeits"-HMI-Variablen zu nehmen und die Arbeitswerte in/aus den vorhandenen Variablen zu kopieren? Desweiteren könnte man den Wert des Index vielleicht beim Aufruf des Skriptes als Parameter übergeben? Oder nach LookupText prüfen ob ein Leerstring geliefert wurde und LookupText ggf. wiederholen? Oder CLng() verwenden? Oder ...?

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Newbie,

vielleicht hat es nichts zu bedeuten, aber bedeutet "...bekomme ich als Ergebnis '2' angezeigt..."

TempText = " 2 "
ODER
TempText = " '2' "?
(Bitte die Leerzeichen wegdenken, habe sie nur für eine klarere Darstellung eingefügt)


Gruß, Fred
 
- wenn ich mir "TempText" wie in deinem ersten Beispiel ausgeben lasse bekomme ich als Ergebnis '2' angezeigt
Und das nachfolgende "Anz_Sollwerte = CInt(TempText)" erzeugt dann einen Runtimeerror?

Funktioniert vielleicht folgender Code:
Code:
SmartTags("TempIndex") = SmartTags("FKT01-01_Batch_Textlist_Index") 
LookupText SmartTags("TempString"), SmartTags("TempIndex"), HmiRuntime.Language, Fct_Name
SmartTags("FKT01-01_Batch_TempText") = SmartTags("TempString") [COLOR="#008000"]'falls "FKT01-01_Batch_TempText" anderswo benötigt wird[/COLOR]

HMIRuntime.Trace("Batch_Ausgabe: HMI_TempString='" & SmartTags("TempString") &"'" & vbCrLf) 

TempText = SmartTags("TempString")
HMIRuntime.Trace("Batch_Ausgabe: TempText='" & TempText &"'" & vbCrLf) 

Anz_Sollwerte = CInt(TempText)
HMIRuntime.Trace("Batch_Ausgabe: Anz_Sollwerte='" & Anz_Sollwerte &"'" & vbCrLf)

Harald
 
@faust:
Zu 1.: Ja es gibt mehrere Textlisten deren Name so aufgebaut ist "FKT01-01-XX" (XX hat einen Wert von 01 bis 99) den Namen bilde ich mir im Skript und zähle dabei einfach die letzten beiden Ziffern hoch.
:confused:
In Deinem ersten Post übergibts Du den Name der Textliste an das Skript (Sub Batch_Ausgabe(ByVal Fct_Name) ), da ist nicht zu sehen, daß du den richtigen Name erst im Skript zusammenbastelst. Kann es sein, daß der Name falsch zusammengesetzt wird und LookupText aus einer nicht vorhandenen Textliste lesen soll?

"LookupText" funktioniert in WinCC Professional momentan nur mit HMI-Variablen und sonst nichts anderem.
Gilt das auch für den Name der Textliste? Muß der auch per HMI-Variable angegeben werden oder gar als String-Konstante?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
sorry, dass ich mich nicht mehr gemeldet habe, aber ich war das Wochenende unterwegs.
Ich hab die schematische Darstellung der Textliste in #13 angepasst. Habe damals nicht richtig aufgepasst, aber jetzt stimmt es.

Code:
LookupText TempText, "FKT01-01_Batch_Textlist_Index", HmiRuntime.Language, Fct_Name
[COLOR=#0000ff]HMIRuntime.Trace("Batch_Ausgabe: TempText='" & TempText &"'" & vbCrLf)[/COLOR] 
Anz_Sollwerte = CInt(TempText)

Als ich den Code getestet habe kam ich zum Ergebnis " '2' " (Leerzeichen zur Übersicht).
Hängt euch nicht so am "LookupText" auf, das funktioniert einwandfrei, die Zeile wurde zusammen mit dem Siemens-Support erstellt.

Das Hauptproblem ist/war, dass das Ergebnis von "LookupText" als String ausgegeben wird und damit als Array of Char gilt. Deswegen kann man nicht in einen Integer konvertieren. Das wurde mir mittlerweile von 2 Supportmitarbeitern gesagt.

Zu "LookupText": Der Name der Textliste kann auch einen Skriptvariable sein, nur Index und Speicher fürs Ergebnis müssen HMI-Variablen sein.

Ich hoffe ich konnte alle Fragen auf die schnelle klären, falls noch offene Fragen sind einfach drunterschreiben ich versuch so schnell und genau zu antworten.

Gruß Newbie
 
Das Hauptproblem ist/war, dass das Ergebnis von "LookupText" als String ausgegeben wird und damit als Array of Char gilt. Deswegen kann man nicht in einen Integer konvertieren. Das wurde mir mittlerweile von 2 Supportmitarbeitern gesagt.
Hallo Newbie,

diese Aussage vom Siemens Support ist totaler Schmarrn - was sonst als einen String soll CInt() zu Int konvertieren?
Das hat Dir auch Helmut vor ein paar Tagen schon geschrieben und Du hast es als "hilfreichste Antwort" markiert ... und jetzt glaubst Du wieder dem Support? :confused:

Der Code mit dem LookupText und anschließend CInt() funktioniert in jedem mir bekannten WinCC. Nur leider habe ich kein WinCC Professional V14 um Dein Problem nachzustellen. Irgendwie fällt mit schwer mir vorzustellen, daß das CInt() in dem WinCC Prof V14 nicht funktioniert. Die meisten meiner Fragen in Beitrag #14 hast Du noch nicht beantwortet.

Harald
 
Ich würde den Wert aus den Lookup mal direkt in eine TXT Datei schreiben und dann für
die unterschiedlichen Werte immer anhängen, dann sollte man doch sehen was rauskommt.

Vor der Weiter Verarbeitung könntest du ja prüfen ob der Wert ein Zahl ist mit der Funktion "IsNumeric"

Dim MeineVar, MeinProbe
MeineVar = 53 ' Zuweisen eines Werts.
MeinProbe = IsNumeric(MeineVar) ' Gibt den Wert True zurück.
MeineVar = "459.95" ' Zuweisen eines Werts.
MeinProbe = IsNumeric(MeineVar) ' Gibt den Wert True zurück.
MeineVar = "45 Hilfe" ' Zuweisen eines Werts.
MeinProbe = IsNumeric(MeineVar) ' Gibt den Wert False zurück.
 
Zuletzt bearbeitet:
Zurück
Oben