TIA Bild öffnen über Variable

Zuviel Werbung?
-> Hier kostenlos registrieren
Filemode ist falsch. Ein Wunder, dass überhaupt eine Datei erzeugt wird...
8 bedeutet nämlich anhängen (vorhandene Datei erweitern)
Wir wollen aber neue Dateien komplett erzeugen. Deshalb ist imho ,2 (Output) richtig. Oder filemode=2 statt 8
Du musst die vorhandenen Dateien löschen, das hast du in deinem Script in #58 rausgenommen. (Kill Methode)

Dein Fehler sagt aus, dass das Bild nicht aktiviert wurde. Ich schätze mal, dass entweder Bildnummer oder Name in dem Aufrufscript falsch sind.
 
Filemode ist falsch. Ein Wunder, dass überhaupt eine Datei erzeugt wird... ��
8 bedeutet nämlich anhängen (vorhandene Datei erweitern)
Wir wollen aber neue Dateien komplett erzeugen. Deshalb ist imho ,2 (Output) richtig. Oder filemode=2 statt 8
FILE_MODE = 8 (= attend) sollte auch funktionieren.
Ich schreibe neue Dateien nur so und hatte damit bis dato noch keine Probleme.
 
Hab’s jetzt mal mit 2 versucht.
Der FILE_MODE macht auch nur einen Unterschied, wenn die Datei schon besteht.
Dann wird mit der 2 der bisherige Inhalt gelöscht, mit der 8 nicht.
Gibt's die Datei nicht, wird in beiden Fällen neu angelegt und geschrieben.

Rein vom Logischen her ist in diesem Fall die 2 natürlich das hier wirklich gewollte.
Da diese Dateibefehle aber oft einfach nur von Script zu Script kopiert werden und es hier durch das vorherige kill keinen Unterschied macht, würde ich persönlich trotzdem die 8 bevorzugen.



PS:
Und der geschilderte Fehler selbst kommt ja eh' nicht vom Schreiben in die Datei, sondern vom Versuch, die Objekteigenschaften auf der (nicht?) aktuellen Seite zu lesen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt meinen Bildnamen und Bildnummer mal ganz simpel eingestellt. Bildnummer 2;Bildname Bild
trotzdem bekomme ich die selbe Fehlermeldung. Liegt es kann noch mit dem Befehl "If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then" etwas nicht stimmen
Bild1.JPGArchiv.JPG
Code:
Dim fso,fs, path, file,allfiles

Dim obj
Dim dummy
Dim n
Const file_mode = 2  

n = 0
If HmiRuntime.ActiveScreen.ObjectName <> "Overview" Then
    ActivateScreenByNumber n,1
    ShowSystemAlarm "Keine Datei angelegt, weil der Focus nicht im Permanentbereich war."
    Exit Sub
End If
Set fso = CreateObject("filectl.filesystem")

path = "\FLASH\CSV\"
file = Bildname & ".csv"
allfiles = path & "*.*"

If fso.dir(path) = "" Then      ' Path not available?
   fso.mkdir(path)              '    Create new directory
End If

file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set fso = CreateObject("filectl.file")

fso.open file,file_mode
fso.lineprint Bildnummer 
fso.lineprint Bildname
    
ActivateScreenByNumber Bildnummer,0



If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then
    For Each obj In HmiRuntime.Screens(Bildname).ScreenItems
        fso.lineprint obj.ObjectName
        'ShowSystemAlarm "Untersuchtes Objekt: " & obj.ObjectName
    Next
End If
fso.Close


ActivatePreviousScreen


Set fso = Nothing
Set file = Nothing
Set obj = Nothing
End Sub
 
Zuletzt bearbeitet:
Sicher, das es im aufrufenden Script keine Diskrepanz zwischen Bildname und Bildnummer gibt?
Braucht das Bild vielleicht 'ne Weile bevor es (aufgebaut und) abfragbar ist?

Eventuell benötigt es auch eine Verzögerung/Wartezeit nach dem ActivateScreen bis auf die Objekte auf dem Bild zugegriffen werden kann.
Ich hab' für solche Fälle ein Verzögerungsscript, welches ich dann aufrufe:
Code:
Sub vbDelay(ByVal DelayMilliSeconds)

