Page 1 sur 1
Question data
Posté : 29 mai 2019, 20:00
par Daviddu90
Hi,
Petite question technique:
Est il possible d'exploiter les datas d'un programme Unity pro au format .dtx ?
Fichier générer à la suite d'une sauvegarde des datas d'un projet online
J'ai essayer avec Excel de l'importer mais 1bitable.
Merci pour vos retours.
David
Re: Question data
Posté : 29 mai 2019, 21:00
par itasoft
slts,
.DTX et .DAT c'est des fichiers binaire on ne peut rien faire avec
---
Ceci dit, on peut toujours via un IHM et un Script Java enregistrer les Datas une clef USB au format .CSV pour les visualiser sur Excel
ou alors si ya un serveur Web sur l'automate écrire un programme pour les télécharger à distance.
Re: Question data
Posté : 31 mai 2019, 00:42
par Bruce33
Bonjour,
itasoft a écrit : ↑29 mai 2019, 21:00
.DTX et .DAT c'est des fichiers binaire on ne peut rien faire avec
J'ai du mal à croire que tu penses vraiment cela, itasoft, toi le pro de la conversion.
A une époque j'avais réalisé un script en VBScript pour déchiffrer les fichiers DAT et en récupérer les données localisées.
Je n'ai pas cherché à étudier la différence apportée par les fichiers DTX, mais simplement en modifiant la reconnaissance des premiers octets (qui identifient le type de fichier) cela semble toujours fonctionner.
Voici le contenu du script
DtxToCsv.vbs :
Code : Tout sélectionner
'/// DtxToCsv.vbs \\\
'\\\ forum-automatisme.net ///
'Version 1.0 - 30/05/2019
'Ce script permet de convertir un fichier DTX généré par Unity Pro
'en un fichier texte de type CSV.
'La conversion peut être lancée en ligne de commande ou par glisser-déposer
'du fichier à convertir sur le fichier DtxToCsv.vbs.
Option Explicit
Const ForReading = 1, ForWriting = 2
Dim oFSO, oArgs
Dim oFichierDtx, oFichierBits, oFichierMots
Dim sFicDtx, sFicBits, sFicMots, s
Dim iAdresse
Dim sID
Dim bBits
Dim lBitsDepart,lBitsNombre
Dim bMots
Dim lMotsDepart, lMotsNombre
Dim lTailleNomStation
Set oFSO = CreateObject("Scripting.FileSystemObject")
'--- Récupération du fichier de données en argument
Set oArgs = WScript.Arguments
If oArgs.Count<1 Then
s= "Script de conversion d'un fichier DTX au format CSV" & vbCrLf
s=s & vbCrLf
s=s & "Syntaxe :" & vbCrLf
s=s & " DtxToCsv <dtx>" & vbCrLf
s=s & " <dtx> : fichier de données généré par Unity Pro" & vbCrLf
s=s & vbCrLf
s=s & "Les fichiers suivants seront créés ou écrasés," & vbCrLf
s=s & "le cas échéant, dans le même répertoire :" & vbCrLf
s=s & " - 'Données %M de <dtx>.csv'" & vbCrLf
s=s & " - 'Données %MW de <dtx>.csv'" & vbCrLf
WScript.Echo s
WScript.Quit
Else
sFicDtx = oArgs(0)
If Not oFSO.FileExists(sFicDtx) Then
MsgBox "Le fichier " & sFicDtx & " n'existe pas.", vbCritical, "Erreur"
WScript.Quit
End If
Set oFichierDtx = oFSO.GetFile(sFicDtx)
sFicBits = Replace(oFichierDtx.ParentFolder & "\Données %M de " & oFichierDtx.Name, ".dtx", ".csv", 1, -1, vbTextCompare)
sFicMots = Replace(oFichierDtx.ParentFolder & "\Données %MW de " & oFichierDtx.Name, ".dtx", ".csv", 1, -1, vbTextCompare)
End If
Set oArgs = Nothing
'--- Ouverture et contrôle du fichier .DTX
Set oFichierDtx = oFSO.OpenTextFile(sFicDtx, ForReading)
sID = oFichierDtx.Read(8)
If sID <> (Chr(&H17) & Chr(&H19) & Chr(&H12) & Chr(&H5) & Chr(&H1) & Chr(0) & Chr(0) & Chr(0)) Then
MsgBox "Le fichier à convertir n'est pas un fichier de données Unity Pro.", vbCritical, "Fichier non reconnu"
WScript.Quit
End If
'--- Lecture de l'en-tête
oFichierDtx.Skip(28)
bBits = CBool(Asc(oFichierDtx.Read(4)))
lBitsDepart = Asc(oFichierDtx.Read(1)) _
+ Asc(oFichierDtx.Read(1)) * 2^8 _
+ Asc(oFichierDtx.Read(1)) * 2^16 _
+ Asc(oFichierDtx.Read(1)) * 2^24
lBitsNombre = Asc(oFichierDtx.Read(1)) _
+ Asc(oFichierDtx.Read(1)) * 2^8 _
+ Asc(oFichierDtx.Read(1)) * 2^16 _
+ Asc(oFichierDtx.Read(1)) * 2^24
bMots = CBool(Asc(oFichierDtx.Read(4)))
lMotsDepart = Asc(oFichierDtx.Read(1)) _
+ Asc(oFichierDtx.Read(1)) * 2^8 _
+ Asc(oFichierDtx.Read(1)) * 2^16 _
+ Asc(oFichierDtx.Read(1)) * 2^24
lMotsNombre = Asc(oFichierDtx.Read(1)) _
+ Asc(oFichierDtx.Read(1)) * 2^8 _
+ Asc(oFichierDtx.Read(1)) * 2^16 _
+ Asc(oFichierDtx.Read(1)) * 2^24
oFichierDtx.Skip(68)
lTailleNomStation = Asc(oFichierDtx.Read(1)) _
+ Asc(oFichierDtx.Read(1)) * 2^8 _
+ Asc(oFichierDtx.Read(1)) * 2^16 _
+ Asc(oFichierDtx.Read(1)) * 2^24
oFichierDtx.Skip(lTailleNomStation*2)
If Not bBits And Not bMots Then
MsgBox "Le fichier ne contient pas de données localisées.", vbExclamation, "Aucune donnée exploitable"
WScript.Quit
End If
'--- Traitement des données de type bit localisé %M
If bBits Then
'--- Création du fichier CSV
Set oFichierBits = oFSO.OpenTextFile(sFicBits, ForWriting,True)
oFichierDtx.Skip(16)
For iAdresse = lBitsDepart To lBitsDepart + lBitsNombre - 1
oFichierBits.WriteLine "%M" & iAdresse & ";" & (Asc(oFichierDtx.Read(1)) And 1) 'on garde juste le bit de poids faible
Next
'--- Fermeture des fichiers
oFichierBits.Close
End If
'--- Traitement des données de type mot localisé %MW
If bMots Then
'--- Création du fichier CSV
Set oFichierMots = oFSO.OpenTextFile(sFicMots, ForWriting,True)
oFichierDtx.Skip(16)
For iAdresse = lMotsDepart To lMotsDepart + lMotsNombre - 1
oFichierMots.WriteLine "%MW" & iAdresse & ";" & (Asc(oFichierDtx.Read(1)) + Asc(oFichierDtx.Read(1)) * 2^8)
Next
'--- Fermeture des fichiers
oFichierMots.Close
End If
'--- Fermeture du fichier de données
oFichierDtx.Close
Ce script est facilement transposable dans une macro Excel.
Bon, je vous laisse, moi aussi je pars me changer les idées pendant quelques jours...
Re: Question data
Posté : 31 mai 2019, 01:47
par itasoft
@Bruce
Disons que tu n’as pas complètement tort, (C'est pour ne pas dire que tu as raison, LOL)
C’est vrai que avec un éditeur hexadécimal J’aurais du examiner de plus près la structure du fichier avant de me prononcer .
bon j'ai regardé le fichier .DAT de près, c'est un fichier binaire structuré de la sorte:
H,0000 à H,0033 poubelle de 52 octets
H,0034 (DINT) adresse du 1er mot %MW
H,0038 (DINT) le nombre de mots %MW à traiter
H,003C à H,009F poubelle de 100 octets
H,00A0 (INT) valeur du 1er mot %MW
H,00A2 (INT) valeur du 2ème mot %MW
ect............................................
Reste plus qu'a faire avec ça, une macro en VBA ou un script .VBS pour les fichiers .DAT en complément de ta macro .DTX
Testé ton Script .VBS , marche super , (mais ça n'affiche pas les valeurs négatives)
Re: Question data
Posté : 04 juin 2019, 07:13
par Bruce33
Itasoft, merci d'avoir testé mon script, c'est toujours rassurant quand ça marche avec d'autres personnes.
Le script n'affiche pas les valeurs négatives, effectivement, mais les valeurs brutes comme les fichiers DAT de PL7 Pro. Dans Excel on peut assez rapidement adapter le format d'affichage.
Concernant les fichiers DAT, le script marche également si on remplace l'extension dtx par dat et qu'on supprime la reconnaissance des premiers octets. (La vérification des premiers octets me servait pour distinguer les fichiers DAT de PL7-3, PL7 Pro et Unity Pro.)
Attention les données ne sont pas toujours situées au même endroit dans le fichier DAT ou DTX, car la longueur de l'en-tête dépend de la longueur du nom de la station, et on dépend aussi de la présence et taille des données %M et/ou %MW.
Remarque pour David : le titre du sujet est trop vague. Il serait bon de le renommer, dans le style "exploitation fichier de données DTX".
Re: Question data
Posté : 04 juin 2019, 13:45
par itasoft
@bruce
ok ça marche, disons que pour mon usage j'ai fais la modif pour afficher les valeurs négatives
For iAdresse = lMotsDepart To lMotsDepart + lMotsNombre - 1
oFichierMots.WriteLine "%MW" & iAdresse & ";" & CInt("&H" & Hex((Asc(oFichierDtx.Read(1)) + Asc(oFichierDtx.Read(1))*2^8)))
Next
Re: Question data
Posté : 17 juin 2021, 14:25
par Bistoufly
Monsieur

vous etes les meilleurs.
Petit cerise sur le gâteau.
Est ce que vous pensez qu'il est possible de récupéré les valeurs des variables non localisé dans le fichier .DTX ?
Bonne journée.
Re: Question data
Posté : 17 juin 2021, 20:35
par Bernardo59
Ca ne serait pas plus facile de charger le programme en simulation, de la passer en STOP et de charger les datas ?