-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkennfeld.scl
170 lines (136 loc) · 6.48 KB
/
kennfeld.scl
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
// Überarbeitung Johannes Wilhelm Juli 2024
// Changelog:
// Stop trigger extern hinzugefügt
// Prozessfortschritt in % hinzugefüht
// Berechnen von Leistungen aller Arbeitspunkte
// Variable Anzahl Messpunkte
// Todo
// Leistungsarray nach größe sortieren
// Steuerung nach Leistungsarray
// Trigger erkennen
#R_TRIG_InstStart(CLK := #Start,
Q => #FPStart); // Flankenerkennung für Start
#R_TRIG_InstStop(CLK := #Stop,
Q => #FPStop); // Flankenerkennung für Stop
//Stopbedingungen: bei Fehler, Abbruch oder Einschaltsperre der FUs
IF ("SINA_SPEED_TLG20_DB".error OR "SinaSpeed_DB".Lockout OR "SO_Power_DB".AxisError OR "Keba_Statusword".%X6 OR #Abbruch OR #FPStop) THEN
#Stop := TRUE;
#Schritt := 8;
//ELSIF NOT #Start AND #statStart THEN
// #Schritt := 7;
ELSE
#Stop := False;
END_IF;
//wenn Signal #Start positive Flanke hat und kein Fehler ansteht, Werte initialisieren
IF #FPStart AND NOT #Stop AND "7K2" THEN
#statStart := TRUE;
#Schritt := 0;
#n := 0;
#Messung := 0;
#Schleife := FALSE;
#Index := 0;
"HMI".Messzyklen := "HMI".AnzahlMesszyklenAC;
END_IF;
IF #Schritt = 6 THEN //Timer zur verzögerten Ausführung des Messskriptes in WinCC
#StartTimer := TRUE;
ELSE
#StartTimer := FALSE;
END_IF;
#IEC_Timer_Inst(IN := #StartTimer,
PT := T#2s,
Q => #Timer,
ET => #VergZeit);
IF #statStart THEN
CASE #Schritt OF
0: // Messpunkte definieren
"ZES".Messprogramm := 1;
"HMI".Bedienfreigabe := false; //Handbedienung ausschalten
#AnzahlMesspunkte := 0;
FOR #a := 0 TO 9999 DO
#Messpunkt[#a].index := "Messpunkte_DB".index[#a];
#Messpunkt[#a].drehzahl := "Messpunkte_DB".drehzahl[#a];
#Messpunkt[#a].drehmoment := "Messpunkte_DB".drehmoment[#a];
// Prüfe, ob Auslesen beendet und setzte Anzahl der Messpunkte = höchster Indexwert
IF #a > 0 AND #Messpunkt[#a].index = 0 THEN
#AnzahlMesspunkte := #Messpunkt[#a - 1].index;
EXIT;
END_IF;
END_FOR;
#Schritt += 1;
1: //Dateinamen für DataLogging bilden
#Uhrzeit.RetVal := RD_LOC_T(#Uhrzeit.Zeit);
#ZeitstempelDTL := "LGF_DTLtoString_DE"("date" := #Uhrzeit.Zeit, separator := '-');
//Funktion DTLtoString liefert String mit Länge 29 im Format DD-MM-YYYY HH:MM:SS.NSNSNSNSNSNSNSNSNS
//In Dateiname des DataLogging dürfen keine Leerzeichen vorhanden sein, Leerstellen werden nicht benötigt
//Leerzeichen an Position 11 löschen und alles hinter Position 19 (.Nanosekunden) verwerfen
"DataLogging_DB".name := CONCAT(IN1 := 'Mess_Kennfeld_', IN2 := DELETE(IN := LEFT(IN := #ZeitstempelDTL, L := 19), L := 1, P := 11));
#Schritt += 1;
2: //Drehzahl vorgeben und Lastmaschine starten
"Daten".Sinamics.SW := #Messpunkt[#Messung].drehzahl;
"ZES".Drehzahl := #Messpunkt[#Messung].drehzahl;
"Daten".Sinamics.Freigabe := true;
IF "Sinamics_Statusword".%X2 AND "Sinamics_Statusword".%X8 THEN //RM Sinamics in Betrieb und Ziel erreicht
#Schritt += 1;
END_IF;
3: //Drehmoment für Keba vorgeben, Prüfmaschine starten und anschließend über WinCC Messung starten
"Daten".Keba.SW := #Messpunkt[#Messung].drehmoment;
"ZES".Drehmoment := #Messpunkt[#Messung].drehmoment;
"Daten".Keba.Freigabe := true;
IF "Keba_Statusword".%X2 AND "Keba_Statusword".%X10 AND "Sinamics_Statusword".%X8 THEN //RM Keba in Betrieb und Ziel erreicht bei beiden FUs
#Schritt += 1;
END_IF;
4: // Starte Messung
"ZES".NummerMessung := #Messung;
"ZES".AnzahlMessungen := #AnzahlMesspunkte;
"DataLogging_DB".dataLogEntries := INT_TO_UINT(#AnzahlMesspunkte + 1);
"ZES".StartMessung := true; //-> WinCC-Skript starten
#Schritt += 1;
5: //Warten, bis WinCC Skript fertig ist und DataLogging starten
IF "ZES".SPSAuslesen THEN //Bit wird von WinCC-Skript gesetzt, startet DataLogging ->FB12 WinCCDataLog_V2
"ZES".StartMessung := false;
#Schritt += 1;
ELSIF "HMI".Fehler_Skript THEN
IF #Schleife = false THEN //bei erstmaligem Fehler
"ZES".StartMessung := false; //Messung neustarten und zurück in Schritt 2
"HMI".Fehler_Skript := false; //Fehlervariable zurücksetzen, falls WinCC zu langsam
#Schleife := true;
#Schritt := 2;
ELSIF #Schleife THEN //bei erneutem Fehler Abbruch
#Schritt := 7;
END_IF;
END_IF;
6: //Warten, bis DataLogging fertig und Timer abgelaufen ist
IF NOT "ZES".SPSAuslesen AND #Timer THEN
#Schritt += 1;
END_IF;
7: //Überprüfen, ob nächster Punkt angefahren wird oder Messung zu Ende ist
#Index := (100 / #AnzahlMesspunkte) * (#Messung + 1);
IF #Messung < #AnzahlMesspunkte THEN
#n += 1;
#Messung += 1;
#Schritt := 2;
ELSE
#Schritt += 1;
END_IF;
8: //Ende, alles zurücksetzen
"Daten".Sinamics.Freigabe := FALSE;
"Daten".Keba.Freigabe := FALSE;
"Daten".Sinamics.SW := 0.0;
"Daten".Keba.SW := 0.0;
"ZES".Messprogramm := 0;
#statStart := false;
#Index := 0;
IF #Abbruch THEN //bei Abbruch weitere Werte zurücksetzen und angefangenes DataLog löschen
"DataLogging_DB".write := False;
"DataLogging_DB".delete := TRUE;
"ZES".SPSAuslesen := false;
"ZES".StartMessung := false;
"Daten".StartStringAuslesen := FALSE;
ELSIF NOT #Abbruch THEN
"HMI".Bedienfreigabe := true;
"HMI".FUSpannung := true;
END_IF;
ELSE // Statement section ELSE
;
END_CASE;
END_IF;