Question data

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
Avatar du membre
Daviddu90
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 135
Enregistré le : 18 janv. 2019, 08:23
Localisation : Territoire de Belfort
Contact :

Question data

Message 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
Automaticien Indépendant
https://www.dpiautom.com/
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7805
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Question data

Message 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.
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 930
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: Question data

Message 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...
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7805
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Question data

Message 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)
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 930
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: Question data

Message 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".
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7805
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Question data

Message 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
Automaticien privé (de tout)
itasoft@free.fr
Bistoufly
Apprend le binaire
Apprend le binaire
Messages : 1
Enregistré le : 17 juin 2021, 14:22

Re: Question data

Message 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.
Avatar du membre
Bernardo59
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1054
Enregistré le : 20 oct. 2015, 05:48
Localisation : Nimes
Contact :

Re: Question data

Message par Bernardo59 »

Ca ne serait pas plus facile de charger le programme en simulation, de la passer en STOP et de charger les datas ?
Répondre