/
db_sim.py
265 lines (219 loc) · 8.12 KB
/
db_sim.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# machine data creation tool for machine learning project
# dorian zwanzig 2018-11-03
# version 0.3.201811210800
import numpy as np
import sys
import random
from datetime import datetime, timedelta
import pymssql
import time as t
password = input("Bitte geben Sie das Serverpasswort ein: ")
# Verbindung mit Datenbank herstellen
conn = pymssql.connect("pcs.f4.htw-berlin.de", "Masterprojekt", password, "PraediktiveAnalysenTest")
cursor = conn.cursor()
# letzten Datensatz abrufen
cursor.execute('SELECT TOP 1 * FROM Maschinendaten_20181122 ORDER BY ID DESC')
list_1 = cursor.fetchall()
# ID extrahieren
last_id = list_1[0]
last_id = last_id[0]
last_id = int(last_id.replace("400_1_", "")) - 1000000
# Uhrzeit extrahieren
last_time = list_1[0]
last_time = last_time[2]
# Startwerte (STartData):
std_dz = 100 # Startdrehzahl
std_la = 18.5 # Startleistungsaufnahme
std_vb = 0 # Startvibration
std_ls = 75 # Startlautstärke
data_id_nr = 1000000 + last_id # Startwert für die Datensatz ID, wird um "400_1_" am Anfang ergänzt
std_te = 100 # Starttemperatur
fehler_id = "leer" # Fehlerwert bei Ausfall
time = last_time # Startzeit der Simulation
datum = "leer" # Simuliertes Datum
uhrzeit = "leer" # Simulierte Uhrzeit
machine_id = "XL400_01" # Identifikation der Maschine
prod_programm = "PP001" # Produktionsprogramm
soll_menge = 2350 # Soll-Menge des Produktionsprogramm
ist_menge = 2350 # Tatsächlich produzierte Menge
ausschuss = 0 # Fehlerhafte Teile
new_row = () # Neue Zeile für Serverübergabe
# Nutzerabfrage: Menge Datensätze
menge = int(input("Bitte Anzahl der gewünschten Datensätze eingeben: "))
# Liste für Übergabe an DB vorbereiten und Übergabefunktion aufrufen
def write_data():
global menge, std_dz, std_la, std_vb, std_ls, data_id_nr, std_te, fehler_id, ist_menge, ausschuss, new_row, datum, uhrzeit, soll_menge, prod_programm, machine_id, time
new_row = tuple(("400_1_" + str(data_id_nr), machine_id, time, datum, uhrzeit, std_dz, std_la, std_vb, std_ls, std_te, fehler_id,
prod_programm, soll_menge, ist_menge, ausschuss, "5"))
print("--------------------")
print("new_row" + str(new_row))
write_db()
# Liste an Datenbank übergeben
def write_db():
global new_row
cursor.executemany(
"INSERT INTO Maschinendaten_20181122 VALUES (%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
[new_row])
conn.commit()
print("--------------------")
print("new_row commited")
wait()
# Zeitzähler
def timer():
global time, datum, uhrzeit
time = time + timedelta(seconds=30)
now = str(time).split()
datum = str(now[0])
uhrzeit = str(now[1])
# Wartezeit
def wait():
print("--------------------")
print("Warte 5 Sekunden...")
t.sleep(5)
# Erstellung mehrerer Datensätze durch Schleife (Normalbetrieb)
def normalbetrieb():
global menge, std_dz, std_la, std_vb, std_ls, data_id_nr, std_te, time, fehler_id, ist_menge, ausschuss
x = 0
y = random.randrange(1, 50)
while x < y:
std_dz = 100
std_la = round(np.random.normal(18.5, 0.1), 3)
std_vb = round(np.random.normal(0, 0.1), 3)
std_ls = round(np.random.normal(75, 0.1), 3)
data_id_nr = data_id_nr + 1
timer()
std_te = 100
fehler_id = "x000"
ist_menge = 2350
ausschuss = random.randrange(0, 20)
write_data()
x = x + 1
# Erstellung mehrerer Datensätze durch Schleife (Wartung)
def wartung():
global menge, std_dz, std_la, std_vb, std_ls, data_id_nr, std_te, time, fehler_id, ist_menge, ausschuss
fehler_id = wartung_grund()
x = 0
y = random.randrange(10, 200)
while x < y:
std_dz = 0
std_la = round(np.random.normal(2, 0.1), 3)
std_vb = round(np.random.normal(0, 0.3), 3)
std_ls = round(np.random.normal(25, 0.1), 3)
data_id_nr = data_id_nr + 1
timer()
std_te = std_te - 1
ist_menge = 0
ausschuss = 0
write_data()
x = x + 1
# Wartungsgrund auswählen
def wartung_grund():
random_choice = random.randrange(1, 100)
if random_choice < 40:
return "A001" # Kein Material/ kein Auftrag/ kein Personal (A001)
elif random_choice < 70:
return "A002" # ungeplanter Werkzeugwechsel/ Rüsten (A002)
elif random_choice < 80:
return "A003" # ungeplante Wartung (A003)
elif random_choice < 95:
return "A004" # ungeplante Reinigung (A004)
else:
return "A000" # Sonstiger ungeplanter Grund (A000)
# Erstellung mehrerer Datensätze durch Schleife (Ausfall aufgrund zu hoher Motortemperatur)
def ausfall_2():
global menge, std_dz, std_la, std_vb, std_ls, data_id_nr, std_te, time, fehler_id, ist_menge, ausschuss
fehler_id = "x000"
x = 1
# Motortemperatur steigt bis zum Ausfall
while std_te < 200:
std_dz = 100 + random.randrange(-4, 0)
std_la = round(np.random.normal(18.5*x, 0.2), 3)
std_vb = round(np.random.normal(0, 0.1), 3)
std_ls = round(np.random.normal(75, 0.1), 3)
data_id_nr = data_id_nr + 1
timer()
std_te = round(std_te + np.random.normal(1, 0.5), 1)
ist_menge = int(std_dz * 47 / 2)
ausschuss = int(round(x * x * random.randrange(5, 20), 0))
write_data()
x = x + round(np.random.normal(0.001, 0.002), 3)
fehler_id = "F002"
# Abkühlung bis Normaltemperatur bevor Maschine wieder angeschaltet wird
while std_te > 100:
std_dz = 0
std_la = round(np.random.normal(1.5, 0.1), 3)
std_vb = round(np.random.normal(0, 0.05), 3)
std_ls = round(np.random.normal(25, 0.1), 3)
data_id_nr = data_id_nr + 1
std_te = round(std_te - 1, 1)
timer()
ist_menge = 0
ausschuss = 0
write_data()
x = x + 1
# Erstellung mehrerer Datensätze durch Schleife (Ausfall aufgrund zu hoher Leistungsaufnahme)
def ausfall_1():
global menge, std_dz, std_la, std_vb, std_ls, data_id_nr, std_te, time, fehler_id, ist_menge, ausschuss
fehler_id = "x000"
x = 1
# Strombedarf steigt bis zum Ausfall
while std_la < 25:
std_dz = 100 + random.randrange(-3, 1)
std_la = round(np.random.normal(18.5*x, 0.2), 3)
std_vb = round(np.random.normal(0, 0.1), 3)
std_ls = round(np.random.normal(75, 0.1), 3)
data_id_nr = data_id_nr + 1
timer()
std_te = round(std_te + np.random.normal(0.5, 0.2), 1)
ist_menge = int(std_dz * 47 / 2)
ausschuss = int(round(x * x * random.randrange(5, 20), 0))
write_data()
x = x + round(np.random.normal(0.005, 0.005), 3)
fehler_id = "F001"
# zufällige Ausfallzeit
x = 0
y = random.randrange(10, 50)
while x < y:
std_dz = 0
std_la = round(np.random.normal(1.5, 0.1), 3)
std_vb = round(np.random.normal(0, 0.1), 3)
std_ls = round(np.random.normal(25, 0.1), 3)
data_id_nr = data_id_nr + 1
std_te = round(std_te - 1, 1)
timer()
ist_menge = 0
ausschuss = 0
write_data()
x = x + 1
# Für Test nur Normalbetrieb und Ausfall 1 eingeschaltet
def choose_test():
random_choice = random.randrange(1, 100)
if random_choice < 50:
normalbetrieb()
else:
ausfall_1()
# Auswahl zwischen den Events
def choose_normal():
random_choice = random.randrange(1, 100)
if random_choice < 80:
normalbetrieb()
elif random_choice < 90:
ausfall_1()
elif random_choice < 97:
ausfall_2()
else:
wartung()
# Aufruf Auswahl
choice = input("Für Testbetrieb bitte 'TEST' eingeben, andere Eingaben führen zum Normalbetrieb des Simulators: ")
while (data_id_nr - last_id - 10000000) < menge:
if choice == "TEST":
choose_test()
else:
choose_normal()
# Schließen der Datenbankverbindung
conn.close()
print("Serververbindung geschlossen!")
# Erfolgsbestätigung
counter = data_id_nr - last_id - 1000000
print("Datei mit " + str(counter) +
" Datensätzen wurde erstellt! Programm wird beendet")