package com.mes.ui; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp; import com.mes.util.JdbcUtils; import javax.swing.*; import java.nio.charset.Charset; import java.util.List; public class ModbusUtil { // 刷新界面拉力、行程显示 private static void updateForceStrokeDisplay(ModbusTcp plc, JTextField forceField, JTextField strokeField) { if (forceField == null || strokeField == null) { return; } try { forceField.setText(plc.readInt16(1064) + ""); strokeField.setText((float) plc.readInt16(1065) / 1000 + ""); } catch (Exception e) { e.printStackTrace(); } } public static void getDataA(ModbusTcp plc){ // 说明预设数量有变化不能修改 // 打钉数应按实际监听数算 // 41065=F-out 41066=S-out // 41069=F-min 41071=S-min 41070=F-max 41072=S-max // 预设数量=41129 完成数=41137 Short cur = plc.readInt16(1136); updateForceStrokeDisplay(plc, MesClient.param5, MesClient.param6); // System.out.println("F-out:"+plc.readInt16(1064)); // System.out.println("S-out:"+plc.readInt16(1065)); // System.out.println("F-min:"+plc.readInt16(1068)); // System.out.println("S-min:"+plc.readInt16(1070)); // System.out.println("F-max:"+plc.readInt16(1069)); // System.out.println("S-max:"+plc.readInt16(1071)); // System.out.println("预设数量:"+plc.readInt16(1128)); //System.out.println("当前数量:"+cur); if(MesClient.aMax <= 0){ MesClient.aMax = plc.readInt16(1128); // 任务数量 MesClient.param1.setText(String.valueOf(MesClient.aMax)); } MesClient.param2.setText(cur + ""); if(MesClient.sortA == cur - 1){ MesClient.sortA = cur; MesClient.aFinish = plc.readInt16(1138); String fout = plc.readInt16(1064)+""; String sout = (float)plc.readInt16(1065)/1000+""; String fmin = plc.readInt16(1068)+""; String smin = (float)plc.readInt16(1070)/1000+""; String fmax = plc.readInt16(1069)+""; String smax = (float)plc.readInt16(1071)/1000+""; System.out.println("cur:"+cur); int nextRivet = cur + 1; if (nextRivet <= MesClient.aMax) { applyParamsForRivet(plc, MesClient.rivetParamRangesA, nextRivet); } if(!MesClient.product_sn.getText().isEmpty()){ 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()); } } upResult(); } public static void getDataB(ModbusTcp plc){ // 41065=F-out 41066=S-out // 41069=F-min 41071=S-min 41070=F-max 41072=S-max // 预设数量=41129 完成数=41137 Short cur = plc.readInt16(1136); updateForceStrokeDisplay(plc, MesClient.param7, MesClient.param8); // System.out.println("F-out:"+plc.readInt16(1064)); // System.out.println("S-out:"+plc.readInt16(1065)); // System.out.println("F-min:"+plc.readInt16(1068)); // System.out.println("S-min:"+plc.readInt16(1070)); // System.out.println("F-max:"+plc.readInt16(1069)); // System.out.println("S-max:"+plc.readInt16(1071)); // System.out.println("set:"+plc.readInt16(1128)); // System.out.println("cur:"+cur); // System.out.println("cur2:"+MesClient.sortB); if(MesClient.bMax <= 0){ MesClient.bMax = plc.readInt16(1128); MesClient.param3.setText(String.valueOf(MesClient.bMax)); } MesClient.param4.setText(cur + ""); if(MesClient.sortB == cur - 1){ MesClient.sortB = cur; String fout = plc.readInt16(1064)+""; String sout = (float)plc.readInt16(1065)/1000+""; String fmin = plc.readInt16(1068)+""; String smin = (float)plc.readInt16(1070)/1000+""; String fmax = plc.readInt16(1069)+""; String smax = (float)plc.readInt16(1071)/1000+""; int nextRivet = cur + 1; if (nextRivet <= MesClient.bMax) { applyParamsForRivet(plc, MesClient.rivetParamRangesB, nextRivet); } System.out.println("cur:"+cur); if(!MesClient.product_sn.getText().isEmpty()){ 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()); } } upResult(); } // 上传总结果 public static void upResult(){ if(!MesClient.curSn.isEmpty() && MesClient.aMax > 0 && MesClient.aMax == MesClient.sortA && MesClient.bMax > 0 && MesClient.bMax == MesClient.sortB){ MesClient.finish_ok_bt.setEnabled(true); MesClient.finish_ng_bt.setEnabled(true); if(MesClient.tjStatus == 0 && MesClient.check_quality_result){ MesClient.tjStatus = 1; String retf = "OK"; if(MesClient.aFinish != MesClient.aMax){ retf = "NG"; } MesClient.submitQualityResult(retf); } } } // 获取控制模式 public static short getControlModel(ModbusTcp plc){ short control = 0; try{ control = plc.readInt16(1090); }catch (Exception e){ e.printStackTrace(); } return control; } // 获取二维码 public static String getSn(ModbusTcp plc){ String sn = ""; try{ sn = plc.readString(1216,40, Charset.forName("UTF8")); }catch (Exception e){ e.printStackTrace(); } return splitIntoChunks(sn,2); } // 每两个字符分割,并反转 private static String splitIntoChunks(String str, int chunkSize) { if (str == null || str.isEmpty() || chunkSize <= 0) { return ""; } int length = str.length(); int arraySize = (length + chunkSize - 1) / chunkSize; String[] result = new String[arraySize]; for (int i = 0, j = 0; i < length; i += chunkSize, j++) { int endIndex = Math.min(i + chunkSize, length); String sttr = str.substring(i, endIndex); StringBuilder sb = new StringBuilder(sttr); String reversedStr = sb.reverse().toString(); // 字符串反转 result[j] = reversedStr; } return String.join("",result); } // 远程开机 public static Boolean setPowerOn(ModbusTcp plc){ Boolean ret = false; try{ plc.writeCoil(3128,true); // plc.writeCoil(3079,false); // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右 ret = true; }catch (Exception e){ e.printStackTrace(); ret = false; } return ret; } // 远程关机 public static Boolean setPowerOff(ModbusTcp plc){ if (MesClient.mes_shield_flag) { System.out.println("MES屏蔽已开启,跳过关机指令"); return true; } Boolean ret = false; try{ plc.writeCoil(3128,false); // plc.writeCoil(3328,false); // plc.writeCoil(3079,true); // 关机 // 必须选关掉关机,开机才起左右 ret = true; }catch (Exception e){ e.printStackTrace(); ret = false; } return ret; } // 查找指定颗数对应的参数区间 public static RivetParamRange findRivetParamRange(List ranges, int rivetNo) { if (ranges == null) { return null; } for (RivetParamRange range : ranges) { if (range.contains(rivetNo)) { return range; } } return null; } // 获取指定枪的参数区间,必要时从数据库重新加载 private static List getRivetParamRanges(String gunType) { List ranges = "A".equalsIgnoreCase(gunType) ? MesClient.rivetParamRangesA : MesClient.rivetParamRangesB; if (ranges == null || ranges.isEmpty()) { MesClient.loadRivetParamConfig(); ranges = "A".equalsIgnoreCase(gunType) ? MesClient.rivetParamRangesA : MesClient.rivetParamRangesB; } return ranges; } // 扫码/开工:加载最新配置、远程开机并下发任务与第1颗拉力/行程参数 public static void prepareAndStartWork() { MesClient.loadRivetParamConfig(); setPowerOn(MesClient.plcA); setPowerOn(MesClient.plcB); setTask(MesClient.plcA, MesClient.aSetNum, "A"); setTask(MesClient.plcB, MesClient.bSetNum, "B"); System.out.println("开工下发完成:A枪" + MesClient.aSetNum + "颗, B枪" + MesClient.bSetNum + "颗"); } // 保存配置后,按PLC当前进度将对应颗数的拉力/行程参数立即下发 public static void syncRivetParamsToPlc(ModbusTcp plc, List ranges) { if (plc == null || ranges == null || ranges.isEmpty()) { return; } try { int rivetNo; if (MesClient.work_status == 1) { short cur = plc.readInt16(1136); rivetNo = Math.max(cur + 1, 1); } else { // 非加工中按第1颗区间下发,避免沿用上次的完成颗数 rivetNo = 1; } applyParamsForRivet(plc, ranges, rivetNo); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } // 按颗数下发PLC拉力/行程参数 public static void applyParamsForRivet(ModbusTcp plc, List ranges, int rivetNo) { RivetParamRange range = findRivetParamRange(ranges, rivetNo); if (range == null) { System.out.println("未找到第" + rivetNo + "颗对应的参数配置"); return; } try { plc.writeInt16(1068, (short) range.getFMin()); plc.writeInt16(1069, (short) range.getFMax()); plc.writeInt16(1070, (short) range.getSMin()); plc.writeInt16(1071, (short) range.getSMax()); System.out.println("下发铆接参数:第" + rivetNo + "颗, F=" + range.getFMin() + "-" + range.getFMax() + ", S=" + range.getSMin() + "-" + range.getSMax()); } catch (Exception e) { e.printStackTrace(); } } // 重置任务 public static void setTask(ModbusTcp plc, Short setNum, String gunType) { try{ // 设置模式 1=标记铆接模式 plc.writeInt16(1092,(short) 1); // 设置任务 plc.writeInt16(1128,setNum); plc.writeInt16(1136,(short) 0); plc.writeInt16(1138,(short) 0); List ranges = getRivetParamRanges(gunType); applyParamsForRivet(plc, ranges, 1); }catch (Exception e){ e.printStackTrace(); } } // A枪说明 192.168.1.7 // plc.writeCoil(3079,false); // plc.writeCoil(3328,true); // 必须选关掉关机,开机才起左右 //// plc.writeCoil(3128,false); // System.out.println("控制模式:"+plc.readInt16(1090)); // 1091 控制模式 // System.out.println("系统运行中:"+plc.readCoil(3128,1)); // 3129 系统运行中 // System.out.println("结束暂停:"+plc.readCoil(3132,1)); // 3133 系统运行中 // System.out.println("远程开机:"+plc.readCoil(3328,1)); // 3329 远程开机 // System.out.println("远程关机:"+plc.readCoil(3079,1)); // 3080 远程关机 // System.out.println("作业模式:"+plc.readInt16(1092)); // 1093 作业模式 // System.out.println("最大拉力:"+plc.readInt16(1064)); // 1065 最大拉力 // System.out.println("对应位移:"+plc.readInt16(1065)); // 1066 对应位移 // System.out.println("任务数量:"+plc.readInt16(1128)); // 1129 任务数量 // System.out.println("合格数量:"+plc.readInt16(1138)); // 1139 合格数量 // System.out.println("质量状态:"+plc.readInt16(1072)); // 1073 质量状态 // System.out.println("F-out:"+plc.readInt16(1064)); // System.out.println("S-out:"+plc.readInt16(1065)); // System.out.println("F-min:"+plc.readInt16(1068)); // System.out.println("S-min:"+plc.readInt16(1070)); // System.out.println("F-max:"+plc.readInt16(1069)); // System.out.println("S-max:"+plc.readInt16(1071)); }