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 8-) vous etes les meilleurs. :idea: :shock:

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 ?