ModbusUtil.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. package com.mes.ui;
  2. import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
  3. import com.mes.util.JdbcUtils;
  4. import java.nio.charset.Charset;
  5. public class ModbusUtil {
  6. public static void getDataA(ModbusTcp plc){
  7. // 说明预设数量有变化不能修改
  8. // 打钉数应按实际监听数算
  9. // 41065=F-out 41066=S-out
  10. // 41069=F-min 41071=S-min 41070=F-max 41072=S-max
  11. // 预设数量=41129 完成数=41137
  12. Short cur = plc.readInt16(1136);
  13. // System.out.println("F-out:"+plc.readInt16(1064));
  14. // System.out.println("S-out:"+plc.readInt16(1065));
  15. // System.out.println("F-min:"+plc.readInt16(1068));
  16. // System.out.println("S-min:"+plc.readInt16(1070));
  17. // System.out.println("F-max:"+plc.readInt16(1069));
  18. // System.out.println("S-max:"+plc.readInt16(1071));
  19. // System.out.println("预设数量:"+plc.readInt16(1128));
  20. //System.out.println("当前数量:"+cur);
  21. if(MesClient.aMax <= 0){
  22. MesClient.aMax = plc.readInt16(1128); // 任务数量
  23. MesClient.param1.setText(String.valueOf(MesClient.aMax));
  24. }
  25. if(MesClient.sortA == cur - 1){
  26. MesClient.sortA = cur;
  27. // MesClient.aFinish = plc.readInt16(1138);
  28. String fout = plc.readInt16(1064)+"";
  29. String sout = (float)plc.readInt16(1065)/1000+"";
  30. String fmin = plc.readInt16(1068)+"";
  31. String smin = (float)plc.readInt16(1070)/1000+"";
  32. String fmax = plc.readInt16(1069)+"";
  33. String smax = (float)plc.readInt16(1071)/1000+"";
  34. MesClient.param2.setText(cur+"");
  35. System.out.println("cur:"+cur);
  36. String qty = "1";
  37. if(Integer.valueOf(fout) < Integer.valueOf(fmin) || Integer.valueOf(fout) > Integer.valueOf(fmax)){
  38. qty = "0";
  39. }
  40. if(Float.valueOf(sout) < Float.valueOf(smin) || Float.valueOf(sout) > Float.valueOf(smax)){
  41. qty = "0";
  42. }
  43. if(qty.equals("0")){
  44. MesClient.zdStatusA = 1;
  45. MesClient.foutA = fout;
  46. MesClient.soutA = sout;
  47. MesClient.fmaxA = fmax;
  48. MesClient.fminA = fmin;
  49. MesClient.sminA = smin;
  50. MesClient.smaxA = smax;
  51. MesClient.curA = cur+"";
  52. MesClient.resetResultA.setEnabled(true);
  53. MesClient.okResultA.setEnabled(true);
  54. MesClient.ngResultA.setEnabled(true);
  55. ModbusUtil.setPowerOff(plc);
  56. if(!MesClient.product_sn.getText().isEmpty()){
  57. JdbcUtils.insertProdData(MesClient.mes_gw, MesClient.mes_line_sn, MesClient.product_sn.getText(),"A",fout,sout,fmin,smin,fmax,smax,qty,cur+"", MesClient.user_menu.getText());
  58. DataUtil.addNgData(MesClient.product_sn.getText(),"A");
  59. }
  60. }
  61. if(qty.equals("1") && !MesClient.product_sn.getText().isEmpty()){
  62. MesClient.aFinish++;
  63. JdbcUtils.insertProdData(MesClient.mes_gw, MesClient.mes_line_sn, MesClient.product_sn.getText(),"A",fout,sout,fmin,smin,fmax,smax,qty,cur+"", MesClient.user_menu.getText());
  64. }
  65. // 拉铆中更换配方
  66. if(MesClient.sortA == 4){
  67. // plc.writeInt16(1070,(short) 2000);
  68. // plc.writeInt16(1071,(short) 5000);
  69. }
  70. // if(!MesClient.product_sn.getText().isEmpty()){
  71. // JdbcUtils.insertProdData(MesClient.mes_gw, MesClient.mes_line_sn, MesClient.product_sn.getText(),"A",fout,sout,fmin,smin,fmax,smax,"1",cur+"", MesClient.user_menu.getText());
  72. // }
  73. }
  74. if (MesClient.zdStatusA == 0){
  75. upResult();
  76. }
  77. }
  78. public static void getDataB(ModbusTcp plc){
  79. // 41065=F-out 41066=S-out
  80. // 41069=F-min 41071=S-min 41070=F-max 41072=S-max
  81. // 预设数量=41129 完成数=41137
  82. Short cur = plc.readInt16(1136);
  83. // System.out.println("F-out:"+plc.readInt16(1064));
  84. // System.out.println("S-out:"+plc.readInt16(1065));
  85. // System.out.println("F-min:"+plc.readInt16(1068));
  86. // System.out.println("S-min:"+plc.readInt16(1070));
  87. // System.out.println("F-max:"+plc.readInt16(1069));
  88. // System.out.println("S-max:"+plc.readInt16(1071));
  89. // System.out.println("set:"+plc.readInt16(1128));
  90. // System.out.println("cur:"+cur);
  91. // System.out.println("cur2:"+MesClient.sortB);
  92. if(MesClient.bMax <= 0){
  93. MesClient.bMax = plc.readInt16(1128);
  94. MesClient.param3.setText(String.valueOf(MesClient.bMax));
  95. }
  96. if(MesClient.sortB == cur - 1){
  97. MesClient.sortB = cur;
  98. String fout = plc.readInt16(1064)+"";
  99. String sout = (float)plc.readInt16(1065)/1000+"";
  100. String fmin = plc.readInt16(1068)+"";
  101. String smin = (float)plc.readInt16(1070)/1000+"";
  102. String fmax = plc.readInt16(1069)+"";
  103. String smax = (float)plc.readInt16(1071)/1000+"";
  104. String qty = "1";
  105. if(Integer.valueOf(fout) < Integer.valueOf(fmin) || Integer.valueOf(fout) > Integer.valueOf(fmax)){
  106. qty = "0";
  107. }
  108. if(Float.valueOf(sout) < Float.valueOf(smin) || Float.valueOf(sout) > Float.valueOf(smax)){
  109. qty = "0";
  110. }
  111. if(qty.equals("0")){
  112. MesClient.zdStatusB = 1;
  113. MesClient.foutB = fout;
  114. MesClient.soutB = sout;
  115. MesClient.fmaxB = fmax;
  116. MesClient.fminB = fmin;
  117. MesClient.sminB = smin;
  118. MesClient.smaxB = smax;
  119. MesClient.curB = cur+"";
  120. MesClient.resetResultB.setEnabled(true);
  121. MesClient.okResultB.setEnabled(true);
  122. MesClient.ngResultB.setEnabled(true);
  123. ModbusUtil.setPowerOff(MesClient.plcB);
  124. if(!MesClient.product_sn.getText().isEmpty()){
  125. JdbcUtils.insertProdData(MesClient.mes_gw, MesClient.mes_line_sn, MesClient.product_sn.getText(),"B",fout,sout,fmin,smin,fmax,smax,qty,cur+"", MesClient.user_menu.getText());
  126. DataUtil.addNgData(MesClient.product_sn.getText(),"B");
  127. }
  128. }
  129. // 拉铆过程中更换配方
  130. if(MesClient.sortB == 18){
  131. // plc.writeInt16(1070,(short) 4000);
  132. // plc.writeInt16(1071,(short) 5500);
  133. }
  134. MesClient.param4.setText(cur+"");
  135. System.out.println("cur:"+cur);
  136. if(qty.equals("1") &&!MesClient.product_sn.getText().isEmpty()){
  137. MesClient.bFinish++;
  138. JdbcUtils.insertProdData(MesClient.mes_gw, MesClient.mes_line_sn, MesClient.product_sn.getText(),"B",fout,sout,fmin,smin,fmax,smax,"1",cur+"", MesClient.user_menu.getText());
  139. }
  140. }
  141. if (MesClient.zdStatusB == 0){
  142. upResult();
  143. }
  144. }
  145. // 上传总结果
  146. public static void upResult(){
  147. if(!MesClient.curSn.isEmpty() && MesClient.aMax > 0 && MesClient.aMax == MesClient.sortA && MesClient.bMax > 0 && MesClient.bMax == MesClient.sortB){
  148. MesClient.finish_ok_bt.setEnabled(true);
  149. MesClient.finish_ng_bt.setEnabled(true);
  150. if(MesClient.tjStatus == 0 && MesClient.check_quality_result){
  151. MesClient.tjStatus = 1;
  152. MesClient.getUser();
  153. String retf = "OK";
  154. if(MesClient.aFinish != MesClient.aMax){
  155. retf = "NG";
  156. }
  157. if (MesClient.bFinish != MesClient.bMax){
  158. retf = "NG";
  159. }
  160. Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.product_sn.getText(),retf, MesClient.user20);
  161. if(!ret){
  162. MesClient.setMenuStatus(MesClient.tjFlagTextErr,-1);
  163. }
  164. }
  165. }
  166. }
  167. // 获取控制模式
  168. public static short getControlModel(ModbusTcp plc){
  169. short control = 0;
  170. try{
  171. control = plc.readInt16(1090);
  172. }catch (Exception e){
  173. e.printStackTrace();
  174. }
  175. return control;
  176. }
  177. // 获取二维码
  178. public static String getSn(ModbusTcp plc){
  179. String sn = "";
  180. try{
  181. sn = plc.readString(1216,40, Charset.forName("UTF8"));
  182. }catch (Exception e){
  183. e.printStackTrace();
  184. }
  185. return splitIntoChunks(sn,2);
  186. }
  187. // 每两个字符分割,并反转
  188. private static String splitIntoChunks(String str, int chunkSize) {
  189. if (str == null || str.isEmpty() || chunkSize <= 0) {
  190. return "";
  191. }
  192. int length = str.length();
  193. int arraySize = (length + chunkSize - 1) / chunkSize;
  194. String[] result = new String[arraySize];
  195. for (int i = 0, j = 0; i < length; i += chunkSize, j++) {
  196. int endIndex = Math.min(i + chunkSize, length);
  197. String sttr = str.substring(i, endIndex);
  198. StringBuilder sb = new StringBuilder(sttr);
  199. String reversedStr = sb.reverse().toString(); // 字符串反转
  200. result[j] = reversedStr;
  201. }
  202. return String.join("",result);
  203. }
  204. // 远程开机
  205. public static Boolean setPowerOn(ModbusTcp plc){
  206. Boolean ret = false;
  207. try{
  208. plc.writeCoil(3128,true);
  209. // plc.writeCoil(3079,false);
  210. // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右
  211. ret = true;
  212. }catch (Exception e){
  213. e.printStackTrace();
  214. ret = false;
  215. }
  216. return ret;
  217. }
  218. // 远程关机
  219. public static Boolean setPowerOff(ModbusTcp plc){
  220. Boolean ret = false;
  221. try{
  222. plc.writeCoil(3128,false);
  223. // plc.writeCoil(3328,false);
  224. // plc.writeCoil(3079,true); // 关机
  225. // 必须选关掉关机,开机才起左右
  226. ret = true;
  227. }catch (Exception e){
  228. e.printStackTrace();
  229. ret = false;
  230. }
  231. return ret;
  232. }
  233. // 重置任务
  234. public static void setTask(ModbusTcp plc,Short setNum){
  235. try{
  236. // 设置模式 1=标记铆接模式
  237. plc.writeInt16(1092,(short) 1);
  238. // 设置任务
  239. plc.writeInt16(1128,setNum);
  240. plc.writeInt16(1136,(short) 0);
  241. plc.writeInt16(1138,(short) 0);
  242. // 设置拉力
  243. if(setNum == MesClient.aSetNum){
  244. // plc.writeInt16(1070,(short) 2500);
  245. // plc.writeInt16(1071,(short) 4500);
  246. }
  247. if (setNum == MesClient.bSetNum){
  248. // plc.writeInt16(1070,(short) 2000);
  249. // plc.writeInt16(1071,(short) 4000);
  250. }
  251. }catch (Exception e){
  252. e.printStackTrace();
  253. }
  254. }
  255. // A枪说明 192.168.1.7
  256. // plc.writeCoil(3079,false);
  257. // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右
  258. //// plc.writeCoil(3128,false);
  259. // System.out.println("控制模式:"+plc.readInt16(1090)); // 1091 控制模式
  260. // System.out.println("系统运行中:"+plc.readCoil(3128,1)); // 3129 系统运行中
  261. // System.out.println("结束暂停:"+plc.readCoil(3132,1)); // 3133 系统运行中
  262. // System.out.println("远程开机:"+plc.readCoil(3328,1)); // 3329 远程开机
  263. // System.out.println("远程关机:"+plc.readCoil(3079,1)); // 3080 远程关机
  264. // System.out.println("作业模式:"+plc.readInt16(1092)); // 1093 作业模式
  265. // System.out.println("最大拉力:"+plc.readInt16(1064)); // 1065 最大拉力
  266. // System.out.println("对应位移:"+plc.readInt16(1065)); // 1066 对应位移
  267. // System.out.println("任务数量:"+plc.readInt16(1128)); // 1129 任务数量
  268. // System.out.println("合格数量:"+plc.readInt16(1138)); // 1139 合格数量
  269. // System.out.println("质量状态:"+plc.readInt16(1072)); // 1073 质量状态
  270. // System.out.println("F-out:"+plc.readInt16(1064));
  271. // System.out.println("S-out:"+plc.readInt16(1065));
  272. // System.out.println("F-min:"+plc.readInt16(1068));
  273. // System.out.println("S-min:"+plc.readInt16(1070));
  274. // System.out.println("F-max:"+plc.readInt16(1069));
  275. // System.out.println("S-max:"+plc.readInt16(1071));
  276. }