From c413699983ad18d43a1404f5bf48363f6972afee Mon Sep 17 00:00:00 2001 From: fujinliang Date: Wed, 12 Nov 2025 09:22:21 +0800 Subject: [PATCH] =?UTF-8?q?feed=E4=B8=8B=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/settings.py | 5 ++ core/state.py | 16 ++++-- core/system.py | 1 + db/three.db | Bin 53248 -> 0 bytes db/three.db-shm | Bin 32768 -> 0 bytes db/three.db-wal | Bin 140112 -> 0 bytes doc/~$ble表设计.doc | Bin 162 -> 0 bytes feeding/controller.py | 1 + feeding/process.py | 131 ++++++++++++++++++++++-------------------- 9 files changed, 89 insertions(+), 65 deletions(-) delete mode 100644 db/three.db delete mode 100644 db/three.db-shm delete mode 100644 db/three.db-wal delete mode 100644 doc/~$ble表设计.doc diff --git a/config/settings.py b/config/settings.py index 2a3d256..528c404 100644 --- a/config/settings.py +++ b/config/settings.py @@ -56,5 +56,10 @@ class Settings: #是否在线生产 self.is_online_control = True # 是否API在线 + #最后一块进行尾数控制 + # self.block_numbers=['B1','B2','B3','L1','L2','F'] + #需核实上下位漏斗容量 + self.max_upper_volume = 2.4 # 上料斗容量(方) + self.max_lower_volume = 2.4 # 下料斗容量(方) diff --git a/core/state.py b/core/state.py index e8a59bf..6914504 100644 --- a/core/state.py +++ b/core/state.py @@ -21,6 +21,9 @@ class SystemState(QObject): self.last_upper_weight = 0 self.last_lower_weight = 0 self.last_weight_time = 0 + self.need_total_weight=0 + self.initial_upper_weight=0 + self.initial_lower_weight=0 # 错误计数 self.upper_weight_error_count = 0 @@ -40,6 +43,9 @@ class SystemState(QObject): self.current_artifact=None #当前生产状态 self.feed_status=FeedStatus.FNone + #每方重量 + self.density=2500 + # 记录需要监听的属性名(筛选掉不需要发信号的内部变量) #是否破拱 @@ -64,14 +70,16 @@ class FeedStatus(IntEnum): #RFID检测或匹配 FRFID=2, # 开始(管片待生产任务) - FStart = 3 + FApiCheck = 3 # 检查盖板(盖板到位) FCheckGB = 4 + # 上料到下料(上料斗到下料斗) + FUpperToLower=5 #下料1 - FFeed1 = 5 + FFeed1 = 6 # 下料2 - FFeed2 = 6 + FFeed2 = 7 # 下料3 - FFeed3 = 7 + FFeed3 = 8 #完成(管片生产完成) FFinished = 11 \ No newline at end of file diff --git a/core/system.py b/core/system.py index 4148c71..18d452a 100644 --- a/core/system.py +++ b/core/system.py @@ -164,6 +164,7 @@ class FeedingControlSystem: """启动下料流程""" self.lower_feeding_thread = threading.Thread( target=self._start_lower_feeding, + name="Feeding", daemon=True ) self.lower_feeding_thread.start() diff --git a/db/three.db b/db/three.db deleted file mode 100644 index 324d722a61de0c5259062c6faac8017737758d24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI5?{8Dr8ON{fBz7Rdu&jy@ia1Jy9M&Yg_uT6^cBe7hF-g=U_3RXt3@tMDrS&j& zYHW3EZ}7SSHA(K)wDjXMg7_*Z3EaF`lPBAv|ky$H$fYL7!5Luws-_F&v}f z@G#H+K=AT><@TS;*Up9LzV9v`>i^f@E>fO)1)ll`c|kcG6!<}rCxSO1Ndb|sT=}?s z=_B@1uK!)`ZqEG=_vh}b?q9hNx_$0FECGKY00JNY0w4eaAOHd&00JNY0wD1C6XHb=xgXHA;RWm0q6MYqV$c`0daUP7Xz zrFjXF5{DyVYjPH9C-&wg1bdIo5p*?fLtWs%{qgTmXb1uz00JNY0w4eaAOHd&00JNY z0-KqDa{b@Zao5&y*ZoxIYukRdnOQ)05C8!X009sH0T2KI5CDM*p5V z{;cxuZ_4KvmfpI#c;o%WS5Gg#aqa%XA86&h)5h1igS@${dd=&w?dGa$fe1o?`U6xL z5=2ShhpTf$Ny+i~CBHaansS&b?egqkYsA_5a8o6bXM(JwO5d<$;)nXbj*rhy(m`o# zmP{%O(5W=y3(x8c%c-%je3Dj6&GZrdOlr3D+*h5$^pW@>N{9W!{?b&-|3sgVpz5Qo zlov(+N_|4htKwPzuqE-s0l_!qlZO3l1-`LfUd@q&fG{#7_(!B+%9W<=wF+6r+<&iw zLZU?>fl7505?78mkstC?f%Sw{BO$xynPTlxXIU^Ue)2@(A zX>sPnyxgd6`j>KiUQVWuq>~9n_B!o{iutsh8kOe@FZPm|$n!doP$ri=Y6xqbcSP4G zqzH5%mnj}&60>fZ)YMRul?ReqDVh-WKQk8{wZJ2zk^RBvCT9q*)sDssi9+#s4VwCi zxne%aPOW#YR)2p(sa{BDXVQwO%j!k4soJDx=L^e8rf~hKL_sdF+Wnqv?q$ya@h~un zjFRHntK%5U=ZXc^6Vdd%Je9~FWry0i`VC;?xs2NT^>d@S%!&DYZvI3@&dU4KY<$#~ z>)f*U)KhJ$8J$b4W=292+Ysz)HX}BWVMeNRh{KFXZ%BTWX4JrbYLZtPj#+?N%x_~Y z&hDNb+u4^@i!q*`Y`nKtS%Q(Ojd?;QMh)+>O6VXYI;yx|&AE`lK~lN-S^2`7i=SR* zKkU7K=fZBKR;5v`yeG^WzOV6vE=i;x59 z>~zkWVDWo~%mb<%mp@rLeX+do20Q)I)psAh%z_GTo9BHhn)(~S&Uttv1 zOiNIyN?r~s*5oM#pAo3_sL;>vRh3x!-KFxGTN={J_4mu4US!$`l{1&Arim6GYHJgL zsI?c*-m07|u^Rk+Xfva4&QMvkIW#Llw`Sqw_ zRVSR6SIE%P8Po?H z&hB8)cGkCA7%-+Z%7CkS9C%CBz;7~>LIBVM{ED%Td6Yg)T&H;y8`x2MTlbSs+77D2 z`uIzkbU~gwF27Wivq`z;qoZm7*JSo*nI9csHTS;4w>rD~`fR5>n*Z0_tYQwj$5js7 zs@k$-JVYSSUAr+`HfFw>&#&uslp5h&F~AM z8_*|`kM{0-?blP9iLb+#T=@NevrA9pfdB}A00@8p2!H?xfB*=900@A;Lil z|A**HQ~?1H009sH0T2KI5C8!X009sHfkp&2;`M*$IM>qg8rSjKHm>uh?p!0$kq!bN z00JNY0w4eaAOHd&00Qevpyadf_Wb zhdKK@U%AG=h>Y<(^$Fown>#+PDO!qxwGfUSl8o5Z(73+w`98e6Q?@ zF7VVp$O{g0e{`M*-hjmRN9Wg;RJrnT`O-)1we1eqRl}mx+oCD6%d^9x45unHOC~jC zd=gXU>W{v^h1Zl3nKC=#Ar869*6qB)>Khh0qENyG8#ogY{e#fGZiIAY;_UmI}`lL1{Sm)cGU}GXAsAEDK-=gSWIVM6v S9o!~b*8fsK5(0u?a{M*=Ea diff --git a/db/three.db-shm b/db/three.db-shm deleted file mode 100644 index f84e8499f8bc67c59071f2fe930f9503f01f04fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*J5EAT5CG8OqadQ<2gN_yTe}4oV%&-@z{JW0nAou!OFDb4b)F(2bT&YIXOhXw zy}7wFa~5!4Z*&z!v@$CZoy+`gWIoz6a>mCuv^ZtO-&#L>iM?xX6!|e z27%HEY{g;eW;QT^AAutf1WGG#R@%u8PT)NHaS_EoXaoTQ1PBlyK!5-N0t5&UAV7cs P0RjXF5FkL{zYBZ;xyviT diff --git a/db/three.db-wal b/db/three.db-wal deleted file mode 100644 index c18bfcbe0788136f19314c5809586ef2d0d9f7ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140112 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 diff --git a/doc/~$ble表设计.doc b/doc/~$ble表设计.doc deleted file mode 100644 index f0bcfdb03d7782251c4a4f41f00dbba691826117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 ZcmZQ^NzKV&AQiAMxG loc_state.initial_upper_weight + loc_state.initial_lower_weight: + # 等待上料斗重量增加(多久不够报警,可能出现F块不足的情况) + print('重量不够,需要增加') + return + + if loc_state.need_total_weight>loc_state.initial_lower_weight: + if self.state._upper_door_position != 'over_lower': + #是否需要等待上料斗下料,如果下料斗够重量,则不需要等待 + return + else: + # 需要等待上料斗下料 + # 最后一块进行尾数控制 + # 最后一块F块,前面多要0.25,0.3,F块直接下料(先多下0.3后续) + loc_FWeight=0.3*loc_state.density + loc_feed_weight=loc_state.need_total_weight-loc_state.initial_lower_weight-loc_FWeight + self.transfer_material_from_upper_to_lower(loc_state.initial_upper_weight,loc_state.initial_lower_weight,loc_feed_weight) + + self.state.feed_status = FeedStatus.FFeed1 + # time.sleep(10) + return + elif self.state.feed_status == FeedStatus.FFeed1: + #下料 + # self._start_feeding_stage() + print("下料1") + return + elif self.state.feed_status == FeedStatus.FFeed2: + #上料 + # self._start_feeding_stage() + print("下料2") + return + elif self.state.feed_status == FeedStatus.FFeed3: + #下料 + # self._start_feeding_stage() + print("下料3") return elif self.state.feed_status == FeedStatus.FFinished: print("生产已完成") @@ -81,42 +124,19 @@ class FeedingProcess: def _start_feeding_stage(self): """启动指定下料阶段""" """开始分步下料""" - if self.state._lower_feeding_stage != 0: - print("下料已在进行中") - return - print("开始分步下料过程") - # 重置计数器 - #下料斗下料循环次数 - self.state.lower_feeding_cycle = 0 - #上料斗已下料次数 - self.state.upper_feeding_count = 0 - #上料斗最大下料次数 - self.state.upper_feeding_max = 2 - - # 第一次上料 self.transfer_material_from_upper_to_lower() - # 等待模具车对齐并开始第一轮下料 - # self.state._lower_feeding_stage = 4 - # self.wait_for_vehicle_alignment() - - def transfer_material_from_upper_to_lower(self): - """上料斗向下料斗下料""" - print(f"上料斗向下料斗下料 (第 {self.state.upper_feeding_count + 1} 次)") - - # 记录下料前的重量 - initial_upper_weight = self.transmitter_controller.read_data(1) - - # 如果无法读取重量,直接报错 - if initial_upper_weight is None: - raise Exception("无法读取上料斗重量传感器数据,下料操作终止") - # 单次下料重量(kg),self.settings.single_batch_weight - target_upper_weight = initial_upper_weight - self.settings.single_batch_weight - target_upper_weight = max(target_upper_weight, 0) # 确保不低于0 - - print(f"上料斗初始重量: {initial_upper_weight:.2f}kg, 目标重量: {target_upper_weight:.2f}kg") + def transfer_material_from_upper_to_lower(self,initial_upper_weight,initial_lower_weight,feed_weight): + """target_upper_weight:转移后剩下的上料斗重量""" + # 如果低于单次,全部卸掉 + _max_lower_weight=self.settings.max_lower_volume*self.state.density + if (initial_lower_weight+feed_weight>_max_lower_weight): + feed_weight=_max_lower_weight-initial_lower_weight + + target_upper_weight=initial_upper_weight-feed_weight + target_upper_weight = max(target_upper_weight, 0) # 确保下料斗出砼门关闭 self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'close') # 打开上料斗出砼门 @@ -125,11 +145,10 @@ class FeedingProcess: # 等待物料流入下料斗,基于上料斗重量变化控制 import time start_time = time.time() - timeout = 30 # 30秒超时 + # timeout = 30 # 30秒超时 - while time.time() - start_time < timeout: + while self.state.running: current_upper_weight = self.transmitter_controller.read_data(1) - # 如果无法读取重量,继续尝试 if current_upper_weight is None: print("无法读取上料斗重量,继续尝试...") @@ -141,26 +160,16 @@ class FeedingProcess: # 如果达到目标重量,则关闭上料斗出砼门 if current_upper_weight <= target_upper_weight + 50: # 允许50kg的误差范围 print(f"达到目标重量,当前重量: {current_upper_weight:.2f}kg") + print(f"花费时间 {time.time() - start_time:.2f}秒") break elif time.time() - start_time > 25: # 如果25秒后重量变化过小 weight_change = initial_upper_weight - current_upper_weight if weight_change < 100: # 如果重量变化小于100kg - print("重量变化过小,可能存在堵塞,交由监控系统处理...") - break - + #需要增加报警处理 + print("重量变化过小,可能存在堵塞") time.sleep(1) - # 关闭上料斗出砼门 self.relay_controller.control(self.relay_controller.DOOR_LOWER_1, 'close') - - # 验证下料结果 - final_upper_weight = self.transmitter_controller.read_data(1) - if final_upper_weight is not None: - actual_transferred = initial_upper_weight - final_upper_weight - print(f"实际下料重量: {actual_transferred:.2f}kg") - - # 增加上料计数 - self.state.upper_feeding_count += 1 print("上料斗下料完成") def wait_for_vehicle_alignment(self):