Fichier DATA comment extraire la valeur des REAL

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
lamjer65
Forcené des structures
Forcené des structures
Messages : 176
Enregistré le : 09 avr. 2016, 14:30

Fichier DATA comment extraire la valeur des REAL

Message par lamjer65 »

Bonsoir à tous, en espérant que vous allez bien.
Petite bouteille à la mer sur les fichiers .DATA de PL7_PRO !
Est-ce qu’il existe ou bien si quelqu’un possède un petit script ou vb permettant de récupérer les valeurs des doubles mots, réel etc d’un fichier .DATA ?!!

J’ai bien essayé de l’injecter dans le simulateur de ControlExpert mais malheureusement avec un message d’erreur.

Merci à tous, bonne soirée
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: Fichier DATA comment extraire la valeur des REAL

Message par itasoft »

les valeurs des doubles mots, réel c'est composé de 2 simples mots %MW
Je vois pas ou est le pb
Exemple :
Dans PL7-PRO je déclare une variable REAL à l’adresse %MF100
Dans Unity je déclare une variable REAL à l’adresse %MW100
Après injection du .DAT dans Unity je retrouve la même valeur que dans mon REAL déclaré sur PL7-PRO
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: Fichier DATA comment extraire la valeur des REAL

Message par Bruce33 »

lamjer65 a écrit : 29 mai 2024, 20:01 J’ai bien essayé de l’injecter dans le simulateur de ControlExpert mais malheureusement avec un message d’erreur.
Pour importer les données d'un fichier DAT de PL7 Pro dans Control Expert, il faut d'abord convertir le fichier.
Pour le convertir, il faut démarrer Control Expert et passer par le menu Fichier > Ouvrir en sélectionnant le type de fichier "Fichiers DAT PL7 (*.DAT)".
Ensuite il vaut mieux l'ouvrir avec un projet Control Expert utilisant un Premium (et non un M340 ou M580) sinon il n'est pas possible d'afficher des mots flottants avec une adresse impaire.

Je vais essayer de réaliser un VBScript pour convertir un fichier DAT en liste de mots flottants, si j'ai un peu de temps libre...
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 930
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: Fichier DATA comment extraire la valeur des REAL

Message par Bruce33 »

lamjer65 a écrit : 29 mai 2024, 20:01 Est-ce qu’il existe ou bien si quelqu’un possède un petit script ou vb permettant de récupérer les valeurs des doubles mots, réel etc d’un fichier .DATA ?!!
J'ai terminé un script pour produire un fichier CSV qui affiche les données %MW du fichier DAT de PL7 Pro sous différents formats.
C'est réalisé en VBScript qui n'est clairement pas le langage le plus efficace pour la conversion des données... mais le calcul des valeurs à virgule flottante semble fiable.
Voici un aperçu du code source :

Code : Tout sélectionner

'///      Pl7DatToCsv.vbs      \\\
'\\\   forum-automatisme.net   ///

'Version 1.0 - 2024-06-05
'Code source sous licence CeCILL v2.1 (https://cecill.info/licences/Licence_CeCILL_V2.1-fr.txt)
' attribué à la communauté de forum-automatisme.net

'Ce script permet de convertir un fichier .DAT généré par PL7 Pro
' en un fichier texte de type CSV contenant les valeurs des mots
' aux formats entier (%MW), entier double (%MD) et réel (%MF)
' ainsi que les représentations hexadécimale, binaire et ASCII.
'La conversion peut être lancée en ligne de commande ou par glisser-déposer
' du fichier à convertir sur le fichier Pl7DatToCsv.vbs.

Option Explicit
Const ForReading = 1, ForWriting = 2

