From bda47e10e9ed32245a3c8ce24ef61dea55672810 Mon Sep 17 00:00:00 2001 From: fujinliang Date: Tue, 30 Sep 2025 14:44:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B635kg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CU/Feed_save.py | 2 +- CU/Feeding.py | 70 +- CU/__pycache__/Feeding.cpython-39.pyc | Bin 21251 -> 21386 bytes CU/__pycache__/drop.cpython-39.pyc | Bin 9593 -> 8856 bytes CU/drop.py | 68 +- Constant.py | 4 +- EMV/EMV.py | 346 +- EMV/__pycache__/EMV.cpython-39.pyc | Bin 10252 -> 14577 bytes Seting.ini | 13 +- Util/__pycache__/util_log.cpython-39.pyc | Bin 3255 -> 3388 bytes Util/util_log.py | 11 +- __pycache__/Constant.cpython-39.pyc | Bin 4701 -> 4863 bytes __pycache__/MainRecources_rc.cpython-39.pyc | Bin 1635062 -> 1635062 bytes log/log.log | 17964 +----------------- main.py | 360 +- 15 files changed, 1173 insertions(+), 17665 deletions(-) diff --git a/CU/Feed_save.py b/CU/Feed_save.py index f7adaf7..0e50e44 100644 --- a/CU/Feed_save.py +++ b/CU/Feed_save.py @@ -268,7 +268,7 @@ class Feeding(QObject): # --- 新增: 用于码垛模式的投料点索引 --- self.current_drop_index = 0 - self.drop_manager = DropPositionManager() + # self.drop_manager = DropPositionManager() pass def close_feed(self): diff --git a/CU/Feeding.py b/CU/Feeding.py index 3062ed3..c2ca104 100644 --- a/CU/Feeding.py +++ b/CU/Feeding.py @@ -75,7 +75,7 @@ class FeedPosition: self.position = position class FeedLine: - def __init__(self, id, name, feed_positions:list,remain_count:int): + def __init__(self, id, name, feed_positions:list,remain_count:int,drop_manage:DropPositionManager): self.feed_positions = copy.deepcopy(feed_positions) self.feeding2end_pos_index = 0 @@ -83,7 +83,7 @@ class FeedLine: self.start2take_pos_index = 0 self.name = name self.id = id - self.drop_manager = DropPositionManager() + self.drop_manager = drop_manage # 初始化各个阶段的位置列表 self.feeding_to_end = [] @@ -479,34 +479,37 @@ class Feeding(QObject): self.next_position() return #初始点无论如何先打开夹爪 - self.relay_controller.close(clamp=True) - #重新抓去信号料带 - self.take_sensor_signal=False - self.relay_controller.sensor2_ready=True - #去除list.ini读取抓取点20250915 - #self.feedConfig.feedLine.set_take_position(self.detect.detect_position, 0) - #self.feedConfig.feedLine.set_take_position(real_position, 0)#必须设置 - # 一直等待传感器2信号,永不超时 - # TODO:逻辑需改变,不能用while循环 - if Constant.DebugPosition: - self.take_sensor_signal=True - while True: - # sensors = self.relay_controller.get_all_device_status('sensors') - # sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) - if self.take_sensor_signal: - self.log_signal.emit(logging.INFO, "传感器2检测到料包到位开始执行抓取") - break # ✅ 条件满足,跳出循环,继续执行下面的代码 - else: - if self.feedStatus == FeedStatus.FNone: - return - time.sleep(1) # 每秒检查一次 - - #第二次执行FeedStatus.FPhoto时,改变码垛点 - # self.camera_img.save_frame_path() - self.feedConfig.feedLine.set_feeding_to_end() - # self.take_photo_sigal.emit() - self.next_position() - self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) + if self.relay_controller.close(clamp=True): + #重新抓去信号料带 + self.take_sensor_signal=False + self.relay_controller.sensor2_ready=True + #去除list.ini读取抓取点20250915 + #self.feedConfig.feedLine.set_take_position(self.detect.detect_position, 0) + #self.feedConfig.feedLine.set_take_position(real_position, 0)#必须设置 + # 一直等待传感器2信号,永不超时 + # TODO:逻辑需改变,不能用while循环 + if Constant.DebugPosition: + self.take_sensor_signal=True + while True: + # sensors = self.relay_controller.get_all_device_status('sensors') + # sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) + if self.take_sensor_signal: + self.log_signal.emit(logging.INFO, "传感器2检测到料包到位开始执行抓取") + break # ✅ 条件满足,跳出循环,继续执行下面的代码 + else: + if self.feedStatus == FeedStatus.FNone: + return + time.sleep(1) # 每秒检查一次 + + #第二次执行FeedStatus.FPhoto时,改变码垛点 + # self.camera_img.save_frame_path() + self.feedConfig.feedLine.set_feeding_to_end() + # self.take_photo_sigal.emit() + self.next_position() + self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) + else: + self.log_signal.emit(logging.ERROR, Constant.str_clamp_open_error) + time.sleep(2) # self.feedStatus = FeedStatus.FTake elif self.feedStatus == FeedStatus.FTake: @@ -534,8 +537,11 @@ class Feeding(QObject): # 移动到下一个抓取点 # 更新丢包点: 如果需要根据放置情况调整下次抓取 - self.relay_controller.open(clamp=True) - self.next_position(self.is_reverse) + if self.relay_controller.open(clamp=True): + self.next_position(self.is_reverse) + else: + self.log_signal.emit(logging.ERROR, Constant.str_clamp_close_error) + time.sleep(2) #self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点,每一次索引递增的点 diff --git a/CU/__pycache__/Feeding.cpython-39.pyc b/CU/__pycache__/Feeding.cpython-39.pyc index 242680e4f6985e897e8ccfcf9e8260b2fbbeb723..b356d025f3f3a918da75bbb69a4f318969b98e22 100644 GIT binary patch delta 4381 zcmbtW3viUx72do5?q(m^WZ6712_XrAYy?6AX-GtY@F;;0k_d_f%9jX->H%_a?R>W?L=qR=A)UoYoA6RkLY3n#nJI=JW&RDfdOV4-zB@1Y0 z+Ud^h_n&+2dEUpl=g_0<&c|3@*z0v$=oe~vV`#&3Pvt%BoOqUox+TcCC1}+(-KN_) zdr0F}t{t`o9o)w4hb_Sz?%+A}b#foVg)UPR-3Ud&5K&&M|g^cj36DPF_NXu_WvmGcU6U!ZGz7R^=i*)%HT zRlJ&%ig*p5L*HUvd!r>#pLVX*b>0~<^nfPsam}hrd$@>=hDO3hcu?L)p2vBoezs7xKtf7LUJ;V@v2;@#tW&E!S0yyN+9d1S^Zhl(PYTIGM;S~-SklL4v& zP!DJW?3Har5wXyOUoT<6Z%pgmmXqUvo6(!WTR_==3YQ6;1+-iV+2$bfE@|gl%t?0VsL$bW@Y!K z&RyeWUMzgTBTN_aFJ+~3l|5zZ2n=ASO)GXY+#S@w0zszZA}QEB(+P>hb#aI8Nb$Yh`-Fe#2t%PN~Yq`NZ3Cgj=5 zX7+%5zj6ne!~q|e-QklE?Eowa-*O1@aUDl_ou* z_a`DTBb_7kVLcqzg&EDNxwlqK%cV6jW~6P2$cUb{$A@)&l%(jcl7qj_9dn$9J(F=p zesNyA)t8g{@w{eMkRx)(Ey=*RC0abim}Sy#yeQp)Cp5cJET0X`(`a749cWbF()x=0 z2T8IhQ4nq2ZJo4HCXPQkH+kcf<)AjMQ4YQ1TC#4+GHHtsO-sY}W=JE9 zaTYBxWw?uR>k&#kJ}GC<5A8B?D6yT1jR+p3&)3Iv1cbakb7Z znT4=KwKibCac=DqDP#a<9u+d@- z4jeNNK-)3PaqHzPXKW@x9PAAj;24uscKK7XW+M*iYx4~EgP-Q79&n_DDtAghyX3)O6D`x28 zlx%5ScKr{ClXk4uca04;nsr|lI~28aemo&U1Jp)@1|mizK4iXWTVZ$vutlC~)V)&> zwf7IlsHB{h)lJnK&SLV102El$O#DDRM71Si3^t_;VYh!cJTe-Jjp{~77a}IqXLL(RzdkOHRQ3Tm)T(%S=?UuJo(`$oYe#t=C(RmuKdyBLV0fSLFSV^ zOJ-ITTKz0f%VU0)%c#aP8!M!*jrn{&mWR32p(PJ$v+gGS&Ef^ZcP_s9ce++YtyTTa z37hy(Ubl2X-G{^y{{(zOaKb948G&WyTk{i4Cgu6-SA>5B@^L@~U=E-bpf>RdP$vQ3 zAxOJ)V{Akh;e>APoO+;tjp;Pt9N<;JZvnppoR^KQjqEwh%j4J^b2?CAc1ZeeuW|NvwNvQw1Kx5U}rQhR)Aaya6qpB6rN7u z1h@&P59tIK>8Cwr%#iVb!kG(9b zmj9CNlJ6}qnt2}6Gdebf*3j+^>PG*8?ijij^;FuCm|wQ62s?bRYBCXFQR?&xH(Poq zTqj||8|FL|*A3n?rW<hccR!Q*G zvB{ny6}}5WIL&rf#H4p!Guxh8wXU0OSJ&jTgHUbf{~kovbyEJVqsXg#PrLT7Z(@5= zYt~n@iFyQedDg1q{l6R{|7)>C*{m;l#?(gyL6>?5Mq~1i8_L<8QtNzjxq4<+L1HyP z)dRH;28IKGH2~G3uLU(k5U`rtK7hW`{w8rwO4r7hwgwQue1f3M(Dx_QyF*v_DknMS77%sGNlZC;gG8T}%e(qB4fyG<0`^n+^R5ohLTIULuA1S38S(Id z9_k;``*(*%brFvlKa&^Ri{#Clu48|YM>j2|KJT@Y}2hLd~(7(4SZKu~}^nh3_-|b$<&Zk;>HZ#Xj Lh&(Ls?G^t9LZ3ue delta 4167 zcmbVPYfzNe8Q!xumt7Xtg$22*$YqJBpiGo_1vR1|poq9CEAoB9uCR+|7sZB#7;G}y zs%wsI#?~rK(|Bo8>#V6Jwc1H$Y$vg;Z7sFiG%?d3ZTh3Xj7jVzeV_BKY@~L2afWB# z^Pczeob$csJ;#Hm+3?FOrNeHw>gZp_@!Q>}-?)%+$-*v+ zM!!i)vSO!St5U4ml++VUaVV4bn>@)%Nqp>7(r9c~O5@{n#YN*3B}2(1zf{GoI+QH( z%T{toKRG_iRr2;5Jxd!RsddzJEv;rCdO=6!pO)RwKFpFrjtzsTAYTL)Q zh{ELa=1nkIFK#DaXC2~{-DTSVMJGTJ(=2JiVz-O;?FR}wNOjf_OAT^gmoMNA2fd+i z2M_a>3HB#b{^;B;Z8a_d%YDNO;X4p0WD2K0+3T|Txudck#{wf$Su#nKe;EMOQg0N4xo0$>R63}7FD+n}vs zH59ug*NiDYD{P~oC!I8Ca%}(Z7P2p7Fr( zs@M(1VKG1Vd6pr5l$*1z0g86OHb57^59lR`8Mg<6J$x6&91sHR0VD&y1b7}GvmJpH z5kr?M^G8C0SY!X*{)Q*r!?7?+I@l$!@b}<8`jTytf zUNvS4^{8qeS<&&N1gxar{2JnEic2C=Qlr0Vj@~M%Vrgc6V^BBZ9@P0WMj6vZOo8V_ zuKQJkF)$`>xJwK)FYdW3 zP)w4PVb@{t(qqL#5q)4RZrDVIMt(98jFL4Y9BG{X;*oWux-S|A4P;X}Xc#FS)kTb< zRpZt($$CAkk!XS0g~FuSLfX4aVw`r$= z*j+@Vgg>!&#F=!MWr%@CQrZ45RLtB-p*j}B!$IfahXP^11di+4pb~$bdfYM z^Kx~2e^-UpzGWXnzlx=X!rZ%qE_?3|U%(gY)~=@w2rN5$i_ll9_7RwxI(vfD4_*`D z%IUTr!s03*B1S9IGvpN(vyVp$ckER89`Qltbdf#xr)*gKX>QHrD`c;rrDYT7m{l*> z6FH)F-d>g>ZqCcf$}prbCrf4yLL*D3Un6rkQm7GItG;f?mo1N9Bi9cwRoN!k3~5}Ot;-EtP=JirV<5kPMKE0A6V zoFj-Ose%4pm3M?yZO7&1braLS1^g25E5I$lyMQrqc|ip`D*n7+e!+L3cp6X)NZfky ztAAN_1M3t=s*7xru@^>P7T2mDXM3U_SI;y&fyMKCfP4aN+5BUS3jlv3a98j%kmc1j zVVy&AO@GIK8*hX$OIe(duv zr$I78G68VS(aWG7S}Z?ilg~1*d_?evKLppd2BsGH%8gADPc50rek{%``FUmsP0<_A z9#R8JU1M!95a#p*7!!w=X41V&x0DIglf~7g9cDWsXi9KMjV@YdW#$72eo8ddJ0|N-Sk#Gx1wsT6Z9q9 zbVzbnYmod=wB<`NjqKb>iJg|muK-zVY1%1~ z#l)eNEh^EmWG%!$KFuzJNk2dqfIKs&Fq8$5s0T^k43-w{Daixk*s3bFG5YqZCN?As z{?Q~t{~w7&YS4*UWiJf%QAgwnF5^^=udZY}qc>JhXG0|*`T1Rtugw2_7ak_SODXIl zGGlQc5qOd$!M>pAtBUe5tN{1{D*<>VyY*Tb(5*se z;(gMb5s`+Uv=)Pao4}JK|7U=FbT}s@kyc}f^#MQ@mrMdrElC+k50V6Ak{Fp@5ZBjs z#vj0o8q?S{(cD;PdkkLj$1x#z43M1)$D8A{e(scHU?|IRe9auBIW~iXET4&CIV+*cuzS6oJsqJ?r`prw z^=f1#j`ym_hM{xE>a_Ff{XyfD-KG7ofpK8Z&h6 iu8f)Jg6Z4K=ZOC1RctJJwYi0{W8xQ6bH(iSoBs)cmki+m diff --git a/CU/__pycache__/drop.cpython-39.pyc b/CU/__pycache__/drop.cpython-39.pyc index 516f3344ef9bd403d70960200c86245acc7a8459..49d8491c978fab3dbf77c50575780a41a2f96116 100644 GIT binary patch delta 2474 zcmaJ?Piz!b7=LeOc6Mg}%+7ANyW7%#q7aLb6alS(h!Ke)rkbEOG%ZWz4bVcj>~tV> zed7{KykVD&Ax4VqCI%09FnS;wPlV{jgYj4s4<5wZO(4VUJ}zr|Am2#W@q& z0XCSp_{HJ+B`A7qj0-lV2`;qrY)lurFz|19F?>xg-o-?0Nf)MwpEt%V;tFd?6Shcz zw!MTG7fH}5kp`WFMhY6v5*Hcaf|FKO9PqM`%83r}5R1q|qPJ5NK)RwRN^qGKU7{QR zIk64__I&vn|G};A*BO&+ngx7XLqY|~1uwEtt60D^!UA1t3p_;NQZE})1B^l1yv!uO z%&usm0sVN>l17XB#|fXdr6CLvYo81A0%;~HhKL_v$5iL(3EB~B`he{ zYP-}?TAHY&COHDSiBm^dBGJ;qxQsV5Ee2k!=}I%m%J>35s!`2HS+!=cAlKmY7H1)T zwM{`skiX1CQd$U8Urq!Yo8f9go!G&2}E=!jw!QjjT+-W$udJ;?Vj)vSyJ|k}1hsdYG1J#Z4mo zG=(h_K}p6IkSO@$YZioCWcOGZf1s6dX*b<^+f0L3$7K>>cVJ4^!cL;Rg>fx(!i?0X zyWlcIE+P8|nm{S61;1l8`20P=YkuiIw^^BO5Z8sJtg@t4>mcE_^B%YEL)>cB z?3QMWhq={|a_#0-hE?;l`5#xC*SFfd!h@PuNv!p&K7`J%D(mykeaglES018T?2&du z_xDK~X_W3s!+uB_dUdnZu|8d=pTu%UUv+Lal7!suyvo0i-YZ<^zeGwGyH=z2R*gCNsWJfTIct^w{w zH@hUCiJtH7t>?A>tZ7N|XdC8`HFExL>e>8mASfrPb8Z z>U7?WOAPAVQH5KCVMPxNJHFN;CoTj ziN`T^STku&XC!Wwxo;JQkg?F$fV<7CNYIkgoL|8L`+o*G#qSWw78khU7C4>4zLKsB z+zD+_EXu$`gpF0xj#|E3xT>sj2E4p5P9rRTZ}nQ`oT4*o;ZEHR0=GmA_FwDSVNmLhZtAigMifO!H(!~&+xW!nl%nE z;ui@m5jaF(gur?NZxPr+V3NR*=)0cv^^$KBAqaQ`lzfV?J_5%G3u)tsLEFbfN^33GfvhZh5-I21r%IO);pA0=lBd{B*Q|{fK zoFU>Qfl73>H^^XI+1x9jX&+Kr)Yn(wRIWWOPuKaQJtZkxQY-)l=+o1=vX$ZvDQV*#_#3u~jk$T9hj^yZ|ak?Ky zetZAM%HpNlOXpTT`SjP1&hJGXUz?q(1am82FYa4eywUFA5G0rR&|s{c(=L#AYRUX5 zkb{QGVJu1ASZ!B3q1h;Fbo9>2BStHUwU9KM=)rg_YXwN z{g3jq(Lep&oj%n4a|GTcKz98+xrlZS*qiepEpDYOv(V#?xW!yLKk7VfnSLAx%T^h~ zGF2&;RaS%9=;mYN`B6HF&rDV(k9odNHSzsu>xPYe-9S@_(Bc>eidA>&tj=DrG?N?r EU+Ljf=l}o! delta 3306 zcmcImU2I%O6`q;9d-vY`x%i+FmW1Er{yO=(mvEhv`{NbBCMKNTRU^(dhM*U zv)7Sq=Jr;xRrP^@quYm8iQ8QvkZ4Ol@B|eSuRx#r0@??VP(@#O2rq~tRQS%_wc~`8 z^1`n6)66$#&YUxIe)g3oK6uKR&t#GepUSJhf9~j`*PS7L_4UlT4$!4=MHJfv@?YvBNIA>CvWfSS^Z#)~k3=FG;)1gB=cbI5)Y>${d(%q$LL~ z52=DIg3G(ZIaz{8SynJD$f_K`kwrNO^A2>2;b@`wv$y%%x!_@gF%8qI%oiThVw3xZ z6xyh9O(;B=eghIW*pBdHn$_cNQ^z`7ouP3(p=0DuZ(YW(8Q5brV$wXz7MUN9MT5GJ(Bv<7Bjw(t#>KGfbMk^}N-TGwjZ|$4#@z!s z%dMOjzT;=LQLp02EFB5iE}kH_?+L!tH@>*fc%j%m$L4i@o7fyQwJI_uR!*wXUX#vmRevRFh}Y|uKg7_r-$j>ZWZBT9+4G)fWl+MU4IMW&u6qVd7MCAax7X%c?oxiqcqv zS?XAGyYWIaccLtuy<-GQ2X1Ev8fsbOzx4%FuEseX(B^C;{1Os=&*Df7Gl&6wZ17`^ z@kn(q!EedPV5mju?5o9%K^{l6OLWb2-OX*UOyyPPqh~U{JLKEZ6I8TK>*F&_8Zj1Q zo4E8w;W)f#-JWDT`aT1sx1K13Zw;Mz2(iGXRTZcP2<8YV-qaYuJi&2-X9*U2iyN$I=u0m|9rSN;h zUrSN6sye|+_`$F@_Ad-uUj;BD$t@n^1>x{Cz6D;wEXI>zcyN8v6Lo_+BZVovXKgeS z^4^O_E4?+k8xgIV;mJc^K9x{+Tdi6+rt2v8(&`m5{DQZ%+ED8t)dpa~P(>P(HA;s+ zJ~YN34&OcWSz~&l6n=Vi#3s)p9pP6-Kgq9z%cBQ!tHk*P0YND|UM+?{8npv*-{MZ% zGAl#5>0GstDV=j3Q3=o&&`tL~DU59VqHMj2JSGQxbjUWRj<_x6RuB-ewvcdG{d8js zD+c?VP4rhw zCa7jgWGO}H3{-P=mTGKzH@q4GUDAonLo_0RUfK8!X0{BFq`r-EVB_%AvZ12})7cuqa5ZJ9w5Ben5w!tzp>qo-n={NFtMPX}@Qi@PocyB_t)ySyY0ZJT^cMqMuQ zu-C44tdH>%-A*|h??hhS<0SO{s_$m-|MXL+m0dsg-0X3CZU*$?=+G;&@bP{&o!$3r zI`p2hh>}s7R+ETJ^$5X}1Wy4L|M|nezWemT>Bpk7u$BdN`}OeKBU7jcr&pI6UTeb~ z(IZQNJhiW$oTu$I0xCgKwOPyewqA?2KD{KP-5b`?krnrfyK+h`V7;&Z6BdBsfa&MS{l& zK1J{-pc|{h_O6LShDxQV$ExQ56RB?E(tKln5hQhZ^$miks!Y-7?z>SBf$PRE&nvGL zs3%CEvOptional[LineModel]: """根据lineid加载所有码垛的路径信息""" #默认码垛的lineid从10开始 - _lineid=lineid+10 + if self.config_path==Constant.dropLine_set_file_35: + _lineid=lineid+11 + else: + _lineid=lineid+10 line_model = LineModel(_lineid) line_model.line_category = 2 line_model.id = _lineid @@ -255,10 +258,13 @@ class DropPositionManager: def save_path_points(self, line_model: LineModel): """根据lineid保存所有码垛的路径信息""" #默认码垛的lineid从10开始,保存的时候减一 - _lineid=line_model.id-10 + if self.config_path==Constant.dropLine_set_file_35: + _lineid=line_model.id-11 + else: + _lineid=line_model.id-10 if _lineid<=0: return - self.config.read(Constant.dropLine_set_file, encoding='utf-8') + self.config.read(self.config_path, encoding='utf-8') # 查找主表 DropLineX main_section = f"{Constant.dropLine_set_section}{_lineid}" if not self.config.has_section(main_section): @@ -267,7 +273,7 @@ class DropPositionManager: self.config.set(main_section, "id", str(_lineid)) _current_reset_index=1 _current_mid_index=1 - _current_drop_section_val=self._current_drop_section[main_section] + _current_drop_section_val=self._get_max_drop_section() # 保存每个DropPoints for i, pos in enumerate(line_model.positions): if pos.lineId == _lineid or pos.lineId == line_model.id: @@ -300,49 +306,25 @@ class DropPositionManager: #保存数据 pos.save_position_model(self.config) - with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: + with open(self.config_path, 'w', encoding='utf-8') as f: self.config.write(f) def del_drop_point(self,section): - self.config.read(Constant.dropLine_set_file, encoding = 'utf-8') + self.config.read(self.config_path, encoding = 'utf-8') self.config.remove_section(section) - with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: + with open(self.config_path, 'w', encoding='utf-8') as f: self.config.write(f) -def _get_point_debug_info(manager, pos, model): - config = manager.config - for sec in config.sections(): - if sec.startswith("DropPoints"): - try: - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - point_id = config.getint(sec, "id") - return f"📌 DropPoints{point_id} | id={point_id}" - except: pass - - elif sec.startswith("DropMidPoint"): - try: - parts = sec.split('-') - if len(parts) != 2: continue - point_id = int(''.join(filter(str.isdigit, parts[0]))) - level = int(parts[1]) - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - return f"📍 DropMidPoint{point_id}-{level} | id={point_id}, level={level}" - except: pass - - elif sec.startswith("ResetPoint"): - try: - parts = sec.split('-') - if len(parts) != 2: continue - point_id = int(''.join(filter(str.isdigit, parts[0]))) - level = int(parts[1]) - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - return f"🔙 ResetPoint{point_id}-{level} | id={point_id}, level={level}" - except: pass - return "❓ 未知点位" - + def _get_max_drop_section(self): + """获取最大的DropPoints序号""" + max_section = 1 + for section in self.config.sections(): + if section.startswith("DropPoints"): + num_part = int(section.replace("DropPoints", "0")) + if num_part > max_section: + max_section = num_part + return max_section + #endregion # 测试 if __name__ == "__main__": # manager = DropPositionManager("drop.ini") diff --git a/Constant.py b/Constant.py index cfbccfa..32fe301 100644 --- a/Constant.py +++ b/Constant.py @@ -22,6 +22,7 @@ dropLine_set_section = 'DropLine' position_set_section = 'Position' feedLine_set_file = f'.{os.sep}Config{os.sep}FeedLine.ini' dropLine_set_file = f'.{os.sep}Config{os.sep}drop.ini' +dropLine_set_file_35 = f'.{os.sep}Config{os.sep}drop-35.ini' MAX_Position_num = 40 MAX_Line_num = 10 set_ini = 'Seting.ini' @@ -104,7 +105,8 @@ str_tcp_connect_no_reply = '无回复' str_tcp_connect_error = 'tcp连接错误' str_tcp_reconnect = '重连中' str_sys_json_error = 'json解析错误' - +str_clamp_open_error = '夹爪打开失败' +str_clamp_close_error = '夹爪关闭失败' str_sys_runing = '运行到这里了!' str_sys_runing1 = '运行到这里2! ' diff --git a/EMV/EMV.py b/EMV/EMV.py index acd5c75..b89a7c8 100644 --- a/EMV/EMV.py +++ b/EMV/EMV.py @@ -36,6 +36,7 @@ class RelayController(QObject): self.sensor_stable_duration = 1.0 # 传感器状态稳定检测时间(秒) self.sensor_max_attempts = 3 # 连续检测次数达到此值判定有效 self.sensor1_debounce_time = 1.0 # 传感器1防抖时间(秒) + self.sensor2_debounce_time = 3.0 # 袋尾检测3秒有效信号 # ===================== 网络与设备映射 ===================== self.host = host @@ -113,6 +114,7 @@ class RelayController(QObject): self.sensor2_ready = False #默认不打开 self.motor_stopped_by_sensor2 = True + self.is_drop_35=False #是否是35码 # ===================== 基础通信方法 ===================== def send_command(self, command_hex, retry_count=2, source='unknown'): @@ -127,7 +129,7 @@ class RelayController(QObject): sock.connect((self.host, self.port)) sock.send(byte_data) response = sock.recv(1024) - hex_response = binascii.hexlify(response).decode('utf-8') + # hex_response = binascii.hexlify(response).decode('utf-8') #if source == 'sensor': #print(f"[传感器响应] {hex_response}") #elif source == 'device': @@ -136,13 +138,14 @@ class RelayController(QObject): #print(f"[通信响应] {hex_response}") return response except Exception as e: - print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") + # print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") + self.log_signal.emit(logging.INFO,f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") time.sleep(5) self.trigger_alarm() return None def trigger_alarm(self): - print("警告:网络继电器连续多次通信失败,请检查设备连接!") + self.log_signal.emit(logging.ERROR,"警告:网络继电器连续多次通信失败,请检查设备连接!") # ===================== 状态读取方法 ===================== def get_all_device_status(self, command_type='devices'): @@ -186,6 +189,7 @@ class RelayController(QObject): if response and len(response) >= 10: hex_response = binascii.hexlify(response).decode('utf-8') + # print(f"[原始响应][{command_type}] {hex_response}") # 假设传感器数据从第 9 字节开始,长度为 2 字节 @@ -247,7 +251,63 @@ class RelayController(QObject): time.sleep(self.sensor2_loop_delay) return False + def is_valid_sensor(self,sensor_name): + """ + 检查传感器状态是否有效 + 参数: + sensor_name: 传感器名称 + 返回: + True: 传感器状态有效 + False: 传感器状态无效 + """ + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + return False + else: + temp_status_code = self.parse_status_code(response) + if temp_status_code in self.required_codes_1: + return True + else: + return False + + def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1): + """ + 检测在指定时间窗口内是否存在持续稳定的有效信号 + 参数: + sensor_name: 传感器名称 + detection_duration: 总检测时间窗口(秒),默认为3秒 + stability_duration: 信号需要持续稳定的时间(秒),默认为2.5秒 + check_interval: 检测间隔(秒),默认为0.1秒 + + 返回: + True: 在时间窗口内检测到持续稳定的有效信号 + False: 未检测到持续稳定的有效信号 + """ + stable_start_time = None # 记录首次检测到有效信号的时间 + start_time = time.time() + if not self.is_valid_sensor(sensor_name): + return False # 传感器状态无效,返回 + else: + stable_start_time = time.time() # 首次检测到有效信号 + time.sleep(check_interval) + + while time.time() - start_time < detection_duration: + temp_is_valid = self.is_valid_sensor(sensor_name) + if temp_is_valid: + if time.time() - stable_start_time >= stability_duration: + return True # 信号持续稳定达到要求时间 + else: + stable_start_time = None # 信号不稳定,重置计时 + time.sleep(check_interval) + return False + def is_valid_sensor2_status_lost(self, sensor_name): + """ + 检查传感器2是否丢失信号 + """ stable_count = 0 _try_nums=5 # 尝试次数 for _ in range(_try_nums): @@ -269,49 +329,104 @@ class RelayController(QObject): return False # ===================== 动作控制方法 ===================== - def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False): - if Constant.DebugPosition: - return + def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False)->bool: + """将if改成elif,一次只能打开一个设备,否则会造成延时sleep时间不一致问题。并返回成功核验""" + loc_ret=False + loc_reponse=None + loc_send_command=None status = self.get_all_device_status() - if conveyor1 and not status.get(self.CONVEYOR1, False): - self.send_command(self.valve_commands[self.CONVEYOR1]['open']) - time.sleep(self.delay_conveyor) - if pusher and not status.get(self.PUSHER, False): - self.send_command(self.valve_commands[self.PUSHER]['open']) - time.sleep(self.delay_pusher) - if conveyor2 and not status.get(self.CONVEYOR2, False): - self.send_command(self.valve_commands[self.CONVEYOR2]['open']) - time.sleep(self.delay_conveyor) - if clamp and not status.get(self.CLAMP, False): - self.send_command(self.valve_commands[self.CLAMP]['open']) - time.sleep(self.delay_clamp) - if pusher1 and not status.get(self.PUSHER1, False): - self.send_command(self.valve_commands[self.PUSHER1]['open']) - time.sleep(self.delay_pusher) - if conveyor2_reverse: - self.send_command(self.valve_commands[self.CONVEYOR2_REVERSE]['open']) - time.sleep(self.delay_conveyor) - - def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False): if conveyor1: - self.send_command(self.valve_commands[self.CONVEYOR1]['close']) + if not status.get(self.CONVEYOR1, False): + loc_send_command=self.valve_commands[self.CONVEYOR1]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_conveyor) + else: + loc_ret=True + elif pusher: + if not status.get(self.PUSHER, False): + loc_send_command=self.valve_commands[self.PUSHER]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_pusher) + else: + loc_ret=True + elif conveyor2: + if not status.get(self.CONVEYOR2, False): + loc_send_command=self.valve_commands[self.CONVEYOR2]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_conveyor) + else: + loc_ret=True + elif clamp: + if not status.get(self.CLAMP, False): + loc_send_command=self.valve_commands[self.CLAMP]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_clamp) + else: + loc_ret=True + elif pusher1: + if not status.get(self.PUSHER1, False): + loc_send_command=self.valve_commands[self.PUSHER1]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_pusher) + else: + loc_ret=True + elif conveyor2_reverse: + if not status.get(self.CONVEYOR2_REVERSE, False): + loc_send_command=self.valve_commands[self.CONVEYOR2_REVERSE]['open'] + loc_reponse=self.send_command(loc_send_command) + time.sleep(self.delay_conveyor) + else: + loc_ret=True + + + if loc_reponse and len(loc_reponse) >= 10: + lol_hex_response = binascii.hexlify(response).decode('utf-8') + if lol_hex_response == loc_send_command: + loc_ret=True + + if Constant.DebugPosition: + loc_ret=True + return loc_ret + + + def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False)->bool: + loc_ret=False + loc_reponse=None + loc_send_command=None + if conveyor1: + loc_send_command=self.valve_commands[self.CONVEYOR1]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_conveyor) if pusher: - self.send_command(self.valve_commands[self.PUSHER]['close']) + loc_send_command=self.valve_commands[self.PUSHER]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_pusher) if conveyor2: - self.send_command(self.valve_commands[self.CONVEYOR2]['close']) + loc_send_command=self.valve_commands[self.CONVEYOR2]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_conveyor) if clamp: - self.send_command(self.valve_commands[self.CLAMP]['close']) + loc_send_command=self.valve_commands[self.CLAMP]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_clamp) if pusher1: - self.send_command(self.valve_commands[self.PUSHER1]['close']) + loc_send_command=self.valve_commands[self.PUSHER1]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_pusher) if conveyor2_reverse: - self.send_command(self.valve_commands[self.CONVEYOR2_REVERSE]['close']) + loc_send_command=self.valve_commands[self.CONVEYOR2_REVERSE]['close'] + loc_reponse=self.send_command(loc_send_command) time.sleep(self.delay_conveyor) + if loc_reponse and len(loc_reponse) >= 10: + lol_hex_response = binascii.hexlify(response).decode('utf-8') + if lol_hex_response == loc_send_command: + loc_ret=True + if Constant.DebugPosition: + loc_ret=True + return loc_ret + + # ===================== 传感器处理线程 ===================== def handle_sensor1(self): while self._running: @@ -356,6 +471,7 @@ class RelayController(QObject): time.sleep(self.sensor1_loop_delay) except Exception as e: print(f"SENSOR1 处理错误: {e}") + self.log_signal.emit(logging.ERROR,f"SENSOR1 处理错误: {e}") self.sensor1_triggered = False time.sleep(self.sensor1_error_delay) @@ -363,6 +479,14 @@ class RelayController(QObject): _is_pause_close=True #是否料袋尾部(有信号--》无信号) _is_signal=False + + #正发转用 + _is_reverse_2=False + #是否反转后正转信号消息 + _is_signal_2=False + #是否首次正转信号 + _is_first_signal_2=False + while self._running: if self._ispause: #暂停 @@ -376,23 +500,141 @@ class RelayController(QObject): continue #开启线程 _is_pause_close=True + if self.is_drop_35: + #region 35kg 正反转打平 + try: + if _is_signal_2 or self.is_valid_sensor_status_1(self.SENSOR2): + #反转要加个防抖动时间 + if _is_reverse_2: + print('回退后检查到sensor2 35KG信号,正转') + self.open(conveyor2=True) + _is_reverse_2=False + _is_signal_2=True + elif _is_signal_2 and self.is_valid_sensor2_status_lost(self.SENSOR2): + print('检查到sensor2正转35KG信号消失') + self.close(conveyor2=True) + #滚筒关闭标志 + self.motor_stopped_by_sensor2 = True + # 发送信号通知机器人取走物品 + self.take_robot_signal.emit() + _is_signal_2=False + #停止后即使有信号了,也不能转,直到self.sensor2_ready=True + # _is_first_signal=False + self.sensor2_ready=False #打开滚洞标识 + elif not _is_first_signal_2: + print('检查到正转sensor2 35KG信号') + #检测到信号,5秒 + time.sleep(6) + self.open(conveyor2_reverse=True) + _is_reverse_2=True + _is_first_signal_2=True + time.sleep(0.1) + continue + elif self.sensor2_ready: + #sensor2_ready:通过Feeding:FPhoto处控制是否启动 + if self.motor_stopped_by_sensor2: + print('开滚筒') + self.open(conveyor2=True) + self.motor_stopped_by_sensor2 = False + _is_first_signal=False + # _is_reverse=False + # _is_first_signal=False + # _is_signal=False + if _is_reverse_2: + time.sleep(0.1) + else: + time.sleep(2) + except Exception as e: + print(f"SENSOR3 处理错误: {e}") + self.log_signal.emit(logging.ERROR,f"SENSOR3 处理错误: {e}") + time.sleep(self.sensor2_error_delay) + #endregion + else: + try: + + if self.sensor2_ready: + #sensor2_ready:通过Feeding:FPhoto处控制是否启动,到了,先启动 + if self.motor_stopped_by_sensor2: + print('开滚筒') + self.open(conveyor2=True) + self.motor_stopped_by_sensor2 = False + elif _is_signal or self.is_valid_sensor_signal_stable(self.SENSOR2,detection_duration=3,stability_duration=2.5,check_interval=0.5): + #检测到信号,如果之前是没有信号,关闭滚筒 + print('检查到sensor2信号') + if _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2): + print('检查到sensor2信号消失') + self.close(conveyor2=True) + #滚筒关闭标志 + self.motor_stopped_by_sensor2 = True + # 发送信号通知机器人取走物品 + self.take_robot_signal.emit() + _is_signal=False + self.sensor2_ready=False #打开滚洞标识 + else: + _is_signal=True + # time.sleep(0.1) + continue + + time.sleep(2) + except Exception as e: + print(f"SENSOR2 处理错误: {e}") + self.log_signal.emit(logging.ERROR,f"SENSOR2 处理错误: {e}") + time.sleep(self.sensor2_error_delay) + + def handle_sensor3(self): + """ + 正转--》反转--》正转 + """ + _is_pause_close=True + #是否反转 + _is_reverse=False + #是否反转后正转信号消息 + _is_signal=False + #是否首次正转信号 + _is_first_signal=False + #是否料袋尾部(有信号--》无信号) + while self._running: + if self._ispause: + #暂停 + if _is_pause_close: + self.close(conveyor2=True) + self.motor_stopped_by_sensor2 = True + # self.sensor2_ready = True #初始值 + _is_pause_close=False + + time.sleep(self.sensor2_error_delay) + continue + #开启线程 + _is_pause_close=True + #滚动次数 try: - if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2): - #检测到信号,如果之前是没有信号,关闭滚筒 - print('检查到sensor2信号') - if _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2): - print('检查到sensor2信号消失') + if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2): + #反转要加个防抖动时间 + if _is_reverse: + print('回退后检查到sensor2信号,正转') + self.open(conveyor2=True) + _is_reverse=False + _is_signal=True + elif _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2): + print('检查到sensor2正转信号消失') self.close(conveyor2=True) #滚筒关闭标志 self.motor_stopped_by_sensor2 = True # 发送信号通知机器人取走物品 self.take_robot_signal.emit() _is_signal=False + #停止后即使有信号了,也不能转,直到self.sensor2_ready=True + # _is_first_signal=False self.sensor2_ready=False #打开滚洞标识 - else: - _is_signal=True - # time.sleep(0.1) + elif not _is_first_signal: + print('检查到正转sensor2信号') + #检测到信号,5秒 + time.sleep(6) + self.open(conveyor2_reverse=True) + _is_reverse=True + _is_first_signal=True + time.sleep(0.1) continue elif self.sensor2_ready: #sensor2_ready:通过Feeding:FPhoto处控制是否启动 @@ -400,12 +642,20 @@ class RelayController(QObject): print('开滚筒') self.open(conveyor2=True) self.motor_stopped_by_sensor2 = False - - time.sleep(2) + _is_first_signal=False + # _is_reverse=False + # _is_first_signal=False + # _is_signal=False + + if _is_reverse: + time.sleep(0.1) + else: + time.sleep(2) except Exception as e: - print(f"SENSOR2 处理错误: {e}") + print(f"SENSOR3 处理错误: {e}") + self.log_signal.emit(logging.ERROR,f"SENSOR3 处理错误: {e}") time.sleep(self.sensor2_error_delay) - + def pause_start_sensor(self,is_pause): """ 暂停或开启传感器线程 @@ -413,6 +663,14 @@ class RelayController(QObject): """ self._ispause = is_pause + def set_drop_35(self,is_drop_35): + """ + 设置是否是35码 + is_drop_35:True是,False否 + """ + self.is_drop_35=is_drop_35 + + def stop_sensor(self,sensor1_thread,sensor2_thread): if not self._running: print("线程未在运行") diff --git a/EMV/__pycache__/EMV.cpython-39.pyc b/EMV/__pycache__/EMV.cpython-39.pyc index ff07aaa4626e2e99ab8dffdd8453a587c90b4264..b9bd946768bec6a02786735242713f7fd4cb18f6 100644 GIT binary patch literal 14577 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 E19gWM1ONa4 delta 4271 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 eT8cxUNCL>!pE yhyy10KrA63;WhakcZ{e#i0cX>K&~y~01?)c<9X~E1t-tvkz}-)ypyMiF#rIzpECde diff --git a/Util/util_log.py b/Util/util_log.py index 376c162..3554de0 100644 --- a/Util/util_log.py +++ b/Util/util_log.py @@ -51,9 +51,18 @@ class Logger(QObject): handler = TimedRotatingFileHandler(file_path, when='D', interval=1, backupCount=30,encoding='utf-8') handler.suffix = "%Y-%m-%d" - formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') + formatter = logging.Formatter('%(asctime)s - %(levelname)s- %(message)s', datefmt='%Y-%m-%d %H:%M:%S') handler.setFormatter(formatter) self.logger_file_info.addHandler(handler) + # 添加错误专用日志文件 + error_handler = TimedRotatingFileHandler( + file_path.replace('.log', '_error.log'), + when='D', interval=1, backupCount=30, encoding='utf-8') + error_handler.suffix = "%Y-%m-%d" + error_handler.setLevel(logging.ERROR) # 只处理错误级别 + error_handler.setFormatter(formatter) + self.logger_file_info.addHandler(error_handler) + def _process_logs(self): while True: diff --git a/__pycache__/Constant.cpython-39.pyc b/__pycache__/Constant.cpython-39.pyc index ac54e657b0fda8c73b015f5d7b8adc184d8ff6d3..53f27b9b7e59355803c05726f2b754c8b6e4f4fe 100644 GIT binary patch delta 303 zcmcbs@?VuNk(ZZ?0SFw!Z)LCwP2`hdyf#rgN1Hd5A&YM|Lkb_17M#l(C72=amW6Qhz+lA@ARlA}^m7=sx!QzpM) z%;v1(PASSS&^0#Q?9U|3t}6tz^68SD&pTE<>zw>_Ps7tC8((Z$T8a>U+PeAW^tBM- z$%&i^jH#OsaWXP$-Vy|vkwuJA zqA8*i5BamJM5(4|Mrlo!V7$x97|fuVIGK$pdvhHVKl|j}obilFo29uJ8HIr+6y+EA zWag#D7pIoQr)B1(Zg%CiWShKN(3MRWXl0S^%)$tQ0K;7= AmjD0& diff --git a/__pycache__/MainRecources_rc.cpython-39.pyc b/__pycache__/MainRecources_rc.cpython-39.pyc index f51d7fd2950d65fe2be94352a0b762987aad2a97..4345ae39d29a1c69163b5c1f66f557153c1226ea 100644 GIT binary patch delta 94 zcmWN{u@Qnm002P|Q26sjP{1ZE%Apd1Yr;OP#`q&L0%F;Cw=`{O;vHi+>^`sGjAU|@ iTnZ`WBxk9lmLPk$NR+EIa+6j%xywU(8D#wOT-HCU&=>Ro delta 94 zcmWN{u@Qnm002P*QTXFQP}KGuDlxb+D1%= 0: - for feed_line_key, feed_line in self.feedLine_dict.items(): - if feed_line_key == self.tableWidget_feedSeting.item(selectRow, 0).text(): - self.feedLine_dict.pop(feed_line_key) - self.tableWidget_feedSeting.removeRow(selectRow) - break - else: - QMessageBox.information(self, "提示", "请选择要删除的行") - - def send_tabelFeedSet_save(self): - count = len(self.feedLine_dict.keys()) - self.configReader.read(Constant.set_ini) - self.configReader.set('Robot_Feed', 'LineCount', str(count)) - writeFeedLine_to_ini(self.feedLine_dict, Constant.feedLine_set_file) - pass - def send_stopFeed_button_click(self): # 清空状态 self.feeding.feedStatus = FeedStatus.FNone @@ -1383,7 +1211,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def send_emergency_alarm_command(self): """停止当前工作,需要启动""" - msg_box_person = QMessageBox() + msg_box_person = QMessageBox(self) msg_box_person.setIcon(QMessageBox.Icon.Question) msg_box_person.setText("您确定要停止当前工作吗?") msg_box_person.setWindowTitle("提示") @@ -1464,9 +1292,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): position_origin.status = 1 return_positions.insert(0,position_origin) if self.feedLine_dict.keys().__contains__(line_head): - self.feeding.feedConfig= FeedingConfig(0, FeedLine(self.feedLine_dict[line_head].id, self.feedLine_dict[line_head].name, - return_positions,self.remain_Count), - self.feeding.robotClient.photo_locs[:],self.remain_Count) + self.feeding.feedConfig= FeedingConfig( + 0, + FeedLine( + self.feedLine_dict[line_head].id, + self.feedLine_dict[line_head].name, + return_positions, + self.remain_Count + ) + ,self.feeding.robotClient.photo_locs[:],self.remain_Count,None) else: log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error) return @@ -1484,78 +1318,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.send_clear_auto_command() self.send_emergency_alarm_command() - def send_tabelFeedSet_itemChanged(self, item): - row = item.row() - column = item.column() - value = item.text() - head = self.tableWidget_feedSeting.item(row, 0).text() - if column == 1: - self.feedLine_dict[head].name = value - elif column == (0 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.X = float(value) - elif column == (1 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.Y = float(value) - elif column == (2 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.Z = float(value) - elif column == (3 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.U = float(value) - elif column == (4 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.V = float(value) - elif column == (5 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.W = float(value) - # elif column == 7: - elif column == (6 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.X = float(value) - elif column == (7 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.Y = float(value) - elif column == (8 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.Z = float(value) - elif column == (9 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.U = float(value) - elif column == (10 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.V = float(value) - elif column == (11 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken1_position.W = float(value) - - elif column == (12 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.X = float(value) - elif column == (13 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.Y = float(value) - elif column == (14 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.Z = float(value) - elif column == (15 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.U = float(value) - elif column == (16 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.V = float(value) - elif column == (17 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].broken2_position.W = float(value) - - elif column == (18 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.X = float(value) - elif column == (19 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.Y = float(value) - elif column == (20 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.Z = float(value) - elif column == (21 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.U = float(value) - elif column == (22 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.V = float(value) - elif column == (23 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].shake_position.W = float(value) - - elif column == (24 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.X = float(value) - elif column == (25 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.Y = float(value) - elif column == (26 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.Z = float(value) - elif column == (27 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.U = float(value) - elif column == (28 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.V = float(value) - elif column == (29 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].drop_bag_position.W = float(value) - def run(self): # 主线程的逻辑就是 feeding.run() 接口和错误状态处理 while self.thread_signal: @@ -1577,7 +1339,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.feeding.feedConfig = command.feed_config # 开启传感器线程检测相关 self.relay_controller.pause_start_sensor(False) - self.feeding.feedStatus = FeedStatus.FStart # ✅ 投料开始,会触发传感器线程启动 + self.feeding.feedStatus = FeedStatus.FStart command.status = Status.Runing self.record_remain_num() @@ -1673,7 +1435,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): # self.send_pause_command(True) # self.feeding.pause = True # self.relay_controller.pause_start_sensor(True) - msg_box_finish = QMessageBox() + msg_box_finish = QMessageBox(self) msg_box_finish.setIcon(QMessageBox.Icon.Warning) msg_box_finish.setText("码垛完成,请移走拖板") msg_box_finish.setWindowTitle("提示") @@ -1751,8 +1513,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.label_status_toolIndex.setText(str(self.robotClient.status_model.toolCoord)) self.label_status_speed.setText(str(self.robotClient.status_model.curSpeed_n)) - - def updateUI_Position(self): self.horizontalSlider_J1.setValue(self.status_address.axis_0) self.horizontalSlider_J2.setValue(self.status_address.axis_1) @@ -1774,19 +1534,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.horizontalSlider_J5.setValue(self.status_address.axis_4) self.horizontalSlider_J6.setValue(self.status_address.axis_5) - def set_position_to_tabel(self, row_i, position_j, real_Position: Real_Position): - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.X))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 1 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.Y))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 2 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.Z))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 3 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.U))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 4 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.V))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 5 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.W))) def updateUI_frame_sign(self,sign:FeedStatus): # print("start") if sign == FeedStatus.FNone: @@ -1853,8 +1600,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): except Exception as e: print(e) - - def set_run_status_button(self, isRuning: bool): self.pushButton_pauseFeed.setText("暂停") ##self.pushButton_startFeed.setEnabled(False) @@ -2119,6 +1864,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): log.log_message(logging.INFO, f'设置拍照点5:{x5},{y5},{z5}') except: self.show_infomessage_box("设置拍照点5失败") + def set_origin_button_click(self): try: x = float(self.lineEdit_origin_x.text()) @@ -2143,8 +1889,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): log.log_message(logging.ERROR, f'设置原点失败') self.show_infomessage_box("设置原点失败") - - def updateUI_Photo_Set(self): self.lineEdit_x1.setText(str(self.robotClient.photo_locs[0][0])) self.lineEdit_y1.setText(str(self.robotClient.photo_locs[0][1]))