TIA Bild öffnen über Variable

:confused:
Warum tut man sich so'n umständlichen und aufwendigen Krams für schon zur Projektierung feststehende Bilder an?


Was spricht z.B. gegen den oft verwendeten und einfachen Weg einer Textliste mit (vorhandenen und ggf. auch nur den erlaubten) Bildnummern und zugehörigen Bildnamen, einem symbolischen EA-Feld mit dieser Textliste und bei Ereignis "Änderung" -> "AktiviereBildMitNummer" und der Nummer des gewählten Bildes aus der Textliste?
(Der Geräteassistent fügt z.B. bei entsprechender Aktivierung ein solches Naviagationsfeld auf der Vorlagenseite ein, falls ein Beispiel dafür benötigt wird.)


:confused::confused:
Darf der Benutzer nicht wissen, welche Bilder vorhanden sind, sondern soll diese erraten?
Ist es für die Benutzer wirklich einfacher, den Bildnamen einzugeben statt auszuwählen?
Ist die Pflege der Bilder-Textliste zu aufwendig für den Programmierer?

Fragen über Fragen zu dem bis dato gewählten Vorgehen.

:confused::confused::confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hucki

Natürlich darf der Bediener wissen welche Bilder vorhanden sind, nur leider wissen erfahrungsgemäß die meisten nicht auf welchen Seiten sie welches Aggregat finden sollen.
Im Permanentbereich sieht der Bediener alle verfügbaren Seiten. Ich wollte nur gern eine Art Suche für die einrichten, die wie die nicht wissen wo sie was finden.
Ich hatte das ganze schonmal mit einer Textliste als Dropdown Menü gelöst. Es ist aber nicht abzusehen wie viele Aggregate noch hinzukommen, sodass die Dropdown Lösung zu unübersichtlich ist.
 
Reicht dann nicht auch sowas in der Art:
Code:
Sub ScreenSel(ByRef ScreenName)

    ScreenName = LCase(Replace(ScreenName," ", ""))
    
    If    ScreenName = "motor1" _
       Or ScreenName = "motor2" _
    Then
        ActivateScreen "Motor_1", 0
    
    ElseIf    ScreenName = "motor3" _
           Or ScreenName = "motor4" _
    Then
        ActivateScreen "Motor_3", 0
    
    Else
        '...
    End If

End Sub
(ungetestet)
oder was Vergleichbares mit Select Case?
 
Oder gar so:
Code:
Sub ScreenSel(ByRef ScreenName)

	On Error Resume Next					' Activate error handling

		HmiRuntime.BaseScreenName = ScreenName		' Change screen
		If Err.Number > 0 Then				' Screen is missing?
			'...
		End If

	On Error GoTo 0						' Deactivate error handling

End Sub
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hier mal das Projekt mit dem Suchen in Dateien...

Damit es bei dir läuft (Simulator) musst du

1. einmalig im Script vbBildFinden und im Script vbObjektdateierstellen die Variable path für deinen Rechner anpassen. Bei mir legt er die Dateien in D:\Temp\CSVs an.
->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. Wenn es den Ordner noch nicht gibt, wird er angelegt.

2. das Script vbAufrufDateierstellung an deine Bilder anpassen (Bildnummern und Namen; das Beispiel arbeitet mit 20 Suchbildern)

3. der Button zum Erstellen der Dateien muss im Permanentbereich sein, und der Fokus muss auch im Permanentbereich (z.B. Suchfeld) sein.

Wenn das alles gegeben ist, dann werden die Objekte in den Bildern gefunden.
Wenn du ein bereits vorhandenes Suchbild änderst (Aggregate dazukommen oder gelöscht werden), dann müssen die Dateien neu erstellt werden (Button drücken...)
Wenn du ein neues Suchbild hast, oder eins wegfällt, dann musst du das im Script vbAufrufDateierstellung anpassen.

Wenn es auf dem Simulator nach deinem Geschmack ist, dann musst du zur Verwendung auf WinCE Panels die Scripte anpassen, da das Filesystemhandling etwas anders ist.
Da ich aber grad kein Panel zur Hand habe kann ich das nicht testen.
 

Anhänge