'Script:		vbDelay
'Version:		1.00
'Author:		hucki
'issue Date:		23.03.2019
'last modified:		23.03.2019
'State:			draft
'
'Function:		Generates a time delay
'			Attention! No other scripts can be run in the meantime!
'			Erzeugt eine Zeitverzögerung 
'			Achtung! Zwischenzeitlich können keine weiteren Scripts ausgeführt werden!
'                    
'changes:		.
'

	On Error Resume Next							' Activate error handling
	
	Const F_DAY = 24, F_HOUR = 60, F_MINUTE = 60, F_SECOND = 1000		' Factors of next larger units
	Const F_EXE = 20							' Factor execution time
	
	Dim StartTime, StopTime, DelayTime, F_Delay				' Needed vars
	
	
	F_Delay   = F_DAY * F_HOUR * F_MINUTE * F_SECOND *F_EXE			' Calculate delay factor
	DelayTime = DelayMilliSeconds / F_Delay					' Calculate delay
	StartTime = Now								' Start time
	StopTime  = StartTime + DelayTime					' Stop  time
 	
	Do 
	Loop Until Now >= StopTime						' Queue
	
	
	On Error GoTo 0								' Deactivate error handling

End Sub
Verwendung in Deinem Script:
Code:
...
    ActivateScreenByNumber Bildnummer,0
    vbDelay 1000                                         			' Wait a sec
...


PS:
Mal noch der Aufruf nur mit Bildname, um mögliche Fehlerquellen zu reduzieren:
Code:
...
    HmiRuntime.BaseScreenName = Bildname					' Change screen
    vbDelay 1000                                         			' Wait a sec
...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Dummy Zeile hatte ich rausgenommen weil ich rum probiert habe.
Es hatte auch mit dummy nicht funktioniert.

Bei der Lösung mit dem neuen Script meckert er mit der 1000 er meint zu viele Parameter.

Ich habe langsam keine Idee mehr woran es noch liegen kann. Ich versuch ja zur Zeit auch nur mit einem Bild zu arbeiten und nicht mal das nimmt er ^^.

Wenn ich das erstemal nach dem Neustart drücke : legt er die Datei \FLASH\CSV\Bild.csv an und bringt mir zeitgleich den Fehler no screen´Bild´either the screen is not displayed currently or the Name is misspelled.

Drücke ich erneut den Button kommt: Keine Datei angelegt, weil der Focus nicht im Permanentbereich war.

Sowohl der Button zur Dateierstellung und das Suchfeld befinden sich im Permanentbereich

vbBildFinden
Code:
Sub vbBildFinden()
Dim fs,f, path, file, data
Dim n
Dim text
Dim strSuchtext
path = "flash\CSV"
 
Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")
If fs.FolderExists(path) Then
 Set f = f.GetFolder(path)
 If f.Files.Count > 0 Then
  strSuchtext = SmartTags("strObjektname")  
  For Each file In f.Files
   Set data = f.OpenTextFile(file,1)
   n = data.ReadLine()
   text = data.ReadAll
   If InStr(1,text,strSuchtext) Then 
    n = CInt(n)
    ActivateScreenByNumber n,0
    Exit For
   End If
   data.Close
  Next   
 Else
  ShowSystemAlarm "Keine Dateien gefunden."
 End If    
Else
 ShowSystemAlarm "Datenordner nicht gefunden."
End If
  
Set fs = Nothing 
Set f = Nothing 
Set data = Nothing  
Set file = Nothing
End Sub
dieses ist mit dem Suchfeld verknüpft (Ereignis bei Eingabe abgeschlossen)

vbObjektdateiErstellen
Code:
Sub vbObjektdateiErstellen(ByVal Bildnummer, ByVal Bildname)
Dim fso,fs, path, file,allfiles
Dim obj
Dim dummy
Dim n
Const file_mode = 2  
n = 0
If HmiRuntime.ActiveScreen.ObjectName <> "Overview" Then
    ActivateScreenByNumber n,1
    ShowSystemAlarm "Keine Datei angelegt, weil der Focus nicht im Permanentbereich war."
    Exit Sub
End If
Set fso = CreateObject("filectl.filesystem")
path = "\FLASH\CSV\"
file = Bildname & ".csv"
allfiles = path & "*.*"
If fso.dir(path) = "" Then      ' Path not available?
   fso.mkdir(path)              ' Create new directory
End If
file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set fso = CreateObject("filectl.file")
fso.open file,file_mode
fso.lineprint Bildnummer 
fso.lineprint Bildname
    
ActivateScreenByNumber Bildnummer,0
HmiRuntime.BaseScreenName = Bildname     ' Change screen
vbDelay 1000                                            ' Wait a sec
                                              
 
If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then
    For Each obj In HmiRuntime.Screens(Bildname).ScreenItems
        fso.lineprint obj.ObjectName
        'ShowSystemAlarm "Untersuchtes Objekt: " & obj.ObjectName
    Next
