ModbusUtil.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package com.mes.ui;
  2. import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
  3. import com.mes.util.JdbcUtils;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import java.nio.charset.Charset;
  7. public class ModbusUtil {
  8. public static final Logger log = LoggerFactory.getLogger(ModbusUtil.class);
  9. public static void getDataA(ModbusTcp plc){
  10. try {
  11. // 检查PLC连接是否已初始化
  12. if (plc == null) {
  13. log.warn("PLC A 还未连接,跳过数据读取");
  14. return;
  15. }
  16. Short cur = plc.readInt16(66);//已打数量
  17. if(MesClient.aMax <= 0){
  18. MesClient.aMax = plc.readInt32(4534); // 任务数量/预设数量
  19. MesClient.param1.setText(String.valueOf(MesClient.aMax));
  20. log.info("从PLC读取预设数量:" + MesClient.aMax);
  21. }
  22. if(MesClient.sortA < cur){
  23. MesClient.sortA = cur;
  24. MesClient.aFinish = plc.readInt16(68);//合格数量
  25. String fout = plc.readInt32(386)+"";
  26. String sout = (float)plc.readInt32(376)/1000+"";
  27. String fmin = plc.readInt32(4116)/10+"";
  28. String smin = (float)plc.readInt32(4126)/1000+""; // 修正:4126是S-min
  29. String fmax = plc.readInt32(4114)/10+"";
  30. String smax = (float)plc.readInt32(4124)/1000+""; // 修正:4124是S-max
  31. MesClient.param2.setText(cur+"");
  32. log.info("A工位数量更新 - 当前数量:" + cur + ", 预设数量:" + MesClient.aMax);
  33. if(!MesClient.product_sn.getText().isEmpty()){
  34. String qty = String.valueOf(plc.readInt16(4));
  35. if ("3".equals(qty)){
  36. qty = "1";
  37. }else {
  38. qty = "0";
  39. }
  40. 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());
  41. }
  42. //预设数量等于已打数量,就关机
  43. if (MesClient.sortA >= MesClient.aMax && MesClient.aMax > 0){
  44. setPowerOff(MesClient.plcA);
  45. }
  46. }
  47. } catch (Exception e){
  48. log.error("PLC A读取失败:" + e.getMessage());
  49. // 使用触发按钮设置的参数值继续执行
  50. upResult();
  51. }
  52. upResult();
  53. }
  54. public static void getDataB(ModbusTcp plc){
  55. // 41065=F-out 41066=S-out
  56. // 41069=F-min 41071=S-min 41070=F-max 41072=S-max
  57. // 预设数量=41129 完成数=41137
  58. Short cur = plc.readInt16(1136);
  59. // System.out.println("F-out:"+plc.readInt16(1064));
  60. // System.out.println("S-out:"+plc.readInt16(1065));
  61. // System.out.println("F-min:"+plc.readInt16(1068));
  62. // System.out.println("S-min:"+plc.readInt16(1070));
  63. // System.out.println("F-max:"+plc.readInt16(1069));
  64. // System.out.println("S-max:"+plc.readInt16(1071));
  65. // System.out.println("set:"+plc.readInt16(1128));
  66. // System.out.println("cur:"+cur);
  67. // System.out.println("cur2:"+MesClient.sortB);
  68. if(MesClient.bMax <= 0){
  69. MesClient.bMax = plc.readInt16(1128);
  70. MesClient.param3.setText(String.valueOf(MesClient.bMax));
  71. }
  72. if(MesClient.sortB == cur - 1){
  73. MesClient.sortB = cur;
  74. String fout = plc.readInt16(1064)+"";
  75. String sout = (float)plc.readInt16(1065)/1000+"";
  76. String fmin = plc.readInt16(1068)+"";
  77. String smin = (float)plc.readInt16(1070)/1000+"";
  78. String fmax = plc.readInt16(1069)+"";
  79. String smax = (float)plc.readInt16(1071)/1000+"";
  80. if(MesClient.sortB == 32){
  81. setTask2S(plc);
  82. }
  83. MesClient.param4.setText(cur+"");
  84. System.out.println("cur:"+cur);
  85. if(!MesClient.product_sn.getText().isEmpty()){
  86. 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());
  87. }
  88. }
  89. upResult();
  90. }
  91. // 上传总结果
  92. public static void upResult(){
  93. if(!MesClient.curSn.isEmpty() && MesClient.aMax > 0 && MesClient.aMax == MesClient.sortA){
  94. MesClient.finish_ok_bt.setEnabled(true);
  95. MesClient.finish_ng_bt.setEnabled(true);
  96. if(MesClient.tjStatus == 0 && MesClient.check_quality_result){
  97. MesClient.tjStatus = 1;
  98. MesClient.getUser();
  99. String retf = "OK";
  100. if(MesClient.aFinish != MesClient.aMax){
  101. retf = "NG";
  102. }
  103. Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.product_sn.getText(),retf, MesClient.user20);
  104. if(!ret){
  105. MesClient.setMenuStatus(MesClient.tjFlagTextErr,-1);
  106. }
  107. }
  108. }
  109. }
  110. // 获取控制模式
  111. public static short getControlModel(ModbusTcp plc){
  112. short control = 0;
  113. try{
  114. control = plc.readInt16(1090);
  115. }catch (Exception e){
  116. e.printStackTrace();
  117. }
  118. return control;
  119. }
  120. // 获取二维码
  121. public static String getSn(ModbusTcp plc){
  122. String sn = "";
  123. try{
  124. sn = plc.readString(1216,40, Charset.forName("UTF8"));
  125. }catch (Exception e){
  126. e.printStackTrace();
  127. }
  128. return splitIntoChunks(sn,2);
  129. }
  130. // 每两个字符分割,并反转
  131. private static String splitIntoChunks(String str, int chunkSize) {
  132. if (str == null || str.isEmpty() || chunkSize <= 0) {
  133. return "";
  134. }
  135. int length = str.length();
  136. int arraySize = (length + chunkSize - 1) / chunkSize;
  137. String[] result = new String[arraySize];
  138. for (int i = 0, j = 0; i < length; i += chunkSize, j++) {
  139. int endIndex = Math.min(i + chunkSize, length);
  140. String sttr = str.substring(i, endIndex);
  141. StringBuilder sb = new StringBuilder(sttr);
  142. String reversedStr = sb.reverse().toString(); // 字符串反转
  143. result[j] = reversedStr;
  144. }
  145. return String.join("",result);
  146. }
  147. // 远程开机
  148. public static Boolean setPowerOn(ModbusTcp plc){
  149. Boolean ret = false;
  150. try{
  151. plc.writeCoil(3128,true);
  152. // plc.writeCoil(3079,false);
  153. // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右
  154. ret = true;
  155. }catch (Exception e){
  156. e.printStackTrace();
  157. ret = false;
  158. }
  159. return ret;
  160. }
  161. // 远程关机
  162. public static Boolean setPowerOff(ModbusTcp plc){
  163. Boolean ret = false;
  164. try{
  165. MesClient.heartBeatFlag = false;
  166. // plc.writeCoil(3128,false);
  167. // plc.writeCoil(3328,false);
  168. // plc.writeCoil(3079,true); // 关机
  169. // 必须选关掉关机,开机才起左右
  170. ret = true;
  171. }catch (Exception e){
  172. e.printStackTrace();
  173. ret = false;
  174. }
  175. return ret;
  176. }
  177. // 重置任务
  178. public static void setTask(ModbusTcp plc,Short setNum){
  179. try{
  180. // // 设置模式 1=标记铆接模式
  181. // plc.writeInt16(1092,(short) 1);
  182. // // 设置任务
  183. // plc.writeInt16(1128,setNum);
  184. // plc.writeInt16(1136,(short) 0);
  185. // plc.writeInt16(1138,(short) 0);
  186. // 设置模式 1=标记铆接模式
  187. MesClient.plcA.writeInt16(8, (short) 1);
  188. // 设置任务
  189. plc.writeInt16(4534,setNum);
  190. plc.writeInt16(66,(short) 0);
  191. plc.writeInt16(68,(short) 0);
  192. plc.writeInt16(70,(short) 0);
  193. }catch (Exception e){
  194. e.printStackTrace();
  195. }
  196. }
  197. public static void setTask2S(ModbusTcp plc){
  198. try{
  199. plc.writeInt16(1070,(short) 3600);
  200. plc.writeInt16(1071,(short) 4600);
  201. }catch (Exception e){
  202. e.printStackTrace();
  203. }
  204. }
  205. // 获取在线离线
  206. public static boolean getOnOff(ModbusTcp plc){
  207. try{
  208. plc.readInt16(1090);
  209. return true;
  210. }catch (Exception e){
  211. e.printStackTrace();
  212. return false;
  213. }
  214. }
  215. // A枪说明 192.168.1.7
  216. // plc.writeCoil(3079,false);
  217. // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右
  218. //// plc.writeCoil(3128,false);
  219. // System.out.println("控制模式:"+plc.readInt16(1090)); // 1091 控制模式
  220. // System.out.println("系统运行中:"+plc.readCoil(3128,1)); // 3129 系统运行中
  221. // System.out.println("结束暂停:"+plc.readCoil(3132,1)); // 3133 系统运行中
  222. // System.out.println("远程开机:"+plc.readCoil(3328,1)); // 3329 远程开机
  223. // System.out.println("远程关机:"+plc.readCoil(3079,1)); // 3080 远程关机
  224. // System.out.println("作业模式:"+plc.readInt16(1092)); // 1093 作业模式
  225. // System.out.println("最大拉力:"+plc.readInt16(1064)); // 1065 最大拉力
  226. // System.out.println("对应位移:"+plc.readInt16(1065)); // 1066 对应位移
  227. // System.out.println("任务数量:"+plc.readInt16(1128)); // 1129 任务数量
  228. // System.out.println("合格数量:"+plc.readInt16(1138)); // 1139 合格数量
  229. // System.out.println("质量状态:"+plc.readInt16(1072)); // 1073 质量状态
  230. // System.out.println("F-out:"+plc.readInt16(1064));
  231. // System.out.println("S-out:"+plc.readInt16(1065));
  232. // System.out.println("F-min:"+plc.readInt16(1068));
  233. // System.out.println("S-min:"+plc.readInt16(1070));
  234. // System.out.println("F-max:"+plc.readInt16(1069));
  235. // System.out.println("S-max:"+plc.readInt16(1071));
  236. }