Author: Moritz Wurian
Script path: https://svn.woojin.at/svn/RD/02_Control/00_Topics/2022/2022_TC09_TE_IMC500_KEB/DatFile_Generator/Python

(no longer in active use)

This Python-based generator was developed to support the initial configuration of drives in injection molding machines using a Combivis XML project file. It created a .dat configuration file that could be imported by the IMC500 controller, allowing for a predefined parameter set to be applied at machine startup.

Purpose

The tool allowed users to:

  • Convert drive parameters from a Combivis project (XML format)
  • Generate a compatible .dat file for IMC500 systems
  • Select either all parameters or only specific indices
  • Automatically convert and byte-swap hex data into decimal format

Key Features

  • GUI-based workflow using Tkinter (file selection, parameter selection, save path)
  • Optional filtering using an index list (.txt)
  • Automatic conversion and byte-order correction
  • Structured output matching the IMC500 format: pythonKopierenBearbeitenAXdat_DataObject[0] = 15360, 0, 2018915346, 4; Optional comment

Deprecation Notice

This tool is no longer in active use.
Drive configurations are now handled via CSV files, which can be saved and reloaded directly through the IMC500 HMI or control interface. This approach is more transparent, flexible, and integrates better with versioning systems and parameter editors.


Let me know if you want to include a download link or move it to an “archived tools” section.

import xml.etree.ElementTree as ET
import tkinter as tk
from tkinter import filedialog, messagebox
import os

# Liste der zu vergleichenden Indizes
def index_list_from_txt(filepath):
    """
    Liest Indizes aus einer Textdatei, ignoriert Kommentare nach '#' und verarbeitet Kommas.

    Args:
        filepath: Der Pfad zur Textdatei.

    Returns:
        Eine Liste der extrahierten Indizes als Ganzzahlen.
    """
    try:
        with open(filepath, "r") as file:
            parameter_list = []
            for line in file:
                # Split the line at the first occurrence of '#' or ','
                parts = line.split('#', 1)[0].split(',', 1)[0].strip()

                if parts.isdigit():
                    parameter_list.append(int(parts))

        return parameter_list
    except FileNotFoundError:
        messagebox.showerror("Fehler", f"Die Datei {filepath} wurde nicht gefunden.")
        exit(1) 

def byteswap_und_hex_zu_dez(hex_str):
    """
    Führt einen Byteswap auf einer Hex-Zeichenkette durch und konvertiert sie in eine Dezimalzahl.

    Args:
        hex_str: Die Hex-Zeichenkette.

    Returns:
        Die entsprechende Dezimalzahl.
    """
    swapped = bytes.fromhex(hex_str)[::-1]
    return int(swapped.hex(), 16)

def datalength_anpassen(data):
    """
    Passt die Datenlänge basierend auf der Anzahl der Hex-Zeichen an.

    Args:
        data: Die Daten.

    Returns:
        Die angepasste Datenlänge.
    """
    length = len(data) // 2 
    if length == 0:
        return 1
    elif length == 3:
        return 4
    else:
        return length

def xml_auslesen_und_verarbeiten(xml_datei, index_list, all_parameters):
    """
    Liest eine XML-Datei, verarbeitet die Daten und schreibt sie in eine .dat-Datei.

    Args:
        xml_datei: Der Pfad zur XML-Datei.
        index_list: Eine Liste der zu verarbeitenden Indizes (leer, wenn alle Parameter verarbeitet werden sollen).
        all_parameters: Ein boolescher Wert, der angibt, ob alle Parameter verarbeitet werden sollen.
    """
    try:
        tree = ET.parse(xml_datei)
        root = tree.getroot()

        with open(datFilePath, "w") as dat_file:
            counter = 0
            for initCmd in root.findall(".//InitCmd"):
                index = int(initCmd.find("Index").text)
                if not all_parameters and index not in index_list:
                    continue 

                subIndex = initCmd.find("SubIndex").text
                data = initCmd.find("Data").text
                comment_element = initCmd.find("Comment")
                comment = comment_element.text if comment_element is not None else "" 
                datalength = datalength_anpassen(data)
                dez_data = byteswap_und_hex_zu_dez(data)

                dat_file.write(f'"AXdat_DataObject[{counter}] = {index}, {subIndex}, {dez_data}, {datalength}" {";"} {comment}\n')
                counter += 1
    except ET.ParseError as e:
        messagebox.showerror("Fehler", f"Fehler beim Parsen der XML-Datei: {e}")
        exit(1) 

# Tkinter Root-Fenster erstellen
root = tk.Tk()
root.withdraw()

# Dialog zur Dateiauswahl öffnen
xml_datei = filedialog.askopenfilename(title="Parameter-File auswählen", filetypes=[("XML", "*.xml"), ("Alle Dateien", "*.*")])

# Überprüfung, ob eine Datei ausgewählt wurde
if not xml_datei:
    messagebox.showinfo("Info", "Keine XML-Datei ausgewählt. Das Programm wird beendet.")
    exit(0)

# Auswahl, ob alle Parameter übertragen werden sollen
user_choice = messagebox.askquestion("XML Einträge übertragen", "Möchten Sie alle Parameter übertragen?")
all_parameters = user_choice == 'yes'

# Indexliste laden, falls nicht alle Parameter übertragen werden sollen
if not all_parameters:
    index_file_path = filedialog.askopenfilename(title="Index-Liste auswählen", filetypes=[("Textdateien", "*.txt"), ("Alle Dateien", "*.*")])
    
    if not index_file_path:
        messagebox.showinfo("Info", "Keine Index-Liste ausgewählt. Das Programm wird beendet.")
        exit(0)

    index_list = index_list_from_txt(index_file_path)
else:
    index_list = []  # Leere Liste, wenn alle Parameter übertragen werden sollen

# Dialog zur Dateispeicherung öffnen
datFilePath = filedialog.asksaveasfilename(defaultextension=".dat", filetypes=[("Datendateien", "*.dat"), ("Alle Dateien", "*.*")])

# Überprüfung, ob ein Speicherort ausgewählt wurde
if not datFilePath:
    messagebox.showinfo("Info", "Kein Speicherort ausgewählt. Das Programm wird beendet.")
    exit(0)

root.destroy()

# XML-Datei verarbeiten und in .dat-Datei schreiben
xml_auslesen_und_verarbeiten(xml_datei, index_list, all_parameters)

# Erfolgsmeldung anzeigen
messagebox.showinfo("Erfolg", "Die Verarbeitung ist abgeschlossen. Die .dat-Datei wurde erstellt.")
Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Scroll to Top
0
Would love your thoughts, please comment.x
()
x