Dim oFSO, oArgs
Dim oFichierDat, oFichierCsv
Dim sFicDat, sFicCsv, s
Dim sDat
Dim oRegExp, oMatch, oMatches
Dim sMW_Adr, sMW_Val, sMW_Val_Hexa, sMWprec_Adr, sMWprec_Val_Hexa
Dim lMW_Val_UINT, lMWprec_Val_UINT, lMW_Val_INT, lMWprec_Val_INT, lMW_Val_DINT
Dim sMW_Val_REAL
Dim Signe, Exposant, Mantisse

Dim tAscii
tAscii = array( _
"$00","$01","$02","$03","$04","$05","$06","$07","$08","$09","$0a","$0b","$0c","$0d","$0e","$0f", _
"$10","$11","$12","$13","$14","$15","$16","$17","$18","$19","$1a","$1b","$1c","$1d","$1e","$1f", _
" ","!","""","#","$$","%","&","'","(",")","*","+",",","-",".","/", _
"0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?", _
"@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", _
"P","Q","R","S","T","U","V","W","X","Y","Z","[","\","]","^","_", _
"`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", _
"p","q","r","s","t","u","v","w","x","y","z","{","|","}","~","$7F", _
"€","","‚","ƒ","„","…","†","‡","ˆ","‰","Š","‹","Œ","","Ž","", _
"","‘","’","“","”","•","–","—","˜","™","š","›","œ","","ž","Ÿ", _
" ","¡","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯", _
"°","±","²","³","´","µ","¶","·","¸","¹","º","»","¼","½","¾","¿", _
"À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï", _
"Ð","Ñ","Ò","Ó","Ô","Õ","Ö","×","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß", _
"à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï", _
"ð","ñ","ò","ó","ô","õ","ö","÷","ø","ù","ú","û","ü","ý","þ","ÿ")

Set oFSO = CreateObject("Scripting.FileSystemObject")

'--- Récupération du nom des fichiers en argument
Set oArgs  = WScript.Arguments
If oArgs.Count < 1 Then
	s=    "Script de conversion d'un fichier .DAT PL7 Pro vers CSV" & vbCrLf
	s=s & " avec des valeurs de types entier, entier double et réel." & vbCrLf
	s=s & "-------------------------------------------------------------------" & vbCrLf
	s=s & "Syntaxe :" & vbCrLf
	s=s & " Pl7DatToCsv <dat> [<csv>]" & vbCrLf
	s=s & "   <dat> : fichier de données généré par PL7 Pro" & vbCrLf
	s=s & "            (doit exister)" & vbCrLf
	s=s & "   <csv> : fichier destination au format CSV" & vbCrLf
	s=s & "            (est créé ou écrasé)" & vbCrLf
	s=s & "            par défaut, il est nommé 'Conversion de <dat>.csv'" & vbCrLf
	WScript.Echo s
	WScript.Quit
Else
	sFicDat = oArgs(0)
	If Not oFSO.FileExists(sFicDat) Then
		MsgBox "Le fichier " & sFicDat & " n'existe pas.", vbCritical, "Erreur"
		WScript.Quit
	End If

	If oArgs.Count > 1 Then
		sFicCsv = oArgs(1)
	Else
		'--- Composition du nom du fichier à créer à partir du fichier d'origine, dans le même répertoire
		Set oFichierDat = oFSO.GetFile(sFicDat)
		sFicCsv = Replace(oFichierDat.ParentFolder & "\Conversion de " & oFichierDat.Name, ".dat", ".csv", 1, -1, vbTextCompare)
	End If
End If
Set oArgs  = Nothing

'--- Ouverture et contrôle (basique) du fichier .DAT
Set oFichierDat = oFSO.OpenTextFile(sFicDat, ForReading)
If oFichierDat.Readline <> "[HEADER]" Then
	MsgBox "Le fichier à convertir n'est pas un fichier de données PL7 Pro.", vbCritical, "Fichier non reconnu"
	WScript.Quit
End If

Set oFSO = CreateObject("Scripting.FileSystemObject")

'--- Lecture du contenu du fichier
sDat = oFichierDat.ReadAll
'- Fermeture du fichier de données
oFichierDat.Close

'--- Expression rationnelle pour rechercher toutes les données
' et récupérer 2 informations : l'adresse du mot et sa valeur
Set oRegExp = New RegExp
oRegExp.Pattern = "AT (%MW[0-9]+) : WORD := \(([0-9]+)\);"
oRegExp.Global = True 'recherche de toutes les occurences
Set oMatches = oRegExp.Execute(sDat)
sDat = ""

If oMatches.Count = 0 Then
	MsgBox "Bizarre, aucune donnée %MW n'a été détectée dans ce fichier...", vbExclamation, "Aucun résultat"
Else
	'--- Création du fichier CSV
	Set oFichierCsv = oFSO.OpenTextFile(sFicCsv, ForWriting,True)
	' avec un en-tête des colonnes
	oFichierCsv.WriteLine "Adresse;INT;DINT;REAL;WORD (hexa.);WORD (bin.);WORD (ASCII)"
	
	'--- Traitement de tous les mots %MW
	sMWprec_Adr = "" ' adresse mémorisée pour le double mot et utilisée à la lecture du 2e mot
	For Each oMatch In oMatches
		' on compte sur le fait que les résultats de l'expression rationnelle
		' sont restitués dans l'ordre des adresses
		sMW_Adr = oMatch.SubMatches(0) 'adresse du mot %MW
		sMW_Val = oMatch.SubMatches(1) 'valeur du mot (16 bits)
		
		'- Format INT
		'conversion de la valeur non signée en valeur signée
		lMW_Val_UINT = CLng(sMW_Val)
		If lMW_Val_UINT > 32767 Then
			lMW_Val_INT =  lMW_Val_UINT - 65536
		Else
			lMW_Val_INT = lMW_Val_UINT
		End If
		
		' valeur hexadécimale sur 4 digits (16 bits) utilisée pour l'assemblage des mots doubles (32 bits)
		' (on complète avec les zéros non significatifs que ne donne pas la fonction Hex)
		sMW_Val_Hexa = Right("0000" & Hex(sMW_Val), 4)
		
		' on commence à écrire au 2e passage pour avoir 2 mots (nécessaires à DINT et REAL)
		If sMWprec_Adr <> "" Then
			'- Format DINT
			lMW_Val_DINT = CLng("&H" & sMW_Val_Hexa & sMWprec_Val_Hexa)
			
			'- Format REAL
			' décomposition des 3 parties binaires d'un nombre à virgule flottante sur 32 bits (selon standard IEEE 754)
			Signe = Sgn(lMW_Val_DINT)
			Exposant = (lMW_Val_DINT And &H7F800000) / &H800000
			Mantisse = lMW_Val_DINT And &H007FFFFF
			' reconstitution de la valeur réelle
			If Exposant = 0 Then
				If Mantisse = 0 Then
					' valeur nulle
					sMW_Val_REAL = "0"
				Else
					' valeur dénormalisée
					sMW_Val_REAL = CStr(CSng(Signe * (2^(-126)) * (Mantisse / &H800000)))
				End If
			ElseIf Exposant = 255 Then
				If Mantisse = 0 Then
					' valeur infinie
					If Signe = -1 Then sMW_Val_REAL = "-1.#INF" Else sMW_Val_REAL = "1.#INF" End If
				Else
					' Not a Number (pas un nombre)
					If Signe = -1 Then sMW_Val_REAL = "-1.#NAN" Else sMW_Val_REAL = "1.#NAN" End If
				End If
			Else
				sMW_Val_REAL = CStr(CSng((Signe * (2^(Exposant-127)) * (1 + Mantisse / &H800000))))
			End If
			
			' écriture des valeurs dans le fichier CSV
			oFichierCsv.WriteLine sMWprec_Adr _
				& ";" & lMWprec_Val_INT _
				& ";" & lMW_Val_DINT _
				& ";" & sMW_Val_REAL _
				& ";16#" & sMWprec_Val_Hexa _
				& ";2#" & HexToBinary(sMWprec_Val_Hexa) _
				& ";'" & tAscii((lMWprec_Val_UINT And &HFF00) \ &H100) & tAscii(lMWprec_Val_UINT And &HFF) & "'"
		End If
		
		' valeurs mémorisées pour le tour suivant
		sMWprec_Adr = sMW_Adr
		lMWprec_Val_UINT = lMW_Val_UINT
		lMWprec_Val_INT = lMW_Val_INT
		sMWprec_Val_Hexa = sMW_Val_Hexa
	Next
	' écriture du dernier mot (qui ne peut pas constituer le poids faible d'un mot double)
	oFichierCsv.WriteLine sMWprec_Adr _
		& ";" & lMW_Val_INT _
		& ";" _
		& ";" _
		& ";16#" & sMW_Val_Hexa _
		& ";2#" & HexToBinary(sMW_Val_Hexa) _
		& ";'" & tAscii((lMW_Val_UINT And &HFF00)\ &H100) & tAscii(lMW_Val_UINT And &HFF) & "'"
	
	'- Fermeture du fichier CSV
	oFichierCsv.Close
End If

Set oMatch = Nothing
Set oMatches = Nothing
Set oRegExp = Nothing


'-------------------------------
Function HexToBinary(ByVal sHex)
' Renvoie une chaine de caractères de bits équivalents aux digits hexadécimaux
' avec un espace séparant chaque quartet (groupe de 4 bits) pour la lisibilité
    Dim tHexDigit
	tHexDigit = "0123456789ABCDEF"
	Dim tBin
	tBin = Array("0000","0001","0010","0011","0100","0101","0110","0111", _
				"1000","1001","1010","1011","1100","1101","1110","1111")
	Dim i
	Dim Result
	
    Result = ""
    For i = 1 To Len(sHex)
        Result = Result & tBin(InStr(tHexDigit, Mid(sHex, i, 1)) - 1) & " "
    Next
	HexToBinary = Trim(Result)
End Function
Mais le copier/coller pose problème avec certains caractères de la table ASCII.
Il est préférable de télécharger le script Pl7DatToCsv.vbs à cet endroit.
lamjer65
Forcené des structures
Forcené des structures
Messages : 176
Enregistré le : 09 avr. 2016, 14:30

Re: Fichier DATA comment extraire la valeur des REAL

Message par lamjer65 »

Merci beaucoup Bruce33, excellent travail.
Première fois que je rencontre un TSX37 avec autant de variables en REAL mais également un échec de transfert du .DAT dans le simulateur de Control Expert avec une configuration de TSX57.
Obligation de mettre sous tension un TSX37 avec une bonne carte mémoire pour récupérer les valeurs ;-)
Encore merci pour ton travail.
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1573
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: Fichier DATA comment extraire la valeur des REAL

Message par MiGaNuTs »

Bruce33 a écrit : 06 juin 2024, 00:00
lamjer65 a écrit : 29 mai 2024, 20:01 Est-ce qu’il existe ou bien si quelqu’un possède un petit script ou vb permettant de récupérer les valeurs des doubles mots, réel etc d’un fichier .DATA ?!!
J'ai terminé un script pour produire un fichier CSV qui affiche les données %MW du fichier DAT de PL7 Pro sous différents formats.
C'est réalisé en VBScript qui n'est clairement pas le langage le plus efficace pour la conversion des données... mais le calcul des valeurs à virgule flottante semble fiable.
Voici un aperçu du code source :

Code : Tout sélectionner

'///      Pl7DatToCsv.vbs      \\\
'\\\   forum-automatisme.net   ///

'Version 1.0 - 2024-06-05
'Code source sous licence CeCILL v2.1 (https://cecill.info/licences/Licence_CeCILL_V2.1-fr.txt)
' attribué à la communauté de forum-automatisme.net

'Ce script permet de convertir un fichier .DAT généré par PL7 Pro
' en un fichier texte de type CSV contenant les valeurs des mots
' aux formats entier (%MW), entier double (%MD) et réel (%MF)
' ainsi que les représentations hexadécimale, binaire et ASCII.
'La conversion peut être lancée en ligne de commande ou par glisser-déposer
' du fichier à convertir sur le fichier Pl7DatToCsv.vbs.

Option Explicit
Const ForReading = 1, ForWriting = 2

Dim oFSO, oArgs
Dim oFichierDat, oFichierCsv
Dim sFicDat, sFicCsv, s
Dim sDat
Dim oRegExp, oMatch, oMatches
Dim sMW_Adr, sMW_Val, sMW_Val_Hexa, sMWprec_Adr, sMWprec_Val_Hexa
Dim lMW_Val_UINT, lMWprec_Val_UINT, lMW_Val_INT, lMWprec_Val_INT, lMW_Val_DINT
Dim sMW_Val_REAL
Dim Signe, Exposant, Mantisse

Dim tAscii
tAscii = array( _
"$00","$01","$02","$03","$04","$05","$06","$07","$08","$09","$0a","$0b","$0c","$0d","$0e","$0f", _
"$10","$11","$12","$13","$14","$15","$16","$17","$18","$19","$1a","$1b","$1c","$1d","$1e","$1f", _
" ","!","""","#","$$","%","&","'","(",")","*","+",",","-",".","/", _
"0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?", _
"@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", _
"P","Q","R","S","T","U","V","W","X","Y","Z","[","\","]","^","_", _
"`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", _
"p","q","r","s","t","u","v","w","x","y","z","{","|","}","~","$7F", _
"€","","‚","ƒ","„","…","†","‡","ˆ","‰","Š","‹","Œ","","Ž","", _
"","‘","’","“","”","•","–","—","˜","™","š","›","œ","","ž","Ÿ", _
" ","¡","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯", _
"°","±","²","³","´","µ","¶","·","¸","¹","º","»","¼","½","¾","¿", _
"À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï", _
"Ð","Ñ","Ò","Ó","Ô","Õ","Ö","×","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß", _
"à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï", _
"ð","ñ","ò","ó","ô","õ","ö","÷","ø","ù","ú","û","ü","ý","þ","ÿ")

