Page 1 sur 2
Archivage automatique
Posté : 19 mai 2021, 19:09
par Sevirath
Bonjour à tous,
Je suis actuellement sur un pb que je ne comprends pas. Je vous explique, je travaille sur un s7-1500 avec un ihm tp900. J'ai créé un Db (avec 3 structures à l'intérieur) de sauvegarde compteurs. Ce que je veux c'est pouvoir récupérer chaque valeurs dans fichier csv, donc via un script.
J'ai pas mal de base sur vba mais je me suis rendu compte que wincc fonctionnait un peu différemment.
Voilà pour expliquer simplement :
Dans mon Db archives j'ai
Une structure Archives_compteurs_eqA qui contient une structure Compteur_chariots0 qui comprend 59 données
Idem pour Archives_compteurs_eqB et Archives_compteurs_eqC
Dans mon script, j'arrive donc à créer le fichier csv, mais ensuite j'utilise des boucl

es pour insérer mes valeurs de variables c'est ici que ça déconne
Je définis ma variable:
cases = smarttags("mondbarchives_Archives_Compteurs_EqA[0].cases[0]")
a=0
For i = 0 to 59
cases= smarttags "mondbarchives_Archives_Compteurs_Eqa[" &a&"].cases["&i&"]")
Ligne.PrintLine cases
Next
Quand mon script est lancé j'ai une erreur no tag, comme si il ne trouvait pas cette variable...
Je bloque ici. Si vous avez des idées à me donner je suis preneur
Merci.
Re: Archivage automatique
Posté : 20 mai 2021, 09:51
par DurandO
Bonjour,
Sevirath a écrit : ↑19 mai 2021, 19:09
Bonjour à tous,
Je suis actuellement sur un pb que je ne comprends pas. Je vous explique, je travaille sur un s7-1500 avec un ihm tp900. J'ai créé un Db (avec 3 structures à l'intérieur) de sauvegarde compteurs. Ce que je veux c'est pouvoir récupérer chaque valeurs dans fichier csv, donc via un script.
J'ai pas mal de base sur vba mais je me suis rendu compte que wincc fonctionnait un peu différemment.
Voilà pour expliquer simplement :
Dans mon Db archives j'ai
Une structure Archives_compteurs_eqA qui contient une structure Compteur_chariots0 qui comprend 59 données
Idem pour Archives_compteurs_eqB et Archives_compteurs_eqC
Dans mon script, j'arrive donc à créer le fichier csv, mais ensuite j'utilise des boucl