Vielen Dank SPSKILLER für die Mühe, ich habe deine Version mal getestet.Sieht ganz gut aus morgen probiere ich es mal aus .;)
 
So ich habe das ganze mal versucht umzusetzen.

Ich habe den Dateipfad angepasst am Test Panel ist es der interne Speicher (Flash) dort habe ich den Ordner CSV erstellt
path = "flash\CSV"

Dann habe ich versucht auf das Filehandlingsystem zu achten
Set f= CreateObject("filectl.file")

Jedoch bekomme ich bei Drücken auf den Button die Meldung "Object doesn´t support this proberty or method:´f.FolderExists"
 
Danke PN/DP da muss ich nur noch den Fehler finden
Code:
Sub vbObjektdateiErstellen(ByVal Bildnummer, ByVal Bildname)
Dim f,fs, path, file
Dim obj
Dim dummy
Dim n
n = 0
If HmiRuntime.ActiveScreen.ObjectName <> "Overview" Then
 ActivateScreenByNumber n,0
 ShowSystemAlarm "Keine Datei angelegt, weil der Focus nicht im Permanentbereich war."
 Exit Sub
End If
Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")

path = "flash\CSV"
file = Bildname & ".csv"
 
file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set file = file.LinePrint(file, True)
file.LinePrint "Bildnummer" 
file.LinePrint "Bildname"
    
ActivateScreenByNumber Bildnummer,0
dummy = HmiRuntime.ActiveScreen.ObjectName 'irgendeinen Scheiss ansprechen
If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then
 For Each obj In HmiRuntime.Screens(Bildname).ScreenItems
  file.LinePrint obj.ObjectName
  'ShowSystemAlarm "Untersuchtes Objekt: " & obj.ObjectName
 Next
End If
file.Close
ActivatePreviousScreen
Set fs = Nothing
Set file = Nothing
Set obj = Nothing
End Sub
 
probers mal so... ohne Gewähr

Code:
Dim fso, path, file
Dim obj
Dim dummy
Dim n


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"


If fso.dir(path) <> "" Then fso.kill(path)
fso.mkdir(path)


file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set fso = CreateObject("filectl.file")
fso.open file,2
fso.lineprint Bildnummer 
fso.lineprint Bildname
    
ActivateScreenByNumber Bildnummer,0
dummy = HmiRuntime.ActiveScreen.ObjectName 'irgendeinen Scheiss ansprechen


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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Neuer Versuch neue Fehlermeldung:ROFLMAO:ROFLMAO:ROFLMAO:

Jetzt meckert er in der Zeile 21 das wäre If fso.dir(path) <> "" Then fso.kill(path) Fehlermeldung : ´The System cannot find the file specified´ in Zeile 21 des Scripts <vbObjektdateierstellen>von Script <vbAufrufDateierstellung>
 
path ist bei Dir kein Dateiname sondern ein Ordnername. Ein Ordner kann nicht mit Kill(path) gelöscht werden.
Versuche mal so:
Code:
path = "\FLASH\CSV\"
file = Bildname & ".csv"
allfiles = path & "*.*"

If fso.dir(allfiles) <> "" Then fso.kill(allfiles)
fso.mkdir(path)


file = path & file
Ich kann es gerade nicht testen: möglicherweise liefert fso.Dir("\FLASH\CSV") und/oder fso.Dir("\FLASH\CSV\*.*") in leeren Ordnern "." (das ist auch ein Ordner) - Kill() findet in leeren Ordnern aber keine Datei.

Tipp: mache Dir bei Problemen Debug/Testausgaben in den Code mit ShowSystemAlarm um z.B. den Inhalt von Variablen zu sehen

Harald
 
So habe das ganze wieder getestet.

das erste Problem war fso.mkdir(path) dort hat er mir einen Fehler gebracht, das habe ich behoben indem ich statt path den Pfad angegeben habe \Flash\CSV\

allerdings erstellt er dir Ordner nur einmal. Wenn ich wieder auf den Button drücke meckert er das das Verzeichnis schon existiert, dann muss ich es erst händisch löschen.