Set oFSO = CreateObject("Scripting.FileSystemObject")

'--- Récupération du nom des fichiers en argument
Set oArgs  = WScript.Arguments
If oArgs.Count < 1 Then
	s=    "Script de conversion d'un fichier .DAT PL7 Pro vers CSV" & vbCrLf
	s=s & " avec des valeurs de types entier, entier double et réel." & vbCrLf
	s=s & "-------------------------------------------------------------------" & vbCrLf
	s=s & "Syntaxe :" & vbCrLf
	s=s & " Pl7DatToCsv <dat> [<csv>]" & vbCrLf
	s=s & "   <dat> : fichier de données généré par PL7 Pro" & vbCrLf
	s=s & "            (doit exister)" & vbCrLf
	s=s & "   <csv> : fichier destination au format CSV" & vbCrLf
	s=s & "            (est créé ou écrasé)" & vbCrLf
	s=s & "            par défaut, il est nommé 'Conversion de <dat>.csv'" & vbCrLf
	WScript.Echo s
	WScript.Quit
Else
	sFicDat = oArgs(0)
	If Not oFSO.FileExists(sFicDat) Then
		MsgBox "Le fichier " & sFicDat & " n'existe pas.", vbCritical, "Erreur"
		WScript.Quit
	End If

	If oArgs.Count > 1 Then
		sFicCsv = oArgs(1)
	Else
		'--- Composition du nom du fichier à créer à partir du fichier d'origine, dans le même répertoire
		Set oFichierDat = oFSO.GetFile(sFicDat)
		sFicCsv = Replace(oFichierDat.ParentFolder & "\Conversion de " & oFichierDat.Name, ".dat", ".csv", 1, -1, vbTextCompare)
	End If
