Merge branch 'master' of https://sofdev2.diakont.ru/Welding/WeldingSpotPerformance
This commit is contained in:
commit
d0a146246e
@ -2,12 +2,12 @@
|
|||||||
"trace_storage_path": "D:/downloads/a22",
|
"trace_storage_path": "D:/downloads/a22",
|
||||||
"monitor_update_period": 100,
|
"monitor_update_period": 100,
|
||||||
"a_max_1": 5.41,
|
"a_max_1": 5.41,
|
||||||
"v_max_1": 0.108,
|
"v_max_1": 0.278,
|
||||||
"a_max_2": 35.81,
|
"a_max_2": 35.81,
|
||||||
"v_max_2": 0.678,
|
"v_max_2": 0.7,
|
||||||
"mass_1": 257,
|
"mass_1": 270,
|
||||||
"mass_2": 1,
|
"mass_2": 1,
|
||||||
"k_hardness_1": 1759291,
|
"k_hardness_1": 2148570,
|
||||||
"k_hardness_2": 0,
|
"k_hardness_2": 0,
|
||||||
"torque_max_1": 20,
|
"torque_max_1": 20,
|
||||||
"torque_max_2": 0,
|
"torque_max_2": 0,
|
||||||
@ -17,5 +17,6 @@
|
|||||||
"position_start_2": 0.08,
|
"position_start_2": 0.08,
|
||||||
"k_prop": 0.05,
|
"k_prop": 0.05,
|
||||||
"time_capture": 100000,
|
"time_capture": 100000,
|
||||||
"UML_time_scaler": 1000
|
"UML_time_scaler": 1000,
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -8,13 +8,14 @@ class ConstantCalculator(AutoConfigClass):
|
|||||||
|
|
||||||
super().__init__(ConstantCalculator.params_list, operator_config, system_config)
|
super().__init__(ConstantCalculator.params_list, operator_config, system_config)
|
||||||
|
|
||||||
|
for param, value in self.__dict__.items():
|
||||||
|
if value is int and value < 0:
|
||||||
|
raise Exception("""Недопустимое значение параметра {param} < 0""")
|
||||||
|
|
||||||
def calc(self):
|
def calc(self):
|
||||||
constants = {}
|
constants = {}
|
||||||
#self.smin1t = self.smin1 - self.dblock / 2
|
#self.smin1t = self.smin1 - self.dblock / 2
|
||||||
#self.smin2t = self.smin2 - self.dblock / 2
|
#self.smin2t = self.smin2 - self.dblock / 2
|
||||||
#self.awork = self.umax / (self.l * self.m)
|
|
||||||
#self.fl = self.Fd * (1-self.kturn)
|
|
||||||
#self.flon = self.Fd * self.kturn
|
|
||||||
constants["Fprop"] = self.k_prop * self.force_target
|
constants["Fprop"] = self.k_prop * self.force_target
|
||||||
constants["freq"] = sqrt(self.k_hardness_1 / self.mass_1)
|
constants["freq"] = sqrt(self.k_hardness_1 / self.mass_1)
|
||||||
constants["eff_control"] = self.torque_max_1 / self.transmission_ratio_1
|
constants["eff_control"] = self.torque_max_1 / self.transmission_ratio_1
|
||||||
|
|||||||
@ -116,7 +116,8 @@ class OptAlgorithm(AutoConfigClass):
|
|||||||
dF0 = self.a_max_1 * self.Ts["tclose_1_acc"] * self.k_hardness_1
|
dF0 = self.a_max_1 * self.Ts["tclose_1_acc"] * self.k_hardness_1
|
||||||
|
|
||||||
dFmax = min(self.v_max_1 * self.k_hardness_1, sqrt(self.k_hardness_1/(self.mass_1))* self.Ftogrow)
|
dFmax = min(self.v_max_1 * self.k_hardness_1, sqrt(self.k_hardness_1/(self.mass_1))* self.Ftogrow)
|
||||||
self.Fmeet = 1/ self.freq * sqrt(self.freq**2 * self.Ftogrow**2 - dFmax**2)
|
eps = 1e1
|
||||||
|
self.Fmeet = 1/ self.freq * sqrt(self.freq**2 * self.Ftogrow**2 - dFmax**2 + eps)
|
||||||
tspeed = self.Ts["tspeed"]
|
tspeed = self.Ts["tspeed"]
|
||||||
Fspeed = - self.eff_control * cos(self.freq * tspeed) + self.eff_control + 1/self.freq * dF0 * sin(self.freq * tspeed)
|
Fspeed = - self.eff_control * cos(self.freq * tspeed) + self.eff_control + 1/self.freq * dF0 * sin(self.freq * tspeed)
|
||||||
if t < self.Ts["tspeed"]:
|
if t < self.Ts["tspeed"]:
|
||||||
|
|||||||
@ -51,12 +51,10 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
t22 = max(0, (l2 - (self.a_max_2 * t21 * t21)) / self.v_max_2)
|
t22 = max(0, (l2 - (self.a_max_2 * t21 * t21)) / self.v_max_2)
|
||||||
T2 = t22 + 2 * t21 + offset
|
T2 = t22 + 2 * t21 + offset
|
||||||
|
|
||||||
Topen = max(T1, T2)
|
topen_1_acc, topen_1_speed = self.calcFirstOpen(T1, l1+Fs1)
|
||||||
|
|
||||||
topen_1_acc, topen_1_speed = self.calcFirstOpen(Topen, l1+Fs1)
|
|
||||||
offset = self.calcSecondOpenOffset(topen_1_acc, topen_1_speed, Fs1)
|
offset = self.calcSecondOpenOffset(topen_1_acc, topen_1_speed, Fs1)
|
||||||
|
|
||||||
topen_2_acc, topen_2_speed = self.calcSecondOpen(Topen - offset, l2)
|
topen_2_acc, topen_2_speed = self.calcSecondOpen(T2 - offset, l2)
|
||||||
|
|
||||||
self.allTimes["topen_1_acc"] = topen_1_acc
|
self.allTimes["topen_1_acc"] = topen_1_acc
|
||||||
self.allTimes["topen_2_offset"] = offset
|
self.allTimes["topen_2_offset"] = offset
|
||||||
@ -67,10 +65,12 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
self.allTimes["topen_2_acc"] = topen_2_acc
|
self.allTimes["topen_2_acc"] = topen_2_acc
|
||||||
self.allTimes["topen_2_speed"] = topen_2_speed
|
self.allTimes["topen_2_speed"] = topen_2_speed
|
||||||
|
|
||||||
if s1 > l1:
|
if s1 >= l1:
|
||||||
raise ValueError("S1 > L1 - недопустимый сценарий")
|
raise Exception("""S1 >= L1 - недопустимый сценарий,
|
||||||
if s2 > l2:
|
проверьте dist_open_after_1, dist_close_end_1""")
|
||||||
raise ValueError("S2 > L2 - недопустимый сценарий")
|
if s2 >= l2:
|
||||||
|
raise Exception("""S2 >= L2 - недопустимый сценарий,
|
||||||
|
проверьте dist_open_after_2, dist_close_end_2""")
|
||||||
|
|
||||||
s1 += Fs1
|
s1 += Fs1
|
||||||
topen_1_mark = sqrt(2 * s1 / self.a_max_1)
|
topen_1_mark = sqrt(2 * s1 / self.a_max_1)
|
||||||
@ -95,7 +95,6 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
|
|
||||||
self.allTimes["topen_1_mark"] = topen_1_mark
|
self.allTimes["topen_1_mark"] = topen_1_mark
|
||||||
self.allTimes["topen_2_mark"] = topen_2_mark
|
self.allTimes["topen_2_mark"] = topen_2_mark
|
||||||
self.allTimes["topen"] = Topen
|
|
||||||
|
|
||||||
def Tgrow(self) -> None:
|
def Tgrow(self) -> None:
|
||||||
|
|
||||||
@ -103,13 +102,19 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
vF0 = v0 * self.k_hardness_1
|
vF0 = v0 * self.k_hardness_1
|
||||||
|
|
||||||
vFmax = min(self.v_max_1 * self.k_hardness_1, sqrt(self.k_hardness_1/(self.mass_1))* self.Ftogrow)
|
vFmax = min(self.v_max_1 * self.k_hardness_1, sqrt(self.k_hardness_1/(self.mass_1))* self.Ftogrow)
|
||||||
l = sqrt(self.eff_control ** 2 + self.mass_1/self.k_hardness_1 * vF0**2)
|
|
||||||
|
|
||||||
L = sqrt(self.k_hardness_1 / self.mass_1 * self.eff_control ** 2 + vF0*vF0)
|
L = sqrt(self.k_hardness_1 / self.mass_1 * self.eff_control ** 2 + vF0*vF0)
|
||||||
tspeed = sqrt(self.mass_1/self.k_hardness_1) * (arcsin(vFmax / L) - arccos(sqrt(self.k_hardness_1 / self.mass_1) * self.eff_control / L))
|
tspeed = sqrt(self.mass_1/self.k_hardness_1) * (arcsin(vFmax / L) - arccos(sqrt(self.k_hardness_1 / self.mass_1) * self.eff_control / L))
|
||||||
Fspeed = - self.eff_control * cos(self.freq * tspeed) + self.eff_control + 1/self.freq * vF0 * sin(self.freq * tspeed)
|
Fspeed = - self.eff_control * cos(self.freq * tspeed) + self.eff_control + 1/self.freq * vF0 * sin(self.freq * tspeed)
|
||||||
Fmeet = 1/self.freq * sqrt(self.freq**2 * self.Ftogrow**2 - vFmax**2)
|
eps = 1e1
|
||||||
|
if self.freq**2 * self.Ftogrow**2 - vFmax**2 < -eps:
|
||||||
|
raise Exception("""Номинальная траектория набора усилия не может быть достигнута, максимальная скорость превысила скорость траектории
|
||||||
|
, проверьте параметры k_hardness_1, mass_1, k_prop""")
|
||||||
|
Fmeet = 1/self.freq * sqrt(self.freq**2 * self.Ftogrow**2 - vFmax**2 + eps)
|
||||||
Fstart_prop = self.Fstart_prop
|
Fstart_prop = self.Fstart_prop
|
||||||
|
if Fmeet > Fstart_prop:
|
||||||
|
raise Exception("""Номинальная траектория набора усилия была достигнута на фазе подпора
|
||||||
|
, проверьте параметры v_max_1, k_prop""")
|
||||||
tmeet = (Fmeet - Fspeed)/vFmax
|
tmeet = (Fmeet - Fspeed)/vFmax
|
||||||
tend = self.tGrowNominal(Fstart_prop) - self.tGrowNominal(Fmeet)
|
tend = self.tGrowNominal(Fstart_prop) - self.tGrowNominal(Fmeet)
|
||||||
vp = 1/sqrt(self.k_hardness_1 * self.mass_1) * sqrt(self.Ftogrow**2 - self.Fstart_prop**2)
|
vp = 1/sqrt(self.k_hardness_1 * self.mass_1) * sqrt(self.Ftogrow**2 - self.Fstart_prop**2)
|
||||||
@ -133,14 +138,15 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
v0s = []
|
v0s = []
|
||||||
pos0s = []
|
pos0s = []
|
||||||
for i in range(1,3):
|
for i in range(1,3):
|
||||||
tq = tmark
|
if tmark < 0:
|
||||||
assert tq > 0
|
raise Exception("""Отрицательное время этапа раскрытия,
|
||||||
v0 = closeAlgo("V"+str(i), "Open", tq)
|
проверьте dist_open_after_{1,2}, time_command""")
|
||||||
|
v0 = closeAlgo("V"+str(i), "Open", tmark)
|
||||||
v0s.append(v0)
|
v0s.append(v0)
|
||||||
x0 = closeAlgo("X"+str(i), "Open", tq)
|
x0 = closeAlgo("X"+str(i), "Open", tmark)
|
||||||
x1 = contact[i-1] - self.__dict__["dist_close_end_"+str(i)]
|
x1 = contact[i-1] - self.__dict__["dist_close_end_"+str(i)]
|
||||||
x = x1 - x0
|
x = x1 - x0
|
||||||
pos0s.append(closeAlgo("X"+str(i), "Open", tq))
|
pos0s.append(closeAlgo("X"+str(i), "Open", tmark))
|
||||||
Tfull = self.time_robot_movement
|
Tfull = self.time_robot_movement
|
||||||
|
|
||||||
|
|
||||||
@ -156,7 +162,9 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
t3 = (Tfull + v0 / a) / 2
|
t3 = (Tfull + v0 / a) / 2
|
||||||
|
|
||||||
sqrtval = a**2 * (a**2 * (Tfull+2*t3)**2 - 8 * a * Sfull + 2 * a* v0 * (Tfull+2*t3) - 3 *v0**2)
|
sqrtval = a**2 * (a**2 * (Tfull+2*t3)**2 - 8 * a * Sfull + 2 * a* v0 * (Tfull+2*t3) - 3 *v0**2)
|
||||||
assert sqrtval >= 0
|
if sqrtval < 0:
|
||||||
|
raise Exception("""Невозможно с S_{i} добраться но H*_{i} за указанное время,
|
||||||
|
проверьте dist_open_after_{i}, dist_close_end_{i}, time_command, time_robot_movement""")
|
||||||
t1max = ((Tfull+2*t3) + v0/a)/(2) - sqrt(sqrtval) * sqrt(2)/(4*a**2)
|
t1max = ((Tfull+2*t3) + v0/a)/(2) - sqrt(sqrtval) * sqrt(2)/(4*a**2)
|
||||||
t1 = min(t1max, (vmax- abs(v0))/a)
|
t1 = min(t1max, (vmax- abs(v0))/a)
|
||||||
t1 = max(0, min(t1, -v0/a + sqrt(v0**2 / (a**2) + (abs(maxL)-v0*v0/a)/a)))
|
t1 = max(0, min(t1, -v0/a + sqrt(v0**2 / (a**2) + (abs(maxL)-v0*v0/a)/a)))
|
||||||
@ -165,7 +173,7 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
t5max = (Tfull - v0/a)/2 - t1
|
t5max = (Tfull - v0/a)/2 - t1
|
||||||
v1 = v0 + a * t1
|
v1 = v0 + a * t1
|
||||||
S1 = v0*t1 + a*t1*t1/2 + v1*t31 - a*t31*t31/2
|
S1 = v0*t1 + a*t1*t1/2 + v1*t31 - a*t31*t31/2
|
||||||
S2max = abs(Sfull) + abs(S1)
|
S2max = Sfull + S1
|
||||||
t5 = min(t5max, (vmax)/a, sqrt(S2max / a))
|
t5 = min(t5max, (vmax)/a, sqrt(S2max / a))
|
||||||
t3 = abs(v0)/a + t1 + t5
|
t3 = abs(v0)/a + t1 + t5
|
||||||
t32 = t5
|
t32 = t5
|
||||||
@ -181,7 +189,7 @@ class OptTimeCalculator(AutoConfigClass):
|
|||||||
t2 = max(0, min(t2max, (abs(maxL) - abs(Smovement))/v1))
|
t2 = max(0, min(t2max, (abs(maxL) - abs(Smovement))/v1))
|
||||||
t4 = max(0, Sleft/v3 + v1/v3 * t2)
|
t4 = max(0, Sleft/v3 + v1/v3 * t2)
|
||||||
|
|
||||||
tstay = Tfull - t1 - t2 - t3 - t4 - t5
|
tstay = max(0, Tfull - t1 - t2 - t3 - t4 - t5)
|
||||||
|
|
||||||
self.allTimes["tmovement_"+str(i)+"_acc"] = t1
|
self.allTimes["tmovement_"+str(i)+"_acc"] = t1
|
||||||
self.allTimes["tmovement_"+str(i)+"_speed"] = t2
|
self.allTimes["tmovement_"+str(i)+"_speed"] = t2
|
||||||
|
|||||||
@ -7,7 +7,8 @@ class DiagramParser:
|
|||||||
self.signals = [system_config["Closure_signal"],
|
self.signals = [system_config["Closure_signal"],
|
||||||
system_config["Squeeze_signal"],
|
system_config["Squeeze_signal"],
|
||||||
system_config["Welding_signal"],
|
system_config["Welding_signal"],
|
||||||
system_config["Release_signal"]]
|
system_config["Release_signal"],
|
||||||
|
system_config["Oncomming_signal"]]
|
||||||
|
|
||||||
self.boolDict = {}
|
self.boolDict = {}
|
||||||
self.floatDict = {}
|
self.floatDict = {}
|
||||||
@ -33,6 +34,7 @@ class DiagramParser:
|
|||||||
elif key == self.signals[1]: name = "compression"
|
elif key == self.signals[1]: name = "compression"
|
||||||
elif key == self.signals[2]: name = "welding"
|
elif key == self.signals[2]: name = "welding"
|
||||||
elif key == self.signals[3]: name = "opening"
|
elif key == self.signals[3]: name = "opening"
|
||||||
|
elif key == self.signals[4]: name = "oncomming"
|
||||||
|
|
||||||
self.timingsDict[name] = []
|
self.timingsDict[name] = []
|
||||||
len_items = len(items)
|
len_items = len(items)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user