End If
fso.Close

ActivatePreviousScreen

Set fso = Nothing
Set file = Nothing
Set obj = Nothing
End Sub
dieses ist mit einem Button im Permanentbereich verknüpft (Ereignis beim Drücken)

vbAufrufDateierstellung
Code:
Sub vbAufrufDateierstellung()
vbObjektdateiErstellen 2,"Bild"
End Sub

vbDelay
Code:
Sub vbDelay()
Dim DelayMilliSeconds
'Script:  vbDelay
'Version:  1.00
'Author:  hucki
'issue Date:  23.03.2019
'last modified:  23.03.2019
'State:   draft
'
'Function:  Generates a time delay
'   Attention! No other scripts can be run in the meantime!
'   Erzeugt eine Zeitverzögerung 
'   Achtung! Zwischenzeitlich können keine weiteren Scripts ausgeführt werden!
'                    
'changes:  .
'
 On Error Resume Next       ' Activate error handling
 
 Const F_DAY = 24, F_HOUR = 60, F_MINUTE = 60, F_SECOND = 1000  ' Factors of next larger units
 Const F_EXE = 20       ' Factor execution time
 
 Dim StartTime, StopTime, DelayTime, F_Delay    ' Needed vars
 
 
 F_Delay   = F_DAY * F_HOUR * F_MINUTE * F_SECOND *F_EXE   ' Calculate delay factor
 DelayTime = DelayMilliSeconds / F_Delay     ' Calculate delay
 StartTime = Now                  ' Start time
 StopTime  = StartTime + DelayTime     ' Stop  time
  
 Do 
 Loop Until Now >= StopTime      ' Queue
 
 
 On Error GoTo 0        ' Deactivate error handling
 
End Sub
 
Bei der Lösung mit dem neuen Script meckert er mit der 1000 er meint zu viele Parameter.
Du hast den Übergabeparameter DelayMilliSeconds für das Script nicht angelegt!
(In den allgemeinen Script-Eigenschaften auf der rechten Seite unter Parameter eintragen.)

