|
|
@@ -8,6 +8,7 @@ import javax.swing.table.DefaultTableModel;
|
|
|
import java.awt.*;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 设备管理:IP、预设数量、按颗数区间的铆接参数配置
|
|
|
@@ -145,6 +146,19 @@ public class DeviceManagePanel extends JPanel {
|
|
|
fillTableModel(tableModelB, JdbcUtils.getRivetParams("B"));
|
|
|
}
|
|
|
|
|
|
+ // 重新从数据库加载到界面(进入设备管理页时调用)
|
|
|
+ public void reloadFromDb() {
|
|
|
+ Map<String, Object> config = JdbcUtils.getConfig();
|
|
|
+ if (config.size() > 0) {
|
|
|
+ MesClient.aSetNum = (Short) config.get("a_set_num");
|
|
|
+ MesClient.bSetNum = (Short) config.get("b_set_num");
|
|
|
+ MesClient.curIpA = (String) config.get("plc_ip_a");
|
|
|
+ MesClient.curIpB = (String) config.get("plc_ip_b");
|
|
|
+ }
|
|
|
+ MesClient.loadRivetParamConfig();
|
|
|
+ loadConfigToUi();
|
|
|
+ }
|
|
|
+
|
|
|
private void fillTableModel(DefaultTableModel model, List<RivetParamRange> ranges) {
|
|
|
model.setRowCount(0);
|
|
|
for (RivetParamRange range : ranges) {
|
|
|
@@ -175,19 +189,46 @@ public class DeviceManagePanel extends JPanel {
|
|
|
if (start < 1 || end < start) {
|
|
|
throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行颗数范围无效");
|
|
|
}
|
|
|
+ int fMin = parseIntCell(model, i, 2);
|
|
|
+ int fMax = parseIntCell(model, i, 3);
|
|
|
+ int sMin = parseIntCell(model, i, 4);
|
|
|
+ int sMax = parseIntCell(model, i, 5);
|
|
|
+ if (fMin > fMax) {
|
|
|
+ throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行 F-min 不能大于 F-max");
|
|
|
+ }
|
|
|
+ if (sMin > sMax) {
|
|
|
+ throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行 S-min 不能大于 S-max");
|
|
|
+ }
|
|
|
+ // PLC Int16 写入上限,避免溢出后下发错误值
|
|
|
+ if (fMin < Short.MIN_VALUE || fMax > Short.MAX_VALUE
|
|
|
+ || sMin < Short.MIN_VALUE || sMax > Short.MAX_VALUE) {
|
|
|
+ throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行参数超出范围(-32768~32767)");
|
|
|
+ }
|
|
|
RivetParamRange range = new RivetParamRange();
|
|
|
range.setGunType(gunType);
|
|
|
range.setStartRivet(start);
|
|
|
range.setEndRivet(end);
|
|
|
- range.setFMin(parseIntCell(model, i, 2));
|
|
|
- range.setFMax(parseIntCell(model, i, 3));
|
|
|
- range.setSMin(parseIntCell(model, i, 4));
|
|
|
- range.setSMax(parseIntCell(model, i, 5));
|
|
|
+ range.setFMin(fMin);
|
|
|
+ range.setFMax(fMax);
|
|
|
+ range.setSMin(sMin);
|
|
|
+ range.setSMax(sMax);
|
|
|
ranges.add(range);
|
|
|
}
|
|
|
if (ranges.isEmpty()) {
|
|
|
throw new IllegalArgumentException(gunType + "枪至少配置一行参数区间");
|
|
|
}
|
|
|
+ // 检查区间是否重叠,重叠会导致下发时命中错误行
|
|
|
+ for (int i = 0; i < ranges.size(); i++) {
|
|
|
+ RivetParamRange a = ranges.get(i);
|
|
|
+ for (int j = i + 1; j < ranges.size(); j++) {
|
|
|
+ RivetParamRange b = ranges.get(j);
|
|
|
+ if (a.getStartRivet() <= b.getEndRivet() && b.getStartRivet() <= a.getEndRivet()) {
|
|
|
+ throw new IllegalArgumentException(gunType + "枪参数区间存在重叠:"
|
|
|
+ + a.getStartRivet() + "-" + a.getEndRivet()
|
|
|
+ + " 与 " + b.getStartRivet() + "-" + b.getEndRivet());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
return ranges;
|
|
|
}
|
|
|
|
|
|
@@ -199,7 +240,29 @@ public class DeviceManagePanel extends JPanel {
|
|
|
return Integer.parseInt(text);
|
|
|
}
|
|
|
|
|
|
+ // 提交表格编辑并将参数下发到PLC
|
|
|
+ private boolean pushRivetParamsToDevice(ModbusTcp plc, List<RivetParamRange> ranges, String gunType) {
|
|
|
+ if (plc == null) {
|
|
|
+ System.out.println(gunType + "枪PLC未连接,跳过参数下发");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ ModbusUtil.syncRivetParamsToPlc(plc, ranges);
|
|
|
+ return true;
|
|
|
+ } catch (Exception ex) {
|
|
|
+ ex.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void saveAllConfig() {
|
|
|
+ // 保存前先结束表格编辑,确保最新输入写入模型
|
|
|
+ if (tableA != null && tableA.isEditing()) {
|
|
|
+ tableA.getCellEditor().stopCellEditing();
|
|
|
+ }
|
|
|
+ if (tableB != null && tableB.isEditing()) {
|
|
|
+ tableB.getCellEditor().stopCellEditing();
|
|
|
+ }
|
|
|
try {
|
|
|
short newASet = Short.parseShort(txtASet.getText().trim());
|
|
|
short newBSet = Short.parseShort(txtBSet.getText().trim());
|
|
|
@@ -213,9 +276,17 @@ public class DeviceManagePanel extends JPanel {
|
|
|
List<RivetParamRange> rangesA = parseTableModel(tableModelA, "A");
|
|
|
List<RivetParamRange> rangesB = parseTableModel(tableModelB, "B");
|
|
|
|
|
|
- JdbcUtils.updateConfig(newASet, newBSet, newIpA, newIpB);
|
|
|
- JdbcUtils.saveRivetParams("A", rangesA);
|
|
|
- JdbcUtils.saveRivetParams("B", rangesB);
|
|
|
+ boolean configOk = JdbcUtils.updateConfig(newASet, newBSet, newIpA, newIpB);
|
|
|
+ boolean saveAOk = JdbcUtils.saveRivetParams("A", rangesA);
|
|
|
+ boolean saveBOk = JdbcUtils.saveRivetParams("B", rangesB);
|
|
|
+ if (!configOk || !saveAOk || !saveBOk) {
|
|
|
+ JOptionPane.showMessageDialog(MesClient.mesClientFrame,
|
|
|
+ "配置保存失败,请查看控制台日志后重试(常见原因:数据库被占用)",
|
|
|
+ "错误", JOptionPane.ERROR_MESSAGE);
|
|
|
+ // 回读数据库,避免界面显示未真正落库的值
|
|
|
+ reloadFromDb();
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
MesClient.aSetNum = newASet;
|
|
|
MesClient.bSetNum = newBSet;
|
|
|
@@ -246,7 +317,16 @@ public class DeviceManagePanel extends JPanel {
|
|
|
MesClient.plcB = new ModbusTcp(1, MesClient.curIpB);
|
|
|
}
|
|
|
|
|
|
- JOptionPane.showMessageDialog(MesClient.mesClientFrame, "配置已保存", "提示", JOptionPane.INFORMATION_MESSAGE);
|
|
|
+ // 保存后立即将拉力/行程参数下发到设备
|
|
|
+ boolean syncA = pushRivetParamsToDevice(MesClient.plcA, rangesA, "A");
|
|
|
+ boolean syncB = pushRivetParamsToDevice(MesClient.plcB, rangesB, "B");
|
|
|
+ if (syncA && syncB) {
|
|
|
+ JOptionPane.showMessageDialog(MesClient.mesClientFrame, "配置已保存,并已下发到设备", "提示", JOptionPane.INFORMATION_MESSAGE);
|
|
|
+ } else {
|
|
|
+ JOptionPane.showMessageDialog(MesClient.mesClientFrame,
|
|
|
+ "配置已保存到本地,但部分设备参数下发失败,请检查设备连接;下次开工时会按新配置重新下发",
|
|
|
+ "提示", JOptionPane.WARNING_MESSAGE);
|
|
|
+ }
|
|
|
} catch (NumberFormatException ex) {
|
|
|
JOptionPane.showMessageDialog(MesClient.mesClientFrame, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
|
|
|
} catch (IllegalArgumentException ex) {
|