es pour insérer mes valeurs de variables c'est ici que ça déconne
Je définis ma variable:
cases = smarttags("mondbarchives_Archives_Compteurs_EqA[0].cases[0]")
a=0
For i = 0 to 59
cases= smarttags "mondbarchives_Archives_Compteurs_Eqa[" &a&"].cases["&i&"]")
Ligne.PrintLine cases
Next
Quand mon script est lancé j'ai une erreur no tag, comme si il ne trouvait pas cette variable...
Je bloque ici. Si vous avez des idées à me donner je suis preneur
Merci.
Dans ta boucle For,
0 to 59 font
60 case au lieu de
59.
Utiliser la fonction
uBound pourrait êytre une bonne habitude pour éviter cela!
Je ne vois pas évoluer la variable
a est-ce utile?
Re: Archivage automatique
Posté : 20 mai 2021, 10:36
par djé
Salut,
Il manque aussi l'ouverture de la parenthèse.
Re: Archivage automatique
Posté : 20 mai 2021, 11:41
par Sevirath
Bonjour,
Désolé pour la mise en form du message d'hier, je l'ai écrit via mon téléphone.
Voici mon code que j'utilise sur TIA.
Code : Tout sélectionner
ShowSystemAlarm "Début sauvegarde compteurs" 'Affiche le message sur la fenêtre d'alarmes
'Création table Equipe A Chariots 1 à 7
eq = "A"
ligne.LinePrint Path
i = 0
chariot = 0
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Tri")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 1
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 1 ; Plage 80-194")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 2
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 2 ; Plage 194-365")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 3
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 3 ; Plage 365-536")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 4
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 4 ; Plage 536-764")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 5
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 5 ; Plage 750-1035")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 6
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 6 ; Plage 1035-1320")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
i = 0
chariot = 7
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 7 ; Plage 1320-1605")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
ShowSystemAlarm "Compteurs equipe A terminé"
'Création table Equipe B Chariots 1 à 7
eq = "B"
i = 0
chariot = 0
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
ligne.LinePrint ("Chariot 0 ; Tri")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}_Cases{"&i&"}")
Next
Cela reste une partie, mais le principe est exactement le même pour l'équipe A/B/C. Pour chaque boucle, je défini le numéro du chariot (chariot), ainsi que le numéro de la case(i). Quand je test tout ça en local, tout est Ok. En ligne, comme je disais hier j'ai l'erreur :
Erreur 'no tag' "DB30_ARCHIVES_COMPTEURS_Compteurs_Chariots_EqA{0}_Cases{7} dans le script <Archivage> à la ligne 70.
Aujourd'hui c'est la case 7, mais il me semble qu'hier c'était la 6....
DurandO-> Oui la variable a change sur les lignes suivantes. Et la fonction Ubound, je ne vois pas comment l'utiliser désolé.
Djé-> Comme dit plus haut, j'ai écrit le message sur mon télèphone, donc pas toujours facile.
Re: Archivage automatique
Posté : 20 mai 2021, 14:52
par ProfnovA
Si la variable n'est pas utilisée sur une page de visu, cela ne fonctionne pas, les variables ne sont pas crées via le script uniquement . J'ai eu le pb récemment...
Re: Archivage automatique
Posté : 20 mai 2021, 17:36
par DurandO
Bonjour,
Sevirath a écrit : ↑20 mai 2021, 11:41
Cela reste une partie, mais le principe est exactement le même pour l'équipe A/B/C. Pour chaque boucle, je défini le numéro du chariot (chariot), ainsi que le numéro de la case(i). Quand je test tout ça en local, tout est Ok. En ligne, comme je disais hier j'ai l'erreur :
Erreur 'no tag' "DB30_ARCHIVES_COMPTEURS_Compteurs_Chariots_EqA{0}_Cases{7} dans le script <Archivage> à la ligne 70.
Aujourd'hui c'est la case 7, mais il me semble qu'hier c'était la 6....
DurandO-> Oui la variable a change sur les lignes suivantes. Et la fonction Ubound, je ne vois pas comment l'utiliser désolé.
Djé-> Comme dit plus haut, j'ai écrit le message sur mon télèphone, donc pas toujours facile.
Pour la lisibilité tu peux déjà commencer par mettre en évidence l'insertion des données dans ta chaîne en mettant des espaces autour des & comme si dessous:
Code : Tout sélectionner
eq = "B"
i = 0 //Cette ligne est inutile
chariot = 0
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq" & eq & "{" & chariot & "}")
ligne.LinePrint ("Chariot 0 ; Tri")
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq" & eq & "{" & chariot & "}_Cases{" & i & "}")
Next
Ensuite, les { } au lieu des [ ] m'étonne un peu.
ensuite, comme dit précédemment, si tu as 59 données, ta boucle
for ne devrait pas être
0..59 mais plutôt
0..58.
Corrige déjà cela et ensuite transmets ta déclaration de variable TIA que tu as citée, histoire d'avoir de quoi raisonner.
De quelle manière est appelé
ShowSystemAlarm?
Pour tes tests, commence par tester avec le code qui suit et déclenche ton script avec un bouton, voir si tu n'as pas déjà des erreurs :
Code : Tout sélectionner
ShowSystemAlarm "Début sauvegarde compteurs" 'Affiche le message sur la fenêtre d'alarmes
'Création table Equipe A Chariots 1 à 7
eq = "A"
ligne.LinePrint Path
chariot = 0
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_Eq"&eq&"{"&chariot&"}")
Pour info : la fonction
uBound transmet le rang de tableau le plus élevé. Tu aurais pu l'utiliser au lieu du
59.
Re: Archivage automatique
Posté : 21 mai 2021, 17:00
par Sevirath
Salut,
Bon ça fonctionne comme je veux, merci à vous et en partie à ProfnovA qui m'a mis la puce à l'oreille

