Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Problème d'instance fso, accessoirement sous wincc15.1 | Erreur 53 (fichier introuvable) https://www.developpe
    Bonjour à tous,

    j’essaie d'initialiser des comboBox (listes déroulantes) sous wincc avec des scripts VBS.
    Les textes sont stockés dans dans des fichiers textes. Deux listes déroulantes afin de sélectionner une matière selon une catégorie.
    Donc la première comboBox permet de sélectionner la catégorie, dont dépendra la seconde comboBox. La première (catégorie) s'initialise au chargement de la vue (Sub OnGenerateScreen()).

    Voici le code:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Sub OnGenerateScreen()
    'Lire le fichier texte "intrants-Cat.txt" et affecter chaq'une de ces lignes 
    'aux lignes de textes de la liste déroulante
    On Error Resume Next
    '***	Création des objets File explorer et TextStream
    Dim fso, folder, file,f,ts,extend, temp
    folder="C:\SupTools"
    extend=".txt"
    file = "Intrants-Cat" & extend 
     
    temp = isFolderExists(folder)
    isFileExists folder, file 
     
    '***	Affectation des textes de la liste déroulante
     
    Dim i, nbLine, list,  filePath,buf
    filePath = folder &"\"& file
    ReadFile folder,file 
    nbLine=SmartTags("nbLine")
    ToTrace "231-nbFile: ", nbLine
    Set list = ScreenItems("Liste_cat") ' On créé on objet "liste déroulante" existant!!
    list.Visible = False
    list.CountVisibleItems = nbLine
     
    For i = 1 To nbLine
    	list.SelectedIndex= i  
    	'list.SelectedText = buf(i)
    	list.SelectedText = SmartTags("Line_"&i)
    Next
    list.Index=1
    list.Visible = True
     
    Set list = Nothing
    For i = 1 To nbLine 
    	SmartTags("Line_"&i)=""
    Next
    If Err.Number <> 0 Then 
    	ToTrace "OnGenerateScreen erreur n°:",Err.Number
    	ToTrace "ReadFile description erreur :",Err.Description
    	ToTrace "ReadFile context erreur :",Err.Source
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub

    Le script isFolderExists:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Function isFolderExists(ByVal chemin)
    Dim fso, f, NewFile
    On Error Resume Next 
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(chemin) Then
    	'ToTrace " isFolderExist(chemin)", chemin
    	fso.CreateFolder(chemin)		
    	isFolderExists=0
    Else
    	'ToTrace "Le dossier exist déjà", 1
    	'ToTrace " Son chemin:", chemin
    	isFolderExists=1
    End If
    Set fso = Nothing
    If Err.Number <> 0 Then 
    	ToTrace "isFolderExist erreur n°:",Err.Number
    	ToTrace "isFolderExist description erreur :",Err.Description
    	Err.Clear
    End If
    On Error GoTo 0
    End Function


    Script isFileExists:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub isFileExists(ByVal dossier, ByVal fichier)
    Dim fso, f, NewFile
    On Error Resume Next 
    Set fso = CreateObject("Scripting.FileSystemObject")
    ToTrace "chemin:" , dossier & "\" & fichier
    ToTrace "fso Fileexists: " , fso.FileExists(dossier & "\" & fichier)
    If Not fso.FileExists(dossier & "\" & fichier) Then
    	If fichier = "Intrants-cat.txt" Then
    		ToTrace " Si absence de Intrants-Cat.txt, alors on le créé.", 1
    		Set NewFile = fso.CreateTextFile(dossier & "\" & fichier)
    		NewFile.WriteLine("FUMIERS")
    		NewFile.WriteLine("AUTREAGRI")
    		NewFile.WriteLine("BOUES")
    		NewFile.WriteLine("LISIERS")
    		NewFile.WriteLine("MATIERES VEGETALES")
    		NewFile.Close
    		Set NewFile = Nothing
    		'isFileExists=0
    	Else			
    		Set NewFile = fso.CreateTextFile(dossier & "\" & fichier)
    		NewFile.WriteLine("NOUVEAU")
    		NewFile.Close
    		Set NewFile = Nothing
    		'isFileExists=0
    	End If
    Else
    	'ToTrace "Le fichier est bien trouvé", ""
    	'isFileExists=1
    End If
    Set fso = Nothing
    If Err.Number <> 0 Then 
     
    	ToTrace "*****************************",""
    	ToTrace "IOField invisble sur la sup	********",""
    	ToTrace "isFileExist erreur n°:",Err.Number
    	ToTrace "isFileExist description erreur :",Err.Description
    	ToTrace "",""
    	ToTrace "*****************************",""
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub


    Et le script ReadFile:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Sub ReadFile(ByVal dossier, ByVal fichier)
    Dim fso, f,ts,filePath, temp, buf, nbFile,i, min, max
    'On Error Resume Next 
    Set fso = CreateObject("Scripting.FileSystemObject")
    filePath = dossier & "\" & fichier
    ToTrace "Getfile:",filePath
    isFileExists dossier & "\" , fichier
    Set f = fso.GetFile(filePath)
    Set ts = f.OpenAsTextStream(1,-2)
     
    buf = Split(ts.ReadAll, vbLf)	
     
    ToTrace "ReadFile2","."
     
    For i=0 To UBound(buf)-1	 
    	ToTrace "buf(i): ", buf(i) 
    Next
    temp = UBound(buf) 
    SmartTags("nbLine").Value=temp
     
    For i=LBound(buf) To UBound(buf)
    	SmartTags("Line_"&i+1).Value= buf(i) 
    	'ToTrace "i: ", i 
    	'ToTrace "Line" &i + 1 &": ", SmartTags("Line_"&i+1).Value
    Next
    ts.Close	'Une fois qu'on a récupéré les catégories, on ferme le fichier texte.
    Set ts = Nothing
    Set f = Nothing
    Set fso = Nothing
    If Err.Number <> 0 Then 	
    	ToTrace "ReadFile",""
    	ToTrace "ReadFile erreur n°:",Err.Number
    	ToTrace "ReadFile description erreur :",Err.Description
    	ToTrace "ReadFile context erreur :",Err.Source
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub


    La procédure "ToTrace" me sert à avoir un retour monitor (HMIRuntime.Trace...).

    Ce qui marche:
    L'initialisation de la comboBox "catégorie". (on teste si le fichier existe ici en premier).
    Ce qui me créé l'erreur, c'est lorsque je veux tester l’existence d'un autre fichier texte dans un autre répertoire.
    Je ne comprends pas vraiment l'origine du problème. Mais apparemment ce serait dû au fait qu'une instance fso ne peut pas changer de répertoire...

    Ma question: Il y a t'il un moyen de tester et créer un ou plusieurs fichiers textes dans plusieurs répertoires, et comment faire?

    Merci d'avance.

  2. #2
    Futur Membre du Club
    Précision sur l'erreur
    J'ai oublié de préciser que le code erreur est 424, soit Objet requis, d'où le fait que je soupçonne un problème d'instanciation de l'objet fso.

  3. #3
    Modérateur

    Bonjour et BIENVENU sur DVP.

    Il faudrait en plus le numéro de la ligne et celui du caractère où se produit l'erreur.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  4. #4
    Futur Membre du Club
    Bonjour et merci L'Autodidacte,

    malheureusement, la console ne donne pas cette information, ni l'objet Err... C'est pour ça que j'ai mis des 'ToTrace' un peu partout.
    Avec la dernière version de TIA 15.1 (WinCC RT Pro) il n'y a plus le debugger de script, donc pas de point d'arrêt non plus...

  5. #5
    Rédacteur/Modérateur

    Salut

    J'ai essayé de faire un peu de ménage
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'debut du programme, variable globale
    option explicit
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")

    Suivent les subs et functions
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub OnGenerateScreen()
    'Lire le fichier texte "intrants-Cat.txt" et affecter chaq'une de ces lignes 
    'aux lignes de textes de la liste déroulante
    On Error Resume Next
    '***	Création des objets File explorer et TextStream
    'Dim fso, folder, file,f,ts,extend, temp '<--------------- a supprimer ---------------
    Dim folder, file, extend
    folder="C:\SupTools"
    'temp = isFolderExists(folder) '<------------- non utilisé -----------------'<--------------- a supprimer ---------------
    extend=".txt"
    file = "Intrants-Cat" & extend 
     
    isFileExists folder, file
     
    '***	Affectation des textes de la liste déroulante
     
    Dim i, nbLine, list,  filePath,buf
    filePath = folder &"\"& file
    ReadFile folder,file 
    nbLine=SmartTags("nbLine")
    ToTrace "231-nbFile: ", nbLine
    Set list = ScreenItems("Liste_cat") ' On créé on objet "liste déroulante" existant!!
    list.Visible = False
    list.CountVisibleItems = nbLine
     
    For i = 1 To nbLine
    	list.SelectedIndex= i  
    	'list.SelectedText = buf(i)
    	list.SelectedText = SmartTags("Line_"&i)
    Next
    list.Index=1
    list.Visible = True
     
    Set list = Nothing
    For i = 1 To nbLine 
    	SmartTags("Line_"&i)=""
    Next
    If Err.Number <> 0 Then 
    	ToTrace "OnGenerateScreen erreur n°:",Err.Number
    	ToTrace "ReadFile description erreur :",Err.Description
    	ToTrace "ReadFile context erreur :",Err.Source
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Function isFolderExists(ByVal chemin)
    'Dim fso, f, NewFile
    On Error Resume Next 
    'Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(chemin) Then
    	'ToTrace " isFolderExist(chemin)", chemin
    	fso.CreateFolder(chemin)		
    	isFolderExists=0
    Else
    	'ToTrace "Le dossier exist déjà", 1
    	'ToTrace " Son chemin:", chemin
    	isFolderExists=1
    End If
    'Set fso = Nothing
    If Err.Number <> 0 Then 
    	ToTrace "isFolderExist erreur n°:",Err.Number
    	ToTrace "isFolderExist description erreur :",Err.Description
    	Err.Clear
    End If
    On Error GoTo 0
    End Function

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub isFileExists(ByVal dossier, ByVal fichier)
    Dim NewFile 			'Dim fso, f, NewFile  '<--------------- a supprimer ---------------
    On Error Resume Next 
    'Set fso = CreateObject("Scripting.FileSystemObject")  '<--------------- a supprimer ---------------
    ToTrace "chemin:" , dossier & "\" & fichier
    ToTrace "fso Fileexists: " , fso.FileExists(dossier & "\" & fichier)
    If Not fso.FileExists(dossier & "\" & fichier) Then
    	If fichier = "Intrants-cat.txt" Then
    		ToTrace " Si absence de Intrants-Cat.txt, alors on le créé.", 1
    		Set NewFile = fso.CreateTextFile(dossier & "\" & fichier)
    		NewFile.WriteLine("FUMIERS")
    		NewFile.WriteLine("AUTREAGRI")
    		NewFile.WriteLine("BOUES")
    		NewFile.WriteLine("LISIERS")
    		NewFile.WriteLine("MATIERES VEGETALES")
    		NewFile.Close
    		Set NewFile = Nothing
    		'isFileExists=0
    	Else			
    		Set NewFile = fso.CreateTextFile(dossier & "\" & fichier)
    		NewFile.WriteLine("NOUVEAU")
    		NewFile.Close
    		Set NewFile = Nothing
    		'isFileExists=0
    	End If
    Else
    	'ToTrace "Le fichier est bien trouvé", ""
    	'isFileExists=1
    End If
    'Set fso = Nothing  '<--------------- a supprimer ---------------
    If Err.Number <> 0 Then 
     
    	ToTrace "*****************************",""
    	ToTrace "IOField invisble sur la sup	********",""
    	ToTrace "isFileExist erreur n°:",Err.Number
    	ToTrace "isFileExist description erreur :",Err.Description
    	ToTrace "",""
    	ToTrace "*****************************",""
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub ReadFile(ByVal dossier, ByVal fichier)
    'Dim fso, f,ts,filePath, temp, buf, nbFile,i, min, max  '<--------------- a supprimer ---------------
    Dim f,ts,filePath, temp, buf, i, max 		
    'On Error Resume Next 
    'Set fso = CreateObject("Scripting.FileSystemObject")  '<--------------- a supprimer ---------------
    filePath = dossier & "\" & fichier
    ToTrace "Getfile:",filePath
    isFileExists dossier & "\" , fichier
    Set f = fso.GetFile(filePath)
    Set ts = f.OpenAsTextStream(1,-2)
     
    buf = Split(ts.ReadAll, vbLf)	
     
    ToTrace "ReadFile2","."
     
    For i=0 To UBound(buf)-1	 
    	ToTrace "buf(i): ", buf(i) 
    Next
    temp = UBound(buf) 
    SmartTags("nbLine").Value=temp
     
    For i=LBound(buf) To UBound(buf)
    	SmartTags("Line_"&i+1).Value= buf(i) 
    	'ToTrace "i: ", i 
    	'ToTrace "Line" &i + 1 &": ", SmartTags("Line_"&i+1).Value
    Next
    ts.Close	'Une fois qu'on a récupéré les catégories, on ferme le fichier texte.
    Set ts = Nothing
    Set f = Nothing
    'Set fso = Nothing  '<--------------- a supprimer ---------------
    If Err.Number <> 0 Then 	
    	ToTrace "ReadFile",""
    	ToTrace "ReadFile erreur n°:",Err.Number
    	ToTrace "ReadFile description erreur :",Err.Description
    	ToTrace "ReadFile context erreur :",Err.Source
    	Err.Clear
    End If
    On Error GoTo 0
    End Sub

    FIN DU PROGRAMME
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    ' nettoyage avant fin du programme
    Set fso = Nothing


    Dans le déroulé de ton code, il me semble bien que l'objet fso était fermé par un Set fso = Nothing, de retour dans la sub OnGenerateScreen l'instance fso n'existait plus .
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  6. #6
    Membre émérite
    Dans OnGenerateScreen, on voit
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    file = "Intrants-Cat" & extend
    Dans isFileExists, on voit
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    If fichier = "Intrants-cat.txt" Then
    Malgré la probable faute de frappe, la dernière comparison n'est toujours pas recommendable, il faut faire une comparison binaire au lieu de textuel, comme ça:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    If strcomp(fichie, "Intrants-cat.txt") Then

    ou également effectivement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    If strcomp(fichie, "Intrants-cat.txt", 0) Then

  7. #7
    Futur Membre du Club
    Bonjour ProgElect, bonjour Tsuji,

    @Tsuji: Merci, j'ai corrigé et utilisé la fonction strcomp, je suis ouvert aux bonnes pratiques

    @ ProgElect: Merci pour ton travail, malheureusement il n' y a pas un script englobant les autres. C'est pourquoi je créé plusieurs fois l'instance 'fso' puis la ferme à chaque utilisation.
    Le projet est dans un environnement de développement de supervision, les scripts VBS ne sont que des fonctionnalités 'supplémentaires' et avec des limites.
    On ne peut (par exemple) pas typer une variable au moment de sa déclaration, exemple:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Dim fso As Scripting.FileSystemObject

    ne fonctionne pas, et ne compile pas.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Option explicit

    ne compile pas non plus...
    Les instructions de saut comme Goto, non plus...
    Créer des procédures à l'intérieure d'un script... non plus.
    Je ne peux m'affranchir du fait de devoir créer une instance fso à chaque procédure puis de la fermer à la fin de chacune d'entre elles. (du moins jusqu'à j'en sache un peu plus sur le fonctionnement des instances, mais j'ai pas trouvé de doc explicite sur le sujet.)

    J'ai quand même fait un peu de ménage dans mes scripts, c'est déjà plus lisible.

    Merci pour vos interventions.

  8. #8
    Membre émérite
    Ce qui me créé l'erreur, c'est lorsque je veux tester l’existence d'un autre fichier texte dans un autre répertoire.
    Est-ce que dossier ou folder s'est écrite toujours de façon absolue et n'est jamais de façon relative ?

  9. #9
    Rédacteur

    bonjour,
    tu n'es pas sous RT Pro donc tu ne peux pas créer de scripts locaux mais uniquement des "fonctions personnalisées"
    la principale restriction consiste dans le fait que tu ne peux pas effectivement écrire des scripts contenant plusieurs fonctions ou procédures
    pour le reste c'est du VBS standard et il est donc normal de ne pas pouvoir typer les variables

    J'ai oublié de préciser que le code erreur est 424, soit Objet requis, d'où le fait que je soupçonne un problème d'instanciation de l'objet fso.
    je suppose que l'erreur est capturée au niveau de l'exécution du script isFileExists or je constate que tu ne crées pas seulement l'objet fso mais aussi l'objet NewFile quand le fichier est absent du répertoire cible
    peut-être un problème de droit en écriture ?
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  10. #10
    Futur Membre du Club
    Bonjour et merci,
    @Omen999:
    Je suis bien en WinCC RT Pro, je peux faire aussi bien des scripts locaux ('OnGenerateScreen()' en est un), que des Scripts globaux ('isFileExists') selon la terminologie de WinCC.

    je suppose que l'erreur est capturée au niveau de l'exécution du script isFileExists or je constate que tu ne crées pas seulement l'objet fso mais aussi l'objet NewFile quand le fichier est absent du répertoire cible
    peut-être un problème de droit en écriture ?
    Cette partie là fonctionne correctement, et les droits en lecture et écriture sont autorisés.

    @tsuji
    J'utilise exclusivement les chemins 'en absolue', n'ayant pas encore étudié le fonctionnement des chemins relatifs, je préfère m'en tenir au chemin absolue.

    Encore merci de prendre du temps pour me répondre

  11. #11
    Futur Membre du Club
    Bonjour,

    finalement j'ai contourné le problème en supprimant les 'Catégories', puis j'ai revue le fonctionnement à l'aide d'Excel.

    Je mets le post en 'résolu', bien qu'il ne le soit pas au rapport de l'intitulé.

    En tout cas, je vous remercie pour votre aide.

###raw>template_hook.ano_emploi###