-
Notifications
You must be signed in to change notification settings - Fork 0
/
vfd.hal
151 lines (112 loc) · 7.43 KB
/
vfd.hal
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
#=======================================================================#
#Hal Datei für: - Modbus (RS485) Kommunikation mit SOURCETRONIC FU #
#Andre , last edit: 26.12.2019 #
#=======================================================================#
#=======================================================================#
#.ini Datei laden:
loadusr -Wn st500 mb2hal config=mb2hal.ini
#=======================================================================#
#Funktionen laden und initialisieren:
loadrt mux4 names=mux4.fu.runmode #Multiplexer -> Wählt 1 von 4 Zuständen aus Liste (je nach Zustand von .sel)
loadrt mult2 names=mult2.fu.freq.send,mult2.fu.freq.return #Multiplikation -> Multipliziert 2 Signale
loadrt limit1 names=limit1.fu.send.freq.check,limit1.fu.return.drz.check #Grenzwertüberprüfung -> Prüft ob Wert zwischen Max und Min-Wert
loadrt comp names=comp.fu.return.error.state,comp.fu.return.timeout.state #Komparator -> Prüft ob Wert grösser oder kleiner ist als Sollwert
loadrt and2 names=and2.read.estop,and2.estop-vergleich #UND Verknüpfung -> Prüft ob beie Eingänge 1 sind
loadrt near names=near.soll.drz #Bereichsprüfung -> Prüft ob Werte innerhalb eines bestimmten Bereichs
loadrt conv_u32_float count=1
loadrt not names=not.vfd
#Hal Komponenten dem Servo-Thread zuweisen:
#(Servo-thread -> für langsamere Aufgaben (reicht für Modbus))
addf mux4.fu.runmode servo-thread
addf mult2.fu.freq.send servo-thread
addf mult2.fu.freq.return servo-thread
addf limit1.fu.send.freq.check servo-thread
addf limit1.fu.return.drz.check servo-thread
addf comp.fu.return.error.state servo-thread
addf comp.fu.return.timeout.state servo-thread
addf and2.read.estop servo-thread
addf near.soll.drz servo-thread
addf conv-u32-float.0 servo-thread
addf and2.estop-vergleich servo-thread
addf not.vfd servo-thread
#*******************
# SPINDLE S
#*******************
setp pid.s.Pgain [SPINDLE_9]P
setp pid.s.Igain [SPINDLE_9]I
setp pid.s.Dgain [SPINDLE_9]D
setp pid.s.bias [SPINDLE_9]BIAS
setp pid.s.FF0 [SPINDLE_9]FF0
setp pid.s.FF1 [SPINDLE_9]FF1
setp pid.s.FF2 [SPINDLE_9]FF2
setp pid.s.deadband [SPINDLE_9]DEADBAND
setp pid.s.maxoutput [SPINDLE_9]MAX_OUTPUT
setp pid.s.error-previous-target true
net spindle-index-enable <=> pid.s.index-enable
net spindle-enable => pid.s.enable
net spindle-vel-cmd-rpm => pid.s.command
net spindle-vel-fb-rpm => pid.s.feedback
net spindle-output <= pid.s.output
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= spindle.0.speed-out-rps
net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs
net spindle-vel-cmd-rpm <= spindle.0.speed-out
net spindle-revs => spindle.0.revs
net spindle-vel-fb-rps => spindle.0.speed-in
net spindle-index-enable <=> spindle.0.index-enable
#=======================================================================#
#Spindel Start / Stop:
#Parameter: Start Vorwärts (CW) / Start Rückwärts (CCW) / Stop
setp mux4.fu.runmode.in0 6 # Stop (Bremsen...Stop) -> Sourcetronic Register: 0x0006
setp mux4.fu.runmode.in1 2 # Start Rückwärts (CCW) -> Sourcetronic Register: 0x0002
setp mux4.fu.runmode.in2 6 # Stop (Bremsen...Stop) -> Sourcetronic Register: 0x0006
setp mux4.fu.runmode.in3 1 # Start Vorwärts (CW) -> Sourcetronic Register: 0x0001
net spindle-enable => mux4.fu.runmode.sel0 #Spindel Stop (Softwarebutton LinuxCNC) -> Parameter Bremsen laden
net spindle-cw => mux4.fu.runmode.sel1 #Spindel Vorwärts (Softwarebutton LinuxCNC) -> Parameter Vorwärts (CW) laden
net spindle-ccw <= spindle.0.reverse
net spindle-brake <= spindle.0.brake
net spindle-runmode mux4.fu.runmode.out => st500.runmode.command #-> Parameter an mb2hal.ini übergeben und an Sourcetronic senden...
#=======================================================================#
#Frequenzberechnung:
#Drehzahl aus LinuxCNC in Prozentsatz von Maximalfrequenz am FU umrechnen
#Prozentsatz * 100 damit keine Nachkommastellen übertragen werden müssen
#-> Minimaldrehzahl: 2400 U/min = 40 Hz = 10% = 1000 (Prozent * 100)
#-> Maximaldrehzahl: 24000 U/min = 400 Hz = 100% = 10000 (Prozent * 100)
net spindle-vel-cmd-rpm-abs spindle.0.speed-out-abs
net input-drehzahl => mult2.fu.freq.send.in0 #<- Drehzahl aus LinuxCNC einlesen...
setp mult2.fu.freq.send.in1 0.41667 #(Drehzahl * 0.416667) = Freq in % /-> 100/24000 * 100 = 0.41667 => Prozentwert der Drezahl * 100
net spindle-speed-raw mult2.fu.freq.send.out => limit1.fu.send.freq.check.in #-> an Min / Max Prüfung weitergeben...
#Prüfen ob Drehzahl gültig (im Range):
setp limit1.fu.send.freq.check.min 1000 #Minimale Drehzahl -> 2400 U/min (40 Hz) => 2400 * 0.416667
setp limit1.fu.send.freq.check.max 10000 #Maximale Drehzahl -> 24000 U/min (400 Hz) => 24000 * 0.416667
net fu-freq-send limit1.fu.send.freq.check.out => st500.write.frequency #-> Parameter an mb2hal.ini übergeben und an Sourcetronic senden...
#=======================================================================#
#Notstop:
#betätigt Notstop wenn FU Fehlermeldung oder LinuxCNC Notstop generiert
#FU Status auf Fehler prüfen:
net fu-convert st500.error.num_errors => conv-u32-float.0.in
net fu-error-state st500.error.state.float => comp.fu.return.error.state.in0 #<- Fehler - Parameter aus mb2hal.ini kommend von Sourcetronic einlesen...
setp comp.fu.return.error.state.in1 1 #Wenn .in0 kleiner als dierser Grenzwert, dann sind keine Fehler vorhanden!
net fu-timeout-state conv-u32-float.0.out => comp.fu.return.timeout.state.in0
setp comp.fu.return.timeout.state.in1 10
net estop-vergleich1 comp.fu.return.error.state.out => and2.estop-vergleich.in0
net estop-vergleich2 comp.fu.return.timeout.state.out => and2.estop-vergleich.in1
#Schaltet Notstop wenn:
#Fehlermeldung von Sourcetronic kommt
net estop-vfd-error-neg not.vfd.in <= and2.estop-vergleich.out
net estop-vfd-error <= not.vfd.out
#=======================================================================#
#Ist-Drehzahl und Solldrehzahl erreicht Anzeige:
#Aktuelle Frequenz vom FU einlesen und in Drehzahl umrechnen:
net fu-read-actual-freq st500.read.frequency.float => mult2.fu.freq.return.in0 #<- aktuelle Frequenz - Parameter aus mb2hal.ini kommend von Sourcetronic einlesen...
setp mult2.fu.freq.return.in1 6 #(Freq * 6) = Drehzahl /-> Freq wird *10 ausgegeben => Bsp.: 40.0Hz => 400 * 6 = 2400U/min
net fu-actual-drz-range-check mult2.fu.freq.return.out => limit1.fu.return.drz.check.in #-> an Min / Max Prüfung weitergeben...
#Prüfen ob Drehzahl gültig (im Range):
setp limit1.fu.return.drz.check.min 0 #Minimale Drehzahl -> 2400 U/min (40 Hz)
setp limit1.fu.return.drz.check.max 24000 #Maximale Drehzahl -> 24000 U/min
net fu-actual-drz limit1.fu.return.drz.check.out => near.soll.drz.in2 #-> an Bereichsprüfung weitergeben... /Aktuelle Drehzahl an Custom.postgui.hal weitergeben und in LinuxCNC anzeigen...
#Anzeige in LinuxCNC wenn Spindel Solldrehzahl erreicht hat
net input-drehzahl => near.soll.drz.in1 #<- Solldrehzahl aus LinuxCNC (wird oben bei der Frequenzberechnung eingelesen...)
setp near.soll.drz.scale 1.01 #Toleranzbereich für Vergleich der Soll- und Ist-Drehzahl
net spindle-at-speed-fu near.soll.drz.out => spindle.0.at-speed #Wenn innerhalb Toleranz -> Spindel ist auf Solldrehzahl an Custom.postgui.hal weitergeben und in LinuxCNC anzeigen...
#=======================================================================#