.
J'ai bien mes variables sur IHM et ça à fonctionné. J'ai refait propre mon code comme vous me l'aviez signalé, mais c'est mon côté bordelique qui fait ça, sur vba je suis pareil, et a la fin une fois que tout fonctionne je me refais tout au propre...
voici au final le bout du code qui fonctionne:
Code : Tout sélectionner
ligne.LinePrint ("eq=A")
ligne.LinePrint ("")
ligne.LinePrint ("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_EqA{0}")
ligne.LinePrint char0
For i = 0 To 59
ligne.LinePrint SmartTags("DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_EqA{0}.Cases")(i)
Next
DurandO les {} comme tu me disais, c'est ma variable qui est créé comme ceci... De plus non j'utilise bien une boucle 0 to 59 car j'ai 60 cases. Ma case 1 est "DB30_ARCHIVES_COMPTEURS_Compteurs_chariots_EqA{0}.Cases")
(0)
Par contre, tout ça ma raméne a un autre soucis. J'ai mis une option, c'est de pouvoir récuperer les données qui sont enregistrées dans la carte SD vers ma clé USB.
Code : Tout sélectionner
Dim destination,oFSO
destination="\Storage card USB\copiearchive.csv"
If SmartTags("DB20_DONNEES_IHM_Mode_script") = False Then 'Mode Normal
Set oFSO = CreateObject("FileCtl.FileSystem")
oFSO.FileCopy "\Storage card SD\archives.csv",destination
Set oFSO = Nothing
End If
Ca fonctionne pour le transfert d'un fichier. Mais moi je veux copier un dossier complet. C'est là, le soucis. FolderCopy, CopyFolder me jette à chaque fois. En local, c'est Ok, mais quand je test via l'IHM, j'ai toujours une erreur.
Le but de copier le dossier complet, c'est que mes archives sont créés tous les jours à la même heure, dans un fichier portant un nom différent (date du jour & Archive compteurs.csv).
Re: Archivage automatique
Posté : 21 mai 2021, 19:29
par DurandO
Bonjour,
Sevirath a écrit : ↑21 mai 2021, 17:00
les {} comme tu me disais, c'est ma variable qui est créé comme ceci.
Ce n'est donc pas un tableau alors, contrairement à ce que je pensais.
Corrige déjà cela et ensuite transmets ta déclaration de variable TIA que tu as citée, histoire d'avoir de quoi raisonner.
En même temps sans la connaitre la déclaration de variable...
Car si tu définis un tableau d'Int par exemple :
titi array [0..59] of int
Tu accède à chaque case avec la syntaxe suivante (exemple case 2):
titi[2]
Bref, passons.
Pour sauver ton dossier vers SD card,
As-tu essayé de copier tous les fichiers tout simplement ce qui devrait ressembler à ceci:
Code : Tout sélectionner
Dim destination,oFSO
destination="\Storage card USB\*.*"
If SmartTags("DB20_DONNEES_IHM_Mode_script") = False Then 'Mode Normal
Set oFSO = CreateObject("FileCtl.FileSystem")
oFSO.FileCopy "\Storage card SD\*.*",destination
Set oFSO = Nothing
End If
Une structure Archives_compteurs_eqA qui contient une structure Compteur_chariots0 qui comprend 59 données
Pour la boucle
FOR tu avais indiqué
59 données dans ton premier post
d'où ma remarque.
Re: Archivage automatique
Posté : 25 mai 2021, 10:03
par Sevirath
DurandO a écrit : ↑21 mai 2021, 19:29
Pour sauver ton dossier vers SD card,
As-tu essayé de copier tous les fichiers tout simplement ce qui devrait ressembler à ceci:
Code : Tout sélectionner
Dim destination,oFSO
destination="\Storage card USB\*.*"
If SmartTags("DB20_DONNEES_IHM_Mode_script") = False Then 'Mode Normal
Set oFSO = CreateObject("FileCtl.FileSystem")
oFSO.FileCopy "\Storage card SD\*.*",destination
Set oFSO = Nothing
End If
Bonjour et merci de ton retour. Donc si je comprends bien, le fait d'écrire :
le
*.* permet de copier l'intégralité du dossier source?
Encore une différence avec VBA alors. Je vais essayer comme ça.
Re: Archivage automatique
Posté : 27 mai 2021, 08:09
par Corentinxs
Salut,
J'ai la solution à ta dernière question :
Voici un petit script que j'ai crée qui va te permettre de déplacer tes fichiers vers la destination de ton choix avec création d'un dossier "Heure_Date"
Code : Tout sélectionner
'*******************************************************************************************************************************************************************
'Script qui permet de copier des fichiers d'un dossier source vers un dossier destination avec création d'un nouveau fichier [Nom]_[Date_IHM]_Heure_IHM]*********
'*******************************************************************************************************************************************************************
'Selectionner le SrcPath, DefFile, DstPath de votre choix et mettez le NameFolder en fonction de votre machine.*******************************************************
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
On Error Resume Next
Dim SrcPath, DefFile, NameFolder, DstPath
'Chemin source ou se trouve les fichiers à copier
SrcPath = "\Storage Card USB\"
'SrcPath = "\flash\"
'SrcPath = "\Storage Card SD\"
'Type de fichier à copier (*.* = tout les fichiers)
DefFile = "*.*"
'DefFile = "*.extension"
'DefFile = "Nom.*"
'Nom du nouveau dossier de sauvegarde (Modifier le texte dans "TEST")
NameFolder = "TEST"
'Chemin de destination ou les fichiers seront copiés
DstPath = "\\[NomDossierPartager]\test\LOGS\"
'DstPath = "\Storage Card SD\"
'DstPath = "\Storage Card USB\"
'DstPath = "\flash\"
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
'CODE 'CODE 'CODE
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
'*******************************************************************************************************************************************************************
'Déclaration des variables
Dim strTemp, fs, copyFile, Files, fileFields, m, weldCount, strTemp1, strDir
Dim strDate, strTime, strDname
'Céation de l'object fonction système pour la copie de fichier
Dim hso : Set hso = CreateObject("FileCtl.Filesystem")
Set fs = CreateObject("FileCtl.FileSystem")
'Détermination du chemin, de la date de l'heure et du nom du nouveau dossier qui sera créer avant la copie de fichier
strTemp = hso.Dir(SrcPath & DefFile, 0)
strDate = Right(DatePart("yyyy", Now),2) & Right("0" & DatePart("m", Now), 2) & Right("0" & DatePart("d", Now), 2)
strTime = Right("0" & DatePart("h", Now), 2) & Right("0" & DatePart("n", Now), 2) & Right("0" & DatePart("s", Now), 2)
strDname = "Bckp_" & NameFolder & "_" & strDate & "_" & strTime
'Création du nouveau dossier dans le chemin de destination
fs.mkDir DstPath + strDname
'Vérification si la variable du chemin source contient + de 1 caractère
'Fonction de copie des fichiers du chemin source au chemin de destination.
copyFile =0
While (Len(strTemp) > 0)
hso.Filecopy SrcPath & strTemp, DstPath & strDname &"\"& strTemp
copyFile = copyFile + 1
strTemp=hso.Dir()
'Si défaut : affichage à l'écran, numéro du défaut et description
If Err.Number <>0 Then
ShowSystemAlarm "Error#" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If
Wend
Set hso=Nothing