End If
Set oArgs  = Nothing

'--- Ouverture et contrôle (basique) du fichier .DAT
Set oFichierDat = oFSO.OpenTextFile(sFicDat, ForReading)
If oFichierDat.Readline <> "[HEADER]" Then
	MsgBox "Le fichier à convertir n'est pas un fichier de données PL7 Pro.", vbCritical, "Fichier non reconnu"
	WScript.Quit
End If

Set oFSO = CreateObject("Scripting.FileSystemObject")

'--- Lecture du contenu du fichier
sDat = oFichierDat.ReadAll
'- Fermeture du fichier de données
oFichierDat.Close

'--- Expression rationnelle pour rechercher toutes les données
' et récupérer 2 informations : l'adresse du mot et sa valeur
Set oRegExp = New RegExp
oRegExp.Pattern = "AT (%MW[0-9]+) : WORD := \(([0-9]+)\);"
oRegExp.Global = True 'recherche de toutes les occurences
Set oMatches = oRegExp.Execute(sDat)
sDat = ""

If oMatches.Count = 0 Then
	MsgBox "Bizarre, aucune donnée %MW n'a été détectée dans ce fichier...", vbExclamation, "Aucun résultat"
Else
	'--- Création du fichier CSV
	Set oFichierCsv = oFSO.OpenTextFile(sFicCsv, ForWriting,True)
	' avec un en-tête des colonnes
	oFichierCsv.WriteLine "Adresse;INT;DINT;REAL;WORD (hexa.);WORD (bin.);WORD (ASCII)"
	
	'--- Traitement de tous les mots %MW
	sMWprec_Adr = "" ' adresse mémorisée pour le double mot et utilisée à la lecture du 2e mot
	For Each oMatch In oMatches
		' on compte sur le fait que les résultats de l'expression rationnelle
		' sont restitués dans l'ordre des adresses
		sMW_Adr = oMatch.SubMatches(0) 'adresse du mot %MW
		sMW_Val = oMatch.SubMatches(1) 'valeur du mot (16 bits)
		
		'- Format INT
		'conversion de la valeur non signée en valeur signée
		lMW_Val_UINT = CLng(sMW_Val)
		If lMW_Val_UINT > 32767 Then
			lMW_Val_INT =  lMW_Val_UINT - 65536
		Else
			lMW_Val_INT = lMW_Val_UINT
		End If
		
		' valeur hexadécimale sur 4 digits (16 bits) utilisée pour l'assemblage des mots doubles (32 bits)
		' (on complète avec les zéros non significatifs que ne donne pas la fonction Hex)
		sMW_Val_Hexa = Right("0000" & Hex(sMW_Val), 4)
		
		' on commence à écrire au 2e passage pour avoir 2 mots (nécessaires à DINT et REAL)
		If sMWprec_Adr <> "" Then
			'- Format DINT
			lMW_Val_DINT = CLng("&H" & sMW_Val_Hexa & sMWprec_Val_Hexa)
			
			'- Format REAL
			' décomposition des 3 parties binaires d'un nombre à virgule flottante sur 32 bits (selon standard IEEE 754)
			Signe = Sgn(lMW_Val_DINT)
			Exposant = (lMW_Val_DINT And &H7F800000) / &H800000
			Mantisse = lMW_Val_DINT And &H007FFFFF
			' reconstitution de la valeur réelle
			If Exposant = 0 Then
				If Mantisse = 0 Then
					' valeur nulle
					sMW_Val_REAL = "0"
				Else
					' valeur dénormalisée
					sMW_Val_REAL = CStr(CSng(Signe * (2^(-126)) * (Mantisse / &H800000)))
				End If
			ElseIf Exposant = 255 Then
				If Mantisse = 0 Then
					' valeur infinie
					If Signe = -1 Then sMW_Val_REAL = "-1.#INF" Else sMW_Val_REAL = "1.#INF" End If
				Else
					' Not a Number (pas un nombre)
					If Signe = -1 Then sMW_Val_REAL = "-1.#NAN" Else sMW_Val_REAL = "1.#NAN" End If
				End If
			Else
				sMW_Val_REAL = CStr(CSng((Signe * (2^(Exposant-127)) * (1 + Mantisse / &H800000))))
			End If
			
			' écriture des valeurs dans le fichier CSV
			oFichierCsv.WriteLine sMWprec_Adr _
				& ";" & lMWprec_Val_INT _
				& ";" & lMW_Val_DINT _
				& ";" & sMW_Val_REAL _
				& ";16#" & sMWprec_Val_Hexa _
				& ";2#" & HexToBinary(sMWprec_Val_Hexa) _
				& ";'" & tAscii((lMWprec_Val_UINT And &HFF00) \ &H100) & tAscii(lMWprec_Val_UINT And &HFF) & "'"
		End If
		
		' valeurs mémorisées pour le tour suivant
		sMWprec_Adr = sMW_Adr
		lMWprec_Val_UINT = lMW_Val_UINT
		lMWprec_Val_INT = lMW_Val_INT
		sMWprec_Val_Hexa = sMW_Val_Hexa
	Next
	' écriture du dernier mot (qui ne peut pas constituer le poids faible d'un mot double)
	oFichierCsv.WriteLine sMWprec_Adr _
		& ";" & lMW_Val_INT _
		& ";" _
		& ";" _
		& ";16#" & sMW_Val_Hexa _
		& ";2#" & HexToBinary(sMW_Val_Hexa) _
		& ";'" & tAscii((lMW_Val_UINT And &HFF00)\ &H100) & tAscii(lMW_Val_UINT And &HFF) & "'"
	
	'- Fermeture du fichier CSV
	oFichierCsv.Close
