From 5a7e098caf4dfe1f1f1dd2d90beff455dd66c4d4 Mon Sep 17 00:00:00 2001 From: sige Date: Wed, 17 Apr 2024 15:35:26 +0800 Subject: [PATCH] ~ --- app.db | Bin 299008 -> 331776 bytes .../com/iflytop/digester/DigestionTaskThread.java | 19 ++++++++++- .../deviceinstance/HeatingTurntableInstance.java | 13 ++++++- .../deviceinstance/HeatingTurntableSlot.java | 20 +++++++++-- .../deviceinstance/TransferRobotArmInstance.java | 38 ++++++++++----------- .../digester/model/MdbDigestionTaskLog.java | 31 +++++++++++++++++ .../underframework/UfCmdSnippetExecutor.java | 31 ++++++++++++++--- .../underframework/command/UfCmdDelay.java | 15 ++++++++ .../digester/underframework/command/UfCommand.java | 6 ++++ .../connection/UfModbusRTUOverTCP.java | 6 ++-- .../resourcecontrol/systemcommand/TsCmdDelay.java | 15 -------- .../resourcecontrol/systemcommand/TsCommand.java | 6 ---- src/main/resources/application-dev.yml | 10 +++--- web | 2 +- 14 files changed, 154 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/iflytop/digester/model/MdbDigestionTaskLog.java create mode 100644 src/main/java/com/iflytop/digester/underframework/command/UfCmdDelay.java create mode 100644 src/main/java/com/iflytop/digester/underframework/command/UfCommand.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCmdDelay.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCommand.java diff --git a/app.db b/app.db index 36558e452323f319b7e14d17367d30f162b2d396..0fd5b475987f677ca47f21f57b472f0dd607e624 100644 GIT binary patch delta 17207 zcmeHO349gRxxX`W_cbAe5QPvz5CR#PGy4z|paOw}R4~L15a!N;$QDDW3-T@j1fCR) zUSwnyD=u}xB}$@*b!+>3udUD4S4Cgl35(iRYinQa>+^jxb8m8&ESK88_kO?kNSMr- zIp6=BZ#myN=R4nQJTzqEp`q>P4GEleI2`lgf8rl@{_T}C9yt5N()%JI?`Mwiqv3$> z=Yb!4KkFEs_baczZE4$8E>F|gwzcu*kr#xzZ#i^&^P{Jp-f`x!I~N)ULRfkH%@GkA zQB-A_x~@fTUA|^@*%Y*)a(!8=wyIf!C+k|YvMF?W1$u+=Vh9^rynASjgCXm;C@d-Tfki; zSH+*G84<6W9iD6W2mG7h#a?LYy6|TAD0kCl3@){`TWaH&I<1J#`lN+ejle5aTdP1f$~G*%b&ki~#MJLw7XNZ(^`yzCA2`;1%Y$dOb#yb#Y5t2S@V+R-G# z#*3%$DZ_gBm;vT%GJ+_&mwgWUNC{>Kt8gSHdEo?JlN(P&#xn@fEG;Xfs_7ER3N#`mT0$f(YC0X|VN~g?KI)E_pKQnSCWmVr zO_+hX)(|LkZLq>S-d`QK*?TW`7Ox5~3$AzH>bxQNrT>HACBBzDU;A&1i-&~9F4v31 z=E$4GFM|%(UA{g3p}vy9BJX^{>-rdf4|@S0;+z-ohhFy8djAlb9Xw3@r~Cczht6@n zPXbIN;O=y5p-;Ux`gP2})#MMjoOe2mdtUce=z>nkI!}?BDj2S|-IP(qu}f zBvqqY#uH5#xTJDyRQ$Gw$awcd6){Bw!(jC&8I?E=xaL?=MyyCiIYo|AD5_H&x6Y&k z6htYA2W(S3tgMr=s7fS?@}jN?G^L?vt64EBQ;fz%6_SqvEQ?f~j4HfHimb*_DywOt z%B~$pH2DzCv+?Mv(vC+Tz8!alpK(;guU=6e*N-$hBa0ms9mkKBxtXcOoY`@?ZEt#6vEGcNZ?``0(qp(!9mk2#1IEe}JtfHv4MvAx2&)Hgp7t z>pficyb)kLzVI^djm~*~J#?*qsQXsz1!GDnR)%9Ej76nbc{z4Aco?q=ei<4S2@qGh zJ`NlS7lvyBZ#r*qtpPPY>V6-aX&fxYR>n*=MMOn)Mbt=5WI%9?2C~+5ndCW@qa{%i zd0ks<364@Eij^r6QM>>WMl>nOGDC_IC2CO8ST(xHtO%Yf%4s0iD9eEgHH9Z7HY$;t zjx?R6DU}k`g=WPV4UZ+kv`t;2NLB{OsIKcI(lu2QkS;|f`bx7V%S0K4S2$AUqW~!j z0x2t;PSP}zMPAjpC?#ECR+I&VR9S%Tvl>gXB1@4`RgIF0C@~VtGb$5RFSj}=uwsnm zc#h}3`t7>ugRh~#L?vY;2>Zv;}MC0f*@P+3KnniUx& zt6Y?W7AXoWi_<|iGSDe1BQXs4RaF<7%!;BGg_=n1+*5|FXb2OL&rQ=PvrVIONHg|c z#B>M~uju?ThWYbiI25qR>t?07k=H}ZoiAg0n2-F)gSi(+2-h-issHid{?N%_9rl5D zpF4ox>}kY?25{Fi-d|(4g{I;D(6MmHH_UUN=a0lCo>!fF@i#pag1>Qm;(OLrL;TGB zSom$6agOrN363TXhoA6Y<$o)^9Aump*!4LU4_1nur6a`J2ni* zs*T<4*i_4k1X>4k(K%9pAp{BnDab0A0HuqHAcKr3QC?#5<}xDM=(@Mu0IWf++J2sw_Am zRUuhkmPkni3+7mr(P6#Gvnp@dB_k+GOcO+jWH=4jVZe-Ki2;|Q@lZ`xG%BiEhRGqF zSHMw_BA6C*k^$pjb#T&(Ac4!HXkKG2!xS`?6FHV85d%iX@;pPzvIt%fMOiQ#P2rGa z*=3Z`ffq)YMRF>og3Q6_$HV5C7UrwvEx;O+{^M3TOlq4@}r3qeh`61VcYcGZHDlkN^)Y$U>Aird^Mf#;%dS zBTrhbwN7eWqpZ+cXI`&p&E|4=O6kethfeR^aXfV*FE(Ri{IJ&KSR^5eF-EV$hWYF=Z_d>+UJTv5PE%Y> zMQaPyC?_&V5=c-h4Dl#pNDv=PHLRlOGBB;kip5{;tTipA%U3tAYb{;d+5(HHDWzql zu(~a4(Lje$3rt`YAOjaEsvOu(RMNn9bd97LhLaQ-%pdw^3Tw_lU~R>+$?s)_8bb+k zl#@xA;b0gb0j4S$%vYkoFY$a7{H0)wz6LKemR^llm^>rIi!?`BJXhOgUSjyN4I9i} zwvAY70xvGqbXgZzh9Xt)wP0r=1^!$zIcIq(s(}EaMp(tal?hps4LN*?3E5Pbi@Pw6 zsCab_m<3l^`Yz1HvzYvgIbe=hY_pz=6EY$yKHW4KN@O`vFwk1uI@Ye9f z;lj{cp+&*Bf;)q?fv*FP2b92Y|EvDZ{^|a(@85ji_g&|k;mh~F=RM-R$y?_w@|^TM z;rRzoy=S=lr|ykz)^*0U-*t)0>wM1H>>NwHP3$D5;a}kQ<5ys>W9?W2=6C$qvBlxr z0`0>;_w0_*c{ALxx(i(SwFQlgnAnIltZ7}-lCqgwur8`iqF}N))&9ttAGCLO-rs#& z2W*5-9ewijzPl1zg&og#-?p2g&{$VKD&!a;lOAyZU~ZpnDyVD|QYePXZ5lp{21Xp$ zCk+~7lW6g1Y4KBNDx(GQ&5={un+E=V)96!D1hZ`CWR1#om^i6qefV5&|)S9PlCtn zivpbw6h$1JrF@Qr*`;ri^IS2DCQJD&$*_IXP{nq~vXsxjf}zh=sNpt6mhNHwPR05p zK}9w%*{UZY%F;KCkss7u5R?sM z0852InWcoea{XQ(t|fblu?jpFClTWB$1V8i1OESCoF99Q!#SN_z(={#@h(h6t2HJd24$~qY&j*)0B+kIvxfzuYo^-(Tz>$Fv==TJ010|jUE|8Hh7QpE z(3=rPbBfI%Pqa^oHPt|0G@VEN&gaNHrJQf}r{#=LZ%9AFHXd z8Ik${-~a&ip^8KYxSA<8z1R;u#BeB~fBG0(BiR5#KLD_%;|5SAQ^VWzY(Ml6tA#U( z{v;TqsCv#C_gtFO%v|!q?j>tvWp95FSI^pDJub7atrR%)Bv@>K%@ktm85=FlV`g=Y z=|LL^jH#z>urzlW%R+-AgiIIG2cvX7ve4MHWkePjoYV~r7BhE^2+g4YEz-!QEhDnf zsLW}hkB(7uCc|bnzmZLI(8Gd3V;^D%yM~b?i?6XumVX_tm!0^$JrLw420M-&DWl@Y!83R zj_WXUXWM9L%FRNf5t0&Uy(6m+IC^fa4VR|gEI62Xa#*@isAi@uv(!l}mbRdQXguG) z(72izHb8%~7-C6|>YtvixyYtZnZzziUr{ln9cAfrJ%AW9BIt3{IYKW6Hu)rv!}(); zyQ2>D$Z}h%7KWRe5VN(qsM;CvdW&;8Ta1fK%EvB%EE_VBiy}dEQeeL&w<=fnK7uR^ zvGel<_+6OM{1oB3yuTQ`UUJhGv`SvRPF}g?!YdQK8H=pmTg-fZ8CW6;#jW$n9HahFFM5Byg>luz`2RofL8!hkEb24g^(x~|e0ymxa zwBiRaW9Oy#*r_GURwmoL@X|z^qwF^291eQ3+JvYH#7WZHv_dInn_ZwxeR)rFP3g_$ za$KAt*JKzarMYCJ#gyxQ%=mgOe!jnC`X`A-kG>DVu?L*5;c)p3ZzqO1#~GfD#K=6a z-?PsBzPsM_l1p+v?i|-KI`0dDX>+xe2AY~iRTNef6cl(RPL0yK2+LSFD}uvK)l9=+ zVSgb|v??l`s;jbbd(2sGT(EG#vNC@gJl)ND3KcSXt5-U7;ab^@yD01yv&W zZOd;P0T{&-^QFkhkzNo0FKWCB2mGu?vbvS7z|$nBYdTLevY@h}Esw``5abNb%5Z~J ztmI#SJ3j>uQY7FAP}1SB)XWzUILXXbffH_|Kmr#lDv%Umie`fG^bTU&3_b~y{0ngB zrNAMis6YjI3Ni;$f}>A3<%JV@U4}$2$Ucx&Rx+hjZiH_k+%_hi#7h1J%;FSGNLPY` zWXQ&06#>o^|NH(<;xpqKD21KpdB5j6G%1kGVAI1ZSgxtOS9U+0X�yn330JMdbF-_~d%%zT9`QA%{`4&I%$xRA zgnT0;3zURLp3%1vB8&E?;Sj9yxUC-Pfu>VtS7lKk)&zmHuffvrtW|2)Y0zkj}O># zNr)TdO=hu~kx?0- z6aBRsIoWkf_s(t5-?R4|J-hkAEaKkW%i3fR+lpcL@Y((N6Q_?o)Q^NS5;KQpi#a1j zGZePg_BT7tv}11j5;N`Cx24J|ZEG+~$!JJ=5^|c2{P*S_v*(t3457u86lchP<#?et zYuQSY9+H~2Y&lY7rOZM~v!fNd9rX3+2Z!qwy@Uxbx$WiCwtw|A(fT zCZ0NK{!b1~!}khNP&UwTPf3Wsyq|>lURMVL9U?_%jz0niLp|PPK(E=GHoqX#BSR=; zLof8XJLH~J`MmP%LvOuXF1l4oc#dmv#ox-a(Z@u z=&$h18D9g0C-te0bmzX<+^1vyGKascWAwb?{?4yAIp1}~{P+`FE`$}1DoI^);lgS?m7&`@o}utNqh;#SR5PcbhA+J!8rD9r*k&k zeP!K!3U9Fop>p#s>?WtH9g3grg354LVHDqqUFURt2zTgVsM2*Oz*{K4HH-e;W^pUL z6?X%u`vlzGV%~Xfg1cYs#tu2XbKq{Hf&G)y`wAd8+y!{PsqpNW1^}Pl1^x4V{sHJvcnRE%xE@|SdjPx7 z8GZta$8Ln;wu4YFQVGSU4?;Z{;XgB|yFoZ`ci6b%ZUBY53gh9su`6`s9p{L=895TU zIkG6iMEv0o!d>Cp!g{zmJT&x4=%vt}P;;m@R1*9{@Tb9hgEt1}2ggGy-y4BP16u+M z19ZS=ZjQX;{I~iw|Aqbn?>yhfz88IW`PTSm`9^ww@BNAQd)^yh0dm}PiIoDLL$!RW`2PgOQe2ut~X;9MMVyIuF_JoIZMP?p>bk2fPl0r zj9quaW!)~gCb zHqDr7aP!8#ucD}l0Y}h!X@J;{$L$-}#LY@VZ$R{5tU+7X}!#ZlnOe<;KO4L@c;XvVw%Ue7cemK}+U&r$o@q zN092xr38cjPTA>t$)=IXXkgW%L^LoF*w#|Nt|{v0^O`JXC?wKINMnXV@c95rVTS2H zvc2)UiSC$caC&ArBE!Qkg_nC~!5HK{o$qXSj`4KDR=~jW>>6GS^s&V^%j1O_|L!KY zRIM|2YTFue`TWYr-++&ZvG(yz+6ImtWCNE=wtDG4)JqSd-dv)w z-%!2h+60^r{O#3yuALZIz2}NXWsTmd7F)eJd{PUm4a+&BKGcf_QEx711m94-xdg0J kn}DO6Z>U}~*p}g(jlBnm^8SKzkZO<_oICeUXN2zl3+$jhjQ{`u delta 1682 zcmYjQ4RB0X6n^*T{oVI--?FP^B-z9o7RzoTiF8$Dgb;0|*qW-pB1_aH#7tGSBn(9) zmZu)UG%X!7X&OI|K6Ffjj!vtTYN#rSw8mdlOo{2#NbmZY={k99rGEWy{fNF&AESG;i`pdhA~94`9j!c4b}KWLZsaFY$KY%JQBFoFgTGDE>G($M9TX!lb%zaWmR2AW386!D9KvlMnPdvR#sNZhi2=-I;@7d zsJZREx9~DgXTdHmaszwUI{?_m;=TZD1>6KX`vVuy^*vlTt*2`k;3EkEm$~{2pPXA# zQaWZ{Vet)n*_@t0WS_4fdzj07d$-TLv?POJ?(Qgt*DySIX*iBoC-rriM~f2#gO3aw z8@wZ?TXn>t?fp%QZ zlOAXz)t%_E(5$!MUh-|K2#!#wwMy>;iyVYAq=+M%~-t#NAn2&uP1V3T-WNfTv#mh?U@AW=3J zw@_u}dO?ac+Y5Y&>Q1#?OQH&z$lp@xb&ozoxquh(C2Tfd3eDCYFPLiwjpe|pOaTjD zRUvJU)9D+hV;Mmha&qQ@J(MpkDGjAM?MneM-XJVtJgn#RRV1B!q!r=gdItSR1j1yB z_*s&d>`}LAf2#S?RzVTRDUd%T-O+|>U+bFOMf_ZRh{lSiaW%Xk_EGNkL%nsshB4mr36 zJSy?VX|six2AK9^>VM|PAKU=PYrqbP6<-xLox#|_UifIL<7&WnsTnjpyKoE|C;{!a z#2Og3lZ{d&&K=K3x-Rutd%wm$r)dXFR-fiO-Ui$puL^By#=OHf!w$L&pMl0M+y-Mv zmp-w?GL*m$Su8o9tU`ri_t&@|I8i2*S_7=ay>Njr7>333U^x5=HCib#4{tNUuZ*4_Iz#7v7NxVm^=KR)K70<_h6oFR#D&%wKY)91)<>6dL z9r?RxxA`vGF{wc4q;1jiv_!E^eW3nm<<}tZK+;ScAxx@BAsI|M%eUmC@@Bb29w8@) zjnaLbE1eW7rO)^q(jwd{N!rfKS#?fjzP(KCQ^f$FOZHc;{+#*n} zlgF{VGr-w?1I-YfqQ}?*4qbsaLc4VS7+?n$q=B#65RR!3c5u>V*Z~j2d{)v8IDN`- nBXClx@fBXKe{p~i$sB%3G;?Zw)`W7LYTcd)RA=u)d{Fog^(yVc diff --git a/src/main/java/com/iflytop/digester/DigestionTaskThread.java b/src/main/java/com/iflytop/digester/DigestionTaskThread.java index 18b8a43..8cbc01a 100644 --- a/src/main/java/com/iflytop/digester/DigestionTaskThread.java +++ b/src/main/java/com/iflytop/digester/DigestionTaskThread.java @@ -162,8 +162,25 @@ public class DigestionTaskThread extends Thread { device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); // 拍照检查异常试管 this.takeShotAndCheckErrorTubes(); + + // 申请异常处理位 + var errorSlot = device.heatingTurntable.getErrorSlot(); + var emptyTubeIndexes = errorSlot.getEmptyTubeIndexes(this.errorTubeIndexes.size()); + var errorTubeIndexes = this.errorTubeIndexes; + if ( emptyTubeIndexes.size() < this.errorTubeIndexes.size() ) { + errorTubeIndexes = this.errorTubeIndexes.subList(0, emptyTubeIndexes.size()); + } + // 将异常试管放入异常处理区域 - device.transferArm.moveTubesToErrorSlot(this.errorTubeIndexes); + device.transferArm.moveTubesToErrorSlot(errorTubeIndexes, emptyTubeIndexes); + + // 更新试管状态 + for ( var tubeIndex : errorTubeIndexes ) { + var tube = this.heatingSlot.tubes.get(tubeIndex); + errorSlot.tubes.set(emptyTubeIndexes.get(0), tube); + this.heatingSlot.tubes.set(tubeIndex, null); + } + // 将正常试管放入加热转盘 device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java index ceb6ad5..2d1a646 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java @@ -1,12 +1,15 @@ package com.iflytop.digester.deviceinstance; import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.TimerTask; - @Component public class HeatingTurntableInstance { + @Value("${app.errorSlotIndex}") + private Integer errorSlotIndex; + // 槽位列表 private final List slots = new ArrayList<>(); @@ -15,6 +18,9 @@ public class HeatingTurntableInstance { for (int i = 0; i < 5; i++) { HeatingTurntableSlot slot = new HeatingTurntableSlot(); slot.index = i; + if (i == errorSlotIndex) { + slot.isErrorSlot = true; + } slots.add(slot); } } @@ -24,6 +30,11 @@ public class HeatingTurntableInstance { return slots; } + // 获取异常槽位 + public HeatingTurntableSlot getErrorSlot() { + return slots.get(errorSlotIndex); + } + // 根据索引获取槽位 public HeatingTurntableSlot getSlotByIndex(Integer index) { return slots.get(index); diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java index a05638e..2e5f3a8 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java @@ -23,6 +23,8 @@ public class HeatingTurntableSlot { public List tubes = new ArrayList<>(); // 试管架位置 public String tubeRackLocation = null; // heating-turntable:加热转盘 liquid-plate :加液盘 + // 是否异常槽位 + public Boolean isErrorSlot = false; // Constructor public HeatingTurntableSlot() { @@ -43,6 +45,17 @@ public class HeatingTurntableSlot { } } + // 获取空试管索引列表 + public List getEmptyTubeIndexes( Integer limit ) { + List indexes = new ArrayList<>(); + for (int i = 0; i < tubes.size(); i++) { + if ( null == tubes.get(i) && indexes.size() < limit ) { + indexes.add(i); + } + } + return indexes; + } + // 获取非空试管索引列表 public List getExistTubeIndexes() { List indexes = new ArrayList<>(); @@ -60,8 +73,11 @@ public class HeatingTurntableSlot { this.heatingDuration = duration; this.heatingStatus = "on"; - var snippetName = "HeatingTurntableSlotHeating.Start." + this.index; - Map snippetParams = Map.of("temperature", temperature, "duration", duration); + var snippetName = "HeatingTurntableSlotHeating." + this.index; + Map snippetParams = Map.of( + "temperature", temperature, + "duration", duration * 60 * 1000 + ); UfCmdSnippetExecutor.execute(snippetName, snippetParams); // 加热完成 diff --git a/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java index 4c5d01c..130235b 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java @@ -1,7 +1,9 @@ package com.iflytop.digester.deviceinstance; import com.iflytop.digester.underframework.UfCmdSnippetExecutor; +import com.iflytop.digester.underframework.dao.model.UfMdbOption; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,37 +18,33 @@ public class TransferRobotArmInstance { this.lockArm(lock); // 执行从异常槽位取出试管 - UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlotStart"); for (Integer tubeIndex : tubeIndexes) { - UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlot", Map.of( - "MotorLiquidPlatePos", 100, - "MotorArmLeftRightSrcPos", 100, - "MotorArmLeftRightDstPos", 100, - "MotorHeatingTurntablePos", 100 - )); + var snippetKey = "TubeTakeOutFromErrorSlot"; + var snippetParams = new HashMap(); + snippetParams.put("LiquidPlatePos", UfMdbOption.getInteger("LiquidPlateTube." + tubeIndex, 0)); + snippetParams.put("TransLrSrcPos", UfMdbOption.getInteger("HeatPlateErrorSlotTube." + tubeIndex, 0)); + snippetParams.put("HeatingPlatePos", UfMdbOption.getInteger("TransLrMotorLiquidPlateTube." + tubeIndex, 0)); + snippetParams.put("TransLrDestPos", UfMdbOption.getInteger("TransLrMotorHeatingPlateTube." + tubeIndex, 0)); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } - UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlotEnd"); - this.unlockArm(lock); } // 移动试管到异常槽位 - public void moveTubesToErrorSlot(List tubeIndexes) { + public void moveTubesToErrorSlot(List srcIndexes, List destIndexes) { var lock = new Object(); this.lockArm(lock); // 执行移动试管到异常槽位 - UfCmdSnippetExecutor.execute("TubeMoveToErrorSlotStart"); - for (Integer tubeIndex : tubeIndexes) { - UfCmdSnippetExecutor.execute("TubeMoveToErrorSlot", Map.of( - "MotorLiquidPlatePos", 100, - "MotorArmLeftRightSrcPos", 100, - "MotorArmLeftRightDstPos", 100, - "MotorHeatingTurntablePos", 100 - )); + for (Integer tubeIndex : srcIndexes) { + String snippetKey = "TubeMoveToErrorSlot"; + Map snippetParams = new HashMap<>(); + snippetParams.put("LiquidPlatePos", UfMdbOption.getInteger("LiquidPlateTube." + tubeIndex, 0)); + snippetParams.put("TransLrSrcPos", UfMdbOption.getInteger("TransLrMotorLiquidPlateTube." + tubeIndex, 0)); + snippetParams.put("HeatingPlatePos", UfMdbOption.getInteger("HeatPlateErrorSlotTube." + tubeIndex, 0)); + snippetParams.put("TransLrDestPos", UfMdbOption.getInteger("TransLrMotorHeatingPlateTube." + tubeIndex, 0)); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } - UfCmdSnippetExecutor.execute("TubeMoveToErrorSlotEnd"); - this.unlockArm(lock); } diff --git a/src/main/java/com/iflytop/digester/model/MdbDigestionTaskLog.java b/src/main/java/com/iflytop/digester/model/MdbDigestionTaskLog.java new file mode 100644 index 0000000..845c65f --- /dev/null +++ b/src/main/java/com/iflytop/digester/model/MdbDigestionTaskLog.java @@ -0,0 +1,31 @@ +package com.iflytop.digester.model; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; +public class MdbDigestionTaskLog extends UfActiveRecord { + @UfActiveRecordField + public String taskId; + + @UfActiveRecordField + public String action; + + @UfActiveRecordField + public String content; + + @UfActiveRecordField + public Long timestamp; + + // get table name + public static String getTableName() { + return "app_digestion_task_logs"; + } + + // log + public static void log(String taskId, String action, String content) { + var log = new MdbDigestionTaskLog(); + log.taskId = taskId; + log.action = action; + log.content = content; + log.timestamp = System.currentTimeMillis(); + log.save(); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java index 00719d9..a1a0d9c 100644 --- a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java +++ b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java @@ -2,6 +2,8 @@ package com.iflytop.digester.underframework; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.iflytop.digester.underframework.command.UfCommand; +import com.iflytop.digester.underframework.util.UfClassHelper; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; @@ -14,6 +16,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.io.StringWriter; public class UfCmdSnippetExecutor { @@ -79,15 +82,36 @@ public class UfCmdSnippetExecutor { public void executeStep(String cmdId, String cmdParams) { var cmd = UfActiveRecord.findOne(UfMdbActuatorCmd.class, cmdId); if (null == cmd) { + this.executeBuildInCmd(cmdId, cmdParams); + return; + } + + cmd.parameters = this.compileParameterString(cmdParams); + UfActuatorCmdExecutor.execute(cmd); + } + + // execute build-in command + private void executeBuildInCmd( String cmdId, String cmdParams ) { + var buildInCmdClassName = this.getClass().getPackageName() + ".command.UfCmd" + cmdId; + UfCommand buildInCmd = null; + try { + buildInCmd = (UfCommand)UfClassHelper.newInstance(buildInCmdClassName); + } catch ( Exception e ) { throw new RuntimeException("无效的指令ID : " + cmdId); } - // 编译参数为模板 + cmdParams = this.compileParameterString(cmdParams); + List args = List.of(cmdParams.split(",")); + buildInCmd.execute(args); + } + + // 编译参数字符串 + private String compileParameterString( String paramText ) { freemarker.template.Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); cfg.setNumberFormat("0"); Template template = null; try { - template = new Template("", cmdParams, cfg); + template = new Template("", paramText, cfg); } catch (IOException e) { throw new RuntimeException(e); } @@ -97,7 +121,6 @@ public class UfCmdSnippetExecutor { } catch (TemplateException | IOException e) { throw new RuntimeException(e); } - cmd.parameters = paramStrWriter.toString(); - UfActuatorCmdExecutor.execute(cmd); + return paramStrWriter.toString(); } } diff --git a/src/main/java/com/iflytop/digester/underframework/command/UfCmdDelay.java b/src/main/java/com/iflytop/digester/underframework/command/UfCmdDelay.java new file mode 100644 index 0000000..53c7c6c --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/command/UfCmdDelay.java @@ -0,0 +1,15 @@ +package com.iflytop.digester.underframework.command; +import java.util.List; +public class UfCmdDelay implements UfCommand { + @Override + public void execute( List args ) { + // get delay time + int delayTime = Integer.parseInt(args.get(0)); + // sleep + try { + Thread.sleep(delayTime); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/command/UfCommand.java b/src/main/java/com/iflytop/digester/underframework/command/UfCommand.java new file mode 100644 index 0000000..9417462 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/command/UfCommand.java @@ -0,0 +1,6 @@ +package com.iflytop.digester.underframework.command; +import java.util.List; +public interface UfCommand { + // execute + void execute( List args ); +} diff --git a/src/main/java/com/iflytop/digester/underframework/connection/UfModbusRTUOverTCP.java b/src/main/java/com/iflytop/digester/underframework/connection/UfModbusRTUOverTCP.java index bb2402e..310c93e 100644 --- a/src/main/java/com/iflytop/digester/underframework/connection/UfModbusRTUOverTCP.java +++ b/src/main/java/com/iflytop/digester/underframework/connection/UfModbusRTUOverTCP.java @@ -38,14 +38,14 @@ public class UfModbusRTUOverTCP extends UfConnectionBase { synchronized public String execute(UfMdbActuatorCmd command) { if ( "03".equals(command.cmdId) ) { Integer slaveId = Integer.parseInt(command.cmdFlags); - Integer address = Integer.parseInt(command.parameters); + Integer address = Integer.parseInt(command.parameters.trim()); Integer value = this.readHoldingRegister(slaveId, address); return value.toString(); } else if ( "06".equals(command.cmdId) ) { Integer slaveId = Integer.parseInt(command.cmdFlags); String[] params = command.parameters.split(","); - Integer address = Integer.parseInt(params[0]); - Integer value = Integer.parseInt(params[1]); + Integer address = Integer.parseInt(params[0].trim()); + Integer value = Integer.parseInt(params[1].trim()); this.writeHoldingRegister(slaveId, address, value); return ""; } else { diff --git a/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCmdDelay.java b/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCmdDelay.java deleted file mode 100644 index 7424340..0000000 --- a/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCmdDelay.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iflytop.digester.underframework.resourcecontrol.systemcommand; -import java.util.List; -public class TsCmdDelay implements TsCommand { - @Override - public void execute( List args ) { - // get delay time - int delayTime = Integer.parseInt(args.get(0)); - // sleep - try { - Thread.sleep(delayTime); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCommand.java b/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCommand.java deleted file mode 100644 index 9eb36f6..0000000 --- a/src/main/java/com/iflytop/digester/underframework/resourcecontrol/systemcommand/TsCommand.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.iflytop.digester.underframework.resourcecontrol.systemcommand; -import java.util.List; -public interface TsCommand { - // execute - void execute( List args ); -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b2c3a9c..06258ed 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -13,16 +13,16 @@ device: connections: - name : zcancmder key : zcancmder - enable : false + enable : true type : ZcancmderWebsocket -# uri: ws://192.168.8.10:19005 - uri : ws://127.0.0.1:19005 + uri: ws://192.168.8.10:19005 +# uri : ws://127.0.0.1:19005 - name : modbus key : modbus enable : true type : ModbusRTUOverTCP - host: 127.0.0.1 - port: 502 + host: 192.168.8.10 + port: 20000 mqtt-broker: uri: tcp://broker.emqx.io:1883 diff --git a/web b/web index 1513f7b..4641118 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 1513f7b9d26f452c6ded8c1d7fe43c047fab162a +Subproject commit 464111807ce66ce1d0f0652455cc17689d12ab7e