In der Titelleiste muss dann:
Code:
Sub vbDelay([B][COLOR=#008000][U]ByVal DelayMilliSeconds[/U][/COLOR][/B])
stehen.


PS:
Deswegen musstest Du das "DIM DelayMilliSeconds" anlegen. Das muss dann wieder raus!
 
Zuletzt bearbeitet:
Du hast doch ein funktionierendes Projekt für Windows Betriebssystem.

Alles was angepasst werden muss, sind die Filefunktionen in zwei Scripten.

Der ganze andere Rest hat doch gepasst.
Jetzt sind da irgendwelche Timer drinnen, notwendige Zeilen gelöscht, Aufrufe geändert usw.
Alles Änderungen, die mit dem Anpassen auf WinCE absolut nix zu tun haben.

Mein Tip...

Geh zurück auf das Script von Post#51, das müsste schon fast passen.
Evtl. reicht es schon die Zeile
Code:
[COLOR=#333333][FONT=Courier]If fso.dir(path) <> "" Then fso.kill(path)[/FONT][/COLOR]
in
Code:
[COLOR=#333333][FONT=Courier]If fso.dir(path) <> "" Then fso.kill(path + “*.*“)[/FONT][/COLOR]

zu ändern.

Alles was du erreichen musst ist, dass die Dateien in deinem CSV Ordner gelöscht werden.
Der Rest läuft dann schon auf deinem Panel.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe nochmal alles gelöscht und wie in Post 51 beschrieben gemacht und kill(path+"*.*" eingefügt.

Aber die Fehlermeldung bleibt bestehen : no screen … also quasi selber Fehler wie vorher. Der Fehler soll in der Zeile If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then liegen.
 
Die Zeile ist absolut sauber.
Das Problem ist, dass das Bild nicht aktiviert ist.

Passiert der gleiche Fehler wenn du das aktuelle Projekt simulierst?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich hatte jetzt mein Bild offen. Es kam auch keine Fehlermeldung jetzt wollte ich etwas Suchen da meckert er : Object doesnt Support this proberty or method „fs.FolderExists“
 
Würde das vbBildFinden Skript so wie es ist auch mit Händischen Excel Listen funktionieren? Das wäre ja noch eine Alternative falls ich es nicht anders zum laufen bekomme ^^
 
Meinst du mit simulieren die Seite geöffnet zu haben wenn ich den Button drücke ?

Eigentlich hatte ich gemeint, dass du die Zeilen mit Filefunktionen auskommentierst, und dann die Windows Simulation startest, und dann prüfst, ob der Fehler auch unter Windows kommt.

Falls das unter Windows nicht so ist, dann gibt es doch mehr Unterschiede zwischen WinCE und Windows als gedacht...
Falls der Fehler unter Windows auch kommt, dann liegt’s an dir :D


Also ich hatte jetzt mein Bild offen. Es kam auch keine Fehlermeldung jetzt wollte ich etwas Suchen da meckert er : Object doesnt Support this proberty or method „fs.FolderExists“
Wurde die Datei korrekt angelegt?

Bei diesem Script (Bild finden) müssen die Filefunktionen auch angepasst werden...
Hier ist es noch anspruchsvoller als im „Erstellen“ Script.

Würde das vbBildFinden Skript so wie es ist auch mit Händischen Excel Listen funktionieren? Das wäre ja noch eine Alternative falls ich es nicht anders zum laufen bekomme ^^

Prinzipiell ist es dem Script egal woher die Dateien kommen.
Allerdings musst auch hier die Filefunktionen auf jeden Fall anpassen...

Welche TIA Version benutzt du?
Kannst das Projekt mal hochladen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein die Datei wird nich angelegt, es wird nur der Ordner CSV angelegt aber dieser ist leer. Trotzdem meckert er das die Datei bereits existiert dann lösche ich den CSV Ordner und er erstellt wieder den Ordner ohne Datei.

Er hatte aber schonmal Dateien angelegt diese konnte ich aber mit dem Excel was unter CE installiert ist auch nicht öffnen. Müsste die Datei vielleicht auch eine andere Endung haben wie .xls statt .csv.

Mit dem Simulieren weiß ich leider nicht wie du das m einst ich habe bis jetzt noch nicht mit Skripten oder der Simulation gearbeitet :confused:

Ich nutze TIA Portal V15.1 ich weiß nicht ob das was nützt ?

Aber wie gesagt mir würde es auch schon helfen wenn ich mir die Excel Tabelle erstelle und er mir das dann raussucht.
 
Ich hab' mal das Projekt von SPSKILLER so abgewandelt, dass es bei mir sowohl in der Simulation als auch auf einem Panel (TP900) mit WinCE läuft.
Zusätzlich sind noch einige eigene Bedürfnisse, wie z.B. mehrsprachige Meldungen, mit integriert.
Zu den WinCE-Dateibefehlen wird automatisch gewechselt.


Das Wichtigste beim Erstellen der csv-Dateien:
... der Fokus muss auch im Permanentbereich (z.B. Suchfeld) sein. ...
Es muss also unbedingt ein IO-Feld im Permanentbereich existieren, welches den Fokus auch erhalten kann.
Wen der ständig sichtbare Permanentbereich aber stört (so wie mich), kann die Höhen sowohl des IO-Feldes als auch die des Permanentbereiches auf 0 setzen. Das Script zum csv-Erstellen arbeitet trotzdem, sofern der Fokus irgendwie (z.B. per Script) vorher! zum IO-Feld gekommen ist.
Damit konnte ich vor allem die Schaltfläche zum csv-Erstellen aus dem Permanentbereich herauslösen, da man die ja nur selten benötigt. Die Suche selbst kann sich eh' überall befinden.


PS:
:confused:
...
->Gib hier auf jeden Fall einen Zielpfad an, wo keine wichtigen Dateien drin sind. Wenn er da nämlich was findet, dann löscht er erstmal, bevor die neuen Dateien geschrieben werden. ...
K.A. was da bei mir anders ist, denn bei mir hat das Löschen auch schon in der Simulation mit dem Originalprojekt nicht funktioniert.
Daher habe ich das ebenfalls noch etwas modifiziert, so das auch in der Simulation genau wie beim Panel nur noch alle eventuell im Ordner enthaltenen Dateien gelöscht werden.


PPS:
Download ist jetzt hier.
 
Zuletzt bearbeitet:
sauber hucki :sm24:

Läuft es auf nem CE Panel ähnlich schnell wie in der Windows Runtime?

Btw. ich hatte mal noch probiert die Dateien nur beim Runtime Start zu erstellen.
Das ist eigentlich noch besser, denn dann brauchst gar keinen Button mehr.

Ich schätze mal nicht, dass Objekte dynamisch während der Runtime angelegt werden...
 
Zuletzt bearbeitet:
Zurück
Oben