End If

Set oMatch = Nothing
Set oMatches = Nothing
Set oRegExp = Nothing


'-------------------------------
Function HexToBinary(ByVal sHex)
' Renvoie une chaine de caractères de bits équivalents aux digits hexadécimaux
' avec un espace séparant chaque quartet (groupe de 4 bits) pour la lisibilité
    Dim tHexDigit
	tHexDigit = "0123456789ABCDEF"
	Dim tBin
	tBin = Array("0000","0001","0010","0011","0100","0101","0110","0111", _
				"1000","1001","1010","1011","1100","1101","1110","1111")
	Dim i
	Dim Result
	
    Result = ""
    For i = 1 To Len(sHex)
        Result = Result & tBin(InStr(tHexDigit, Mid(sHex, i, 1)) - 1) & " "
    Next
	HexToBinary = Trim(Result)
End Function
Mais le copier/coller pose problème avec certains caractères de la table ASCII.
Il est préférable de télécharger le script Pl7DatToCsv.vbs à cet endroit.

Merci pour cette merveille que je n'avais pas vu a l'époque !
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 930
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: Fichier DATA comment extraire la valeur des REAL

Message par Bruce33 »

MiGaNuTs a écrit : 24 févr. 2025, 15:00 Merci pour cette merveille que je n'avais pas vu a l'époque !
Ton message me fait plaisir. Le but c'est que ça serve. J'aimerais avoir plus de temps pour ce genre d'activité.
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1573
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: Fichier DATA comment extraire la valeur des REAL

Message par MiGaNuTs »

Bruce33 a écrit : 25 févr. 2025, 17:24
MiGaNuTs a écrit : 24 févr. 2025, 15:00 Merci pour cette merveille que je n'avais pas vu a l'époque !
Ton message me fait plaisir. Le but c'est que ça serve. J'aimerais avoir plus de temps pour ce genre d'activité.
C'est possible de faire pareil avec les .dtx de Unity ?

Je m'auto réponds.
Oui, c'est par la :

viewtopic.php?p=25001#p25001
Répondre