Den zweiten Fehler bringt er mir bei fso.open file (Wrong number of Arguments or invalid proberty assignment "fso.open"
Code:
Dim fso,fs, path, file,allfiles
Dim obj
Dim dummy
Dim n

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(allfiles) <> "" Then fso.kill(allfiles)
fso.mkdir("\FLASH\CSV\")

file = path & file

file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set fso = CreateObject("filectl.file")
fso. open file
fso.lineprint Bildnummer 
fso.lineprint Bildname
    
ActivateScreenByNumber Bildnummer,0
dummy = HmiRuntime.ActiveScreen.ObjectName 'irgendeinen Scheiss ansprechen

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem Code vom Harald löscht Du nicht mehr das bereits vorhandene Verzeichnis, sondern nur die eventuell darin enthaltenen Dateien.
Daher musst Du IF mit ELSE erweitern:
Code:
If fso.dir(path) = "" Then      ' Path not available?
   fso.mkdir(path)              '    Create new directory
else
   fso.kill(allfiles)           '    Delete all files
end if
PS:
Ich hab' mit kill noch nicht gearbeitet. Daher weiß ich nicht, wie es reagiert, wenn der Ordner schon leer ist.
Also eventuell auch so:
Code:
If fso.dir(path) = "" Then fso.mkdir(path)          ' Path not available?
If fso.dir(allfiles) <> "" Then fso.kill(allfiles)
/PS



fso.open file erfordert noch die Angabe des Öffnungsmodus.
Meistens wird die 8 für anhängen verwendet und ich persönlich erstelle für sowas ganz am Anfang des Codes Konstanten, um bei Änderungen nicht überall suchen zu müssen:
Code:
CONST FILE_MODE = 8             ' File mode: 1 = read, 2 = write, 8 = attend

...

fso.open file, FILE_MODE
 
Zuletzt bearbeitet:
So habe das ganze wieder getestet.

das erste Problem war fso.mkdir(path) dort hat er mir einen Fehler gebracht, das habe ich behoben indem ich statt path den Pfad angegeben habe \Flash\CSV\

allerdings erstellt er dir Ordner nur einmal. Wenn ich wieder auf den Button drücke meckert er das das Verzeichnis schon existiert, dann muss ich es erst händisch löschen.

Den zweiten Fehler bringt er mir bei fso.open file (Wrong number of Arguments or invalid proberty assignment "fso.open"
Code:
Dim fso,fs, path, file,allfiles
Dim obj
Dim dummy
Dim n

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(allfiles) <> "" Then fso.kill(allfiles)
fso.mkdir("\FLASH\CSV\")

file = path & file

file = path + file
ShowSystemAlarm "Datei angelegt: " & file
Set fso = CreateObject("filectl.file")
fso. open file
fso.lineprint Bildnummer 
fso.lineprint Bildname
    
ActivateScreenByNumber Bildnummer,0
dummy = HmiRuntime.ActiveScreen.ObjectName 'irgendeinen Scheiss ansprechen

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

Wo ist das ,2 aus meinem Script geblieben 😜
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja die ,2 ist irgendwo untergegangen :lol:

Ich habe den Code jetzt nochmal angepasst. Nun erstellt das Panel auch eine csv Datei von meinem "Hauptbild"(Startbild) aber mehr nicht.

Fehler ´screen item unnamed (item(3,91) of type ´HMIIOField´in screen ´14.0.Hauptbild

Fehler in Zeile 39 das wäre fso.lineprint obj.ObjectName

Code:
Sub vbObjektdateiErstellen(ByVal Bildnummer, ByVal Bildname)
Dim fso,fs, path, file,allfiles
Dim obj
Dim dummy
Dim n
Const file_mode = 8  
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
 
Okay ich habe die Seite mal rausgenommen. Die Fehlermeldung ist nun auch weg.

jetzt motzt er ´no screen ´1.0.Werkstatt´eitherthe screen is not displayed currently or the Name is mispelled´in Zeile 37

Zeile 37
Code:
37If HmiRuntime.Screens(Bildname).ScreenItems.Count > 0 Then
   38 For Each obj In HmiRuntime.Screens(Bildname).ScreenItems
     39   fso.lineprint obj.ObjectName
     40   'ShowSystemAlarm "Untersuchtes Objekt: " & obj.ObjectName
 
Zurück
Oben