Skip to content

Commit 0c57f15

Browse files
committed
restructuring, startTIA, create_project and create_devices
1 parent fe01ac7 commit 0c57f15

10 files changed

+177
-98
lines changed

__pycache__/device.cpython-312.pyc

1000 Bytes
Binary file not shown.

__pycache__/openness.cpython-312.pyc

3.12 KB
Binary file not shown.
772 Bytes
Binary file not shown.
6.31 KB
Binary file not shown.
1.08 KB
Binary file not shown.

device.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Device:
2+
def __init__(self, name):
3+
self.name = name
4+
self.modules = []
5+
6+
def add_module(self, module):
7+
self.modules.append(module)
8+
9+
def __str__(self):
10+
return f"Name: {self.name}\nModules: {', '.join(self.modules)}"

openness.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import clr
2+
clr.AddReference('C:\Program Files\Siemens\Automation\Portal V18\PublicAPI\V18\Siemens.Engineering.dll')
3+
from System.IO import DirectoryInfo, FileInfo
4+
import Siemens.Engineering as tia
5+
import Siemens.Engineering.HW.Features as hwf
6+
import Siemens.Engineering.Compiler as comp
7+
import os
8+
9+
10+
class TIAProject:
11+
def __init__(self):
12+
self.tia_instance = None
13+
self.project = None
14+
15+
def startTIA(self, ui: bool):
16+
self.tia_instance = tia.TiaPortal(tia.TiaPortalMode.WithUserInterface) if ui else tia.TiaPortal(tia.TiaPortalMode.WithoutUserInterface)
17+
18+
def generate_project_name(self, project_path, project_name):
19+
_project_name = project_name
20+
count = 1
21+
while os.path.exists(f'{project_path}\\{_project_name}'):
22+
_project_name = f"{project_name}({count})"
23+
count += 1
24+
return _project_name
25+
26+
def create_project(self, project_path, project_name):
27+
self.project = self.tia_instance.Projects.Create(DirectoryInfo(project_path), self.generate_project_name(project_path, project_name))
28+
29+
#Adding the main components
30+
def create_device(self, name: str, device: str, version: float):
31+
try:
32+
print (f'Creating {device}/V{version}')
33+
PLC1_mlfb = f'OrderNumber:{device}/V{version}'
34+
return self.project.Devices.CreateWithItem(PLC1_mlfb, name, name)
35+
36+
except tia.EngineeringTargetInvocationException:
37+
print('invalid version')
38+
version -= 0.1
39+
self.create_device(name, device, round(version,1))
40+
41+
42+
#PLC1 = create_device('PLC1', '6ES7 518-4FP00-0AB0', 10.0)
43+
44+
45+
#self.project.Save()

projectGenerator.py

-60
This file was deleted.

userInterface.py

+105-24
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,133 @@
1+
import os
12
import tkinter as tk
23
from tkinter import filedialog
4+
from openness import TIAProject
5+
from xmlHandler import extract_info
36

4-
class FileParameterUI:
7+
class ProjectGeneratorUI:
58
def __init__(self, master):
69
self.master = master
710
self.master.iconbitmap('.\\cora.ico')
811
self.master.title("TIA Project Generator")
912

13+
self.tia_project = TIAProject()
14+
1015
self.xml_path = ""
1116
self.project_path = ""
1217
self.project_name = ""
18+
self.devices = []
1319

14-
self.file_label = tk.Label(master, text="Tia Selection Tool:")
20+
self.file_label = tk.Label(master, text="1. Choose the HW file (TIA Selection Tool|*.tia):")
1521
self.file_label.grid(row=0, column=0, sticky="w", padx=10, pady=5)
1622

17-
self.file_label = tk.Label(master, text="Select File (.tia):")
18-
self.file_label.grid(row=1, column=0, sticky="w", padx=10, pady=5)
19-
2023
self.file_entry = tk.Entry(master, width=50)
21-
self.file_entry.grid(row=1, column=1, padx=10, pady=5)
24+
self.file_entry.grid(row=0, column=1, padx=10, pady=5)
25+
26+
self.browse_button = tk.Button(master, text="Search", command=self.browse_xml)
27+
self.browse_button.grid(row=0, column=2, padx=10, pady=5)
28+
29+
self.project_label = tk.Label(master, text="2. Choose how to save the project:")
30+
self.project_label.grid(row=1, column=0, sticky="w", padx=10, pady=5)
2231

23-
self.browse_button = tk.Button(master, text="Browse", command=self.browse_file)
24-
self.browse_button.grid(row=1, column=2, padx=10, pady=5)
32+
self.project_entry = tk.Entry(master, width=50)
33+
self.project_entry.grid(row=1, column=1, padx=10, pady=5)
2534

26-
self.parameter_label = tk.Label(master, text="Enter Parameter:")
27-
self.parameter_label.grid(row=2, column=0, sticky="w", padx=10, pady=5)
35+
self.browse_project_button = tk.Button(master, text="Search", command=self.browse_project)
36+
self.browse_project_button.grid(row=1, column=2, padx=10, pady=5)
2837

29-
self.parameter_entry = tk.Entry(master, width=50)
30-
self.parameter_entry.grid(row=2, column=1, padx=10, pady=5)
38+
self.create_button = tk.Button(master, text="Create Project", command=self.create_project)
39+
self.create_button.grid(row=3, columnspan=3, padx=10, pady=10)
3140

32-
self.submit_button = tk.Button(master, text="Submit", command=self.submit)
33-
self.submit_button.grid(row=3, columnspan=3, padx=10, pady=10)
41+
self.output_label = tk.Label(master, text="Progress:")
42+
self.output_label.grid(row=4, column=0, sticky="w", padx=10, pady=5)
3443

35-
def browse_file(self):
36-
file_path = filedialog.askopenfilename()
44+
self.output_text = tk.Text(master, width=50, height=10)
45+
self.output_text.grid(row=5, columnspan=3, padx=10, pady=5)
46+
47+
def browse_xml(self):
48+
file_path = filedialog.askopenfilename(filetypes=[("TIA Selection Tools Files", "*.tia")])
49+
self.xml_path = file_path
50+
self.devices = extract_info(self.xml_path)
3751
self.file_entry.delete(0, tk.END)
38-
self.file_entry.insert(0, file_path)
52+
self.file_entry.insert(0, self.xml_path)
53+
54+
def browse_project(self):
55+
project_path = filedialog.asksaveasfilename()
56+
self.project_path = os.path.dirname(project_path)
57+
self.project_name = os.path.basename(project_path)
58+
self.project_entry.delete(0, tk.END)
59+
self.project_entry.insert(0, project_path)
60+
61+
def create_project(self):
62+
self.output_text.delete(1.0, tk.END) # Clear previous output
63+
if not self.xml_path or not self.project_path or not self.project_name:
64+
self.output_text.insert(tk.END, "Please, fill in all fields.\n")
65+
return
66+
67+
#start tia
68+
self.output_text.delete(1.0, tk.END)
69+
self.output_text.insert(tk.END, "Inicializing TIA Portal without UI...\n")
70+
self.output_text.see(tk.END)
71+
self.master.update()
72+
try:
73+
self.tia_project.startTIA(False)
74+
except Exception as e:
75+
self.output_text.insert(tk.END, f"❌ Error to open TIA: {e}\n")
76+
self.output_text.see(tk.END)
77+
return
78+
else:
79+
self.output_text.insert(tk.END, f"✔ TIA started successfully\n")
80+
self.output_text.see(tk.END)
81+
self.master.update()
3982

40-
def submit(self):
41-
file_path = self.file_entry.get()
42-
parameter = self.parameter_entry.get()
43-
# Do something with the file and parameter, e.g., process the file using the parameter
44-
print("File:", file_path)
45-
print("Parameter:", parameter)
83+
#create project
84+
self.output_text.insert(tk.END, f"Creating the project {self.project_name}...\n")
85+
self.output_text.see(tk.END)
86+
self.master.update()
87+
try:
88+
self.tia_project.create_project(self.project_path, self.project_name)
89+
except Exception as e:
90+
self.output_text.insert(tk.END, f"❌ Error to create the project: {e}\n")
91+
self.output_text.see(tk.END)
92+
return
93+
else:
94+
self.output_text.insert(tk.END, f"✔ Project created successfully\n")
95+
self.output_text.see(tk.END)
96+
self.master.update()
97+
98+
#create devices
99+
self.output_text.insert(tk.END, f"Creating devices...\n")
100+
self.master.update()
101+
for idx, device in enumerate(self.devices, start=1):
102+
self.output_text.insert(tk.END, f"Creating Device {idx}: {device.name}\n")
103+
self.output_text.see(tk.END)
104+
self.master.update()
105+
try:
106+
self.tia_project.create_device(device.name, device.modules[0], 10.0)
107+
except Exception as e:
108+
self.output_text.insert(tk.END, f"❌ Error to create the device: {e}\n")
109+
self.output_text.see(tk.END)
110+
return
111+
else:
112+
self.output_text.insert(tk.END, f"✔ Device created successfully\n")
113+
self.output_text.see(tk.END)
114+
self.master.update()
115+
# def output_animated_text(self, text):
116+
# self.output_text.delete(1.0, tk.END)
117+
# if count <= 3:
118+
# dots = "." * count
119+
# self.output_text.insert(tk.END, f"{text}{dots}")
120+
# count += 1
121+
# elif self.animateText:
122+
# count = 0
123+
# self.output_text.insert(tk.END, text)
124+
# else:
125+
# return
126+
# self.master.after(500, lambda: self.output_animated_text(text))
46127

47128
def main():
48129
root = tk.Tk()
49-
app = FileParameterUI(root)
130+
app = ProjectGeneratorUI(root)
50131
root.mainloop()
51132

52133
if __name__ == "__main__":

xmlHandler.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import xml.etree.ElementTree as ET
2+
from device import Device
23

34
# Função para extrair informações de dispositivos e módulos
45
def extract_info(xml_file):
@@ -15,30 +16,32 @@ def extract_info(xml_file):
1516
# Se encontrarmos um novo dispositivo, criamos uma nova lista
1617
if current_device:
1718
devices.append(current_device)
18-
current_device = {"Name": node.get("Name"), "Modules": []}
19+
current_device = Device(node.get("Name"))
20+
#current_device = {"Name": node.get("Name"), "Modules": []}
1921
elif node_type == "Module" and current_device:
2022
# Adicionamos o Mlfb do módulo ao dispositivo atual
21-
current_device["Modules"].append(node.get("Mlfb"))
23+
#current_device["Modules"].append(node.get("Mlfb"))
24+
current_device.add_module(node.get("Mlfb"))
2225

2326
# Adicionamos o último dispositivo à lista
2427
if current_device:
2528
devices.append(current_device)
2629

2730
return devices
2831

29-
# Caminho para o arquivo XML
30-
xml_file_path = "C:\\Users\\Cassioli\\Desktop\\my.xml"
32+
# # Caminho para o arquivo XML
33+
# xml_file_path = "C:\\Users\\Cassioli\\Desktop\\my.xml"
3134

32-
# Extrair informações do arquivo XML
33-
device_info = extract_info(xml_file_path)
35+
# # Extrair informações do arquivo XML
36+
# device_info = extract_info(xml_file_path)
3437

35-
# Imprimir as informações dos dispositivos e módulos
36-
for idx, device in enumerate(device_info, start=1):
37-
print(f"Device {idx}:")
38-
print(f"Name: {device['Name']}")
39-
print("Modules:")
40-
for module in device["Modules"]:
41-
print(f"- {module}")
42-
print()
38+
# # Imprimir as informações dos dispositivos e módulos
39+
# for idx, device in enumerate(device_info, start=1):
40+
# print(f"Device {idx}:")
41+
# print(f"Name: {device['Name']}")
42+
# print("Modules:")
43+
# for module in device["Modules"]:
44+
# print(f"- {module}")
45+
# print()
4346

4447

0 commit comments

Comments
 (0)