|
|
@@ -0,0 +1,755 @@
|
|
|
+package com.mes.ui;
|
|
|
+
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
|
|
|
+import com.mes.util.DateLocalUtils;
|
|
|
+import com.mes.util.JdbcUtils;
|
|
|
+
|
|
|
+import javax.swing.*;
|
|
|
+import java.awt.*;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * OP070-OP080 弧焊工作站 PLC 读写工具(DB108 非优化块)
|
|
|
+ */
|
|
|
+public class PlcUtil {
|
|
|
+
|
|
|
+ private static final String DB = "DB108";
|
|
|
+
|
|
|
+ /** MES→PLC 公共区:心跳 */
|
|
|
+ private static final String ADDR_MES_HEARTBEAT = DB + ".0.0";
|
|
|
+ /** MES→PLC 工位A:允许启动 */
|
|
|
+ private static final String ADDR_ALLOW_A = DB + ".2.0";
|
|
|
+ /** MES→PLC 工位B:允许启动 */
|
|
|
+ private static final String ADDR_ALLOW_B = DB + ".4.0";
|
|
|
+
|
|
|
+ /** PLC→MES 公共区:心跳 */
|
|
|
+ private static final String ADDR_PLC_HEARTBEAT = DB + ".6.0";
|
|
|
+ /** PLC→MES 公共区:故障报警状态 */
|
|
|
+ private static final String ADDR_FAULT = DB + ".6.1";
|
|
|
+
|
|
|
+ /** PLC→MES 工位A */
|
|
|
+ private static final String ADDR_SHIELD_A = DB + ".8.0";
|
|
|
+ private static final String ADDR_LOAD_A = DB + ".8.1";
|
|
|
+ private static final String ADDR_WAIT_A = DB + ".8.2";
|
|
|
+ private static final String ADDR_WORK_A = DB + ".8.3";
|
|
|
+ private static final String ADDR_DONE_A = DB + ".8.4";
|
|
|
+
|
|
|
+ /** PLC→MES 工位B */
|
|
|
+ private static final String ADDR_SHIELD_B = DB + ".10.0";
|
|
|
+ private static final String ADDR_LOAD_B = DB + ".10.1";
|
|
|
+ private static final String ADDR_WAIT_B = DB + ".10.2";
|
|
|
+ private static final String ADDR_WORK_B = DB + ".10.3";
|
|
|
+ private static final String ADDR_DONE_B = DB + ".10.4";
|
|
|
+
|
|
|
+ /** 工艺数据 R1(1号机/3号机为双机工位) */
|
|
|
+ private static final String ADDR_R1_ARC = DB + ".12.0";
|
|
|
+ private static final String ADDR_R1_JOB = DB + ".14";
|
|
|
+ private static final String ADDR_R1_CURRENT = DB + ".18";
|
|
|
+ private static final String ADDR_R1_VOLTAGE = DB + ".22";
|
|
|
+ private static final String ADDR_R1_WIRE = DB + ".26";
|
|
|
+ private static final String ADDR_R1_SPEED = DB + ".30";
|
|
|
+
|
|
|
+ /** 工艺数据 R2 */
|
|
|
+ private static final String ADDR_R2_ARC = DB + ".34.0";
|
|
|
+ private static final String ADDR_R2_JOB = DB + ".36";
|
|
|
+ private static final String ADDR_R2_CURRENT = DB + ".40";
|
|
|
+ private static final String ADDR_R2_VOLTAGE = DB + ".44";
|
|
|
+ private static final String ADDR_R2_WIRE = DB + ".48";
|
|
|
+ private static final String ADDR_R2_SPEED = DB + ".52";
|
|
|
+
|
|
|
+ /** 工艺数据 R3(2号机为四机工位) */
|
|
|
+ private static final String ADDR_R3_ARC = DB + ".56.0";
|
|
|
+ private static final String ADDR_R3_JOB = DB + ".58";
|
|
|
+ private static final String ADDR_R3_CURRENT = DB + ".62";
|
|
|
+ private static final String ADDR_R3_VOLTAGE = DB + ".66";
|
|
|
+ private static final String ADDR_R3_WIRE = DB + ".70";
|
|
|
+ private static final String ADDR_R3_SPEED = DB + ".74";
|
|
|
+
|
|
|
+ /** 工艺数据 R4 */
|
|
|
+ private static final String ADDR_R4_ARC = DB + ".78.0";
|
|
|
+ private static final String ADDR_R4_JOB = DB + ".80";
|
|
|
+ private static final String ADDR_R4_CURRENT = DB + ".84";
|
|
|
+ private static final String ADDR_R4_VOLTAGE = DB + ".88";
|
|
|
+ private static final String ADDR_R4_WIRE = DB + ".92";
|
|
|
+ private static final String ADDR_R4_SPEED = DB + ".96";
|
|
|
+
|
|
|
+ /** MES 心跳翻转状态 */
|
|
|
+ private static boolean mesHeartbeatState = false;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 翻转并写入 MES→PLC 心跳(DB108.0.0),供 PLC 判断 MES 在线
|
|
|
+ */
|
|
|
+ public static void pulseMesHeartbeat(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ mesHeartbeatState = !mesHeartbeatState;
|
|
|
+ s7PLC.writeBoolean(ADDR_MES_HEARTBEAT, mesHeartbeatState);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取 PLC→MES 心跳
|
|
|
+ */
|
|
|
+ public static Boolean getPlcHeartbeat(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_PLC_HEARTBEAT);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取故障报警状态
|
|
|
+ */
|
|
|
+ public static Boolean getFaultAlarm(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_FAULT);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取工作站外面当前是哪一面(上料位点位)
|
|
|
+ */
|
|
|
+ public static String getOutsideSide(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ Boolean stationA = s7PLC.readBoolean(ADDR_LOAD_A);
|
|
|
+ Boolean stationB = s7PLC.readBoolean(ADDR_LOAD_B);
|
|
|
+ if (Boolean.TRUE.equals(stationA) && !Boolean.TRUE.equals(stationB)) {
|
|
|
+ return "A";
|
|
|
+ }
|
|
|
+ if (Boolean.TRUE.equals(stationB) && !Boolean.TRUE.equals(stationA)) {
|
|
|
+ return "B";
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return MesClient.curPage.isEmpty() ? "A" : MesClient.curPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取联机屏蔽(任一面为1则视为屏蔽)
|
|
|
+ */
|
|
|
+ public static Boolean getShieldSignal(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ Boolean a = s7PLC.readBoolean(ADDR_SHIELD_A);
|
|
|
+ Boolean b = s7PLC.readBoolean(ADDR_SHIELD_B);
|
|
|
+ return Boolean.TRUE.equals(a) || Boolean.TRUE.equals(b);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取指定面联机屏蔽
|
|
|
+ */
|
|
|
+ public static Boolean getShieldSignal(S7PLC s7PLC, String side) {
|
|
|
+ try {
|
|
|
+ String addr = "A".equals(side) ? ADDR_SHIELD_A : ADDR_SHIELD_B;
|
|
|
+ return s7PLC.readBoolean(addr);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * DB108 联机屏蔽为 PLC→MES 只读点位,MES 不能写入
|
|
|
+ */
|
|
|
+ public static boolean setShieldSignal(S7PLC s7PLC, boolean shield) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按面写入允许启动(工位A=DB108.2.0,工位B=DB108.4.0)
|
|
|
+ */
|
|
|
+ public static boolean setMesAllowStart(S7PLC s7PLC, String side, boolean allow) {
|
|
|
+ try {
|
|
|
+ String addr = "A".equals(side) ? ADDR_ALLOW_A : ADDR_ALLOW_B;
|
|
|
+ s7PLC.writeBoolean(addr, allow);
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 兼容旧接口:同时写 A/B 允许启动
|
|
|
+ */
|
|
|
+ public static boolean setMesAllowEntry(S7PLC s7PLC, boolean allow) {
|
|
|
+ boolean a = setMesAllowStart(s7PLC, "A", allow);
|
|
|
+ boolean b = setMesAllowStart(s7PLC, "B", allow);
|
|
|
+ return a && b;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 作业中时立即撤销对应面的允许启动(A/B 独立)
|
|
|
+ */
|
|
|
+ public static void syncMesAllowOnSideStart(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ if (Boolean.TRUE.equals(getAStart(s7PLC))) {
|
|
|
+ setMesAllowStart(s7PLC, "A", false);
|
|
|
+ }
|
|
|
+ if (Boolean.TRUE.equals(getBStart(s7PLC))) {
|
|
|
+ setMesAllowStart(s7PLC, "B", false);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * A面作业中
|
|
|
+ */
|
|
|
+ public static Boolean getAStart(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_WORK_A);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * B面作业中
|
|
|
+ */
|
|
|
+ public static Boolean getBStart(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_WORK_B);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * A面作业完成
|
|
|
+ */
|
|
|
+ public static Boolean getAFinish(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_DONE_A);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * B面作业完成
|
|
|
+ */
|
|
|
+ public static Boolean getBFinish(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ return s7PLC.readBoolean(ADDR_DONE_B);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 质量检查通过后:发送对应面允许启动,进入等待启动状态
|
|
|
+ */
|
|
|
+ public static void onQualityPass(String side) {
|
|
|
+ onQualityPass(side, MesClient.getSideSn(side));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void onQualityPass(String side, String sn) {
|
|
|
+ if (sn != null && !sn.trim().isEmpty()) {
|
|
|
+ MesClient.setSideSn(side, sn);
|
|
|
+ }
|
|
|
+ final String statusText = "质量合格,已发送允许启动,等待启动";
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ MesClient.tjFlaga = 1;
|
|
|
+ MesClient.mesQualityFlagA = true;
|
|
|
+ MesClient.hjparamsA.clear();
|
|
|
+ } else {
|
|
|
+ MesClient.tjFlagb = 1;
|
|
|
+ MesClient.mesQualityFlagB = true;
|
|
|
+ MesClient.hjparamsB.clear();
|
|
|
+ }
|
|
|
+ setMesAllowStart(MesClient.s7PLC, side, true);
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus(side, statusText);
|
|
|
+ MesClient.setMenuStatus(side + ":" + statusText, 0);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 免扫码工位:空闲时直接发送允许启动,不扫码、不质检(A/B 独立)
|
|
|
+ */
|
|
|
+ public static void syncAutoAllowStations(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ Boolean aStart = getAStart(s7PLC);
|
|
|
+ Boolean bStart = getBStart(s7PLC);
|
|
|
+ if (MesClient.isAutoAllowSide("A") && !Boolean.TRUE.equals(aStart)) {
|
|
|
+ if (MesClient.tjFlaga == 0) {
|
|
|
+ enterAutoAllowWait("A");
|
|
|
+ } else if (MesClient.tjFlaga == 1) {
|
|
|
+ setMesAllowStart(s7PLC, "A", true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (MesClient.isAutoAllowSide("B") && !Boolean.TRUE.equals(bStart)) {
|
|
|
+ if (MesClient.tjFlagb == 0) {
|
|
|
+ enterAutoAllowWait("B");
|
|
|
+ } else if (MesClient.tjFlagb == 1) {
|
|
|
+ setMesAllowStart(s7PLC, "B", true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 免扫码工位进入等待启动:写对应面允许启动
|
|
|
+ */
|
|
|
+ private static void enterAutoAllowWait(String side) {
|
|
|
+ final String statusText = "免扫码工位,已允许启动,可直接启动";
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ MesClient.tjFlaga = 1;
|
|
|
+ MesClient.mesQualityFlagA = true;
|
|
|
+ MesClient.hjparamsA.clear();
|
|
|
+ MesClient.workSnA = "";
|
|
|
+ } else {
|
|
|
+ MesClient.tjFlagb = 1;
|
|
|
+ MesClient.mesQualityFlagB = true;
|
|
|
+ MesClient.hjparamsB.clear();
|
|
|
+ MesClient.workSnB = "";
|
|
|
+ }
|
|
|
+ MesClient.work_status = 1;
|
|
|
+ setMesAllowStart(MesClient.s7PLC, side, true);
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideSn(side, "免扫码");
|
|
|
+ MesClient.setSideStatus(side, statusText);
|
|
|
+ MesClient.setMenuStatus(side + ":" + statusText, 0);
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ if (MesClient.scan_bt_a != null) {
|
|
|
+ MesClient.scan_bt_a.setEnabled(false);
|
|
|
+ }
|
|
|
+ } else if (MesClient.scan_bt_b != null) {
|
|
|
+ MesClient.scan_bt_b.setEnabled(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 免扫码工位加工完成:不采数、不提交,复位后由 syncAutoAllow 再次允许启动
|
|
|
+ */
|
|
|
+ private static void finishAutoAllowSide(String side) {
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ MesClient.tjFlaga = 0;
|
|
|
+ MesClient.mesQualityFlagA = false;
|
|
|
+ MesClient.tjStatusa = 0;
|
|
|
+ MesClient.workSnA = "";
|
|
|
+ MesClient.hjparamsA.clear();
|
|
|
+ } else {
|
|
|
+ MesClient.tjFlagb = 0;
|
|
|
+ MesClient.mesQualityFlagB = false;
|
|
|
+ MesClient.tjStatusb = 0;
|
|
|
+ MesClient.workSnB = "";
|
|
|
+ MesClient.hjparamsB.clear();
|
|
|
+ }
|
|
|
+ if (MesClient.tjFlaga == 0 && MesClient.tjFlagb == 0) {
|
|
|
+ MesClient.work_status = 0;
|
|
|
+ }
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideSn(side, "免扫码");
|
|
|
+ MesClient.setSideStatus(side, "免扫码工位加工完成,等待下一件");
|
|
|
+ MesClient.setMenuStatus(side + ":免扫码工位加工完成,不提交数据", 0);
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ if (MesClient.finish_ok_bt_a != null) {
|
|
|
+ MesClient.finish_ok_bt_a.setEnabled(false);
|
|
|
+ }
|
|
|
+ if (MesClient.finish_ng_bt_a != null) {
|
|
|
+ MesClient.finish_ng_bt_a.setEnabled(false);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (MesClient.finish_ok_bt_b != null) {
|
|
|
+ MesClient.finish_ok_bt_b.setEnabled(false);
|
|
|
+ }
|
|
|
+ if (MesClient.finish_ng_bt_b != null) {
|
|
|
+ MesClient.finish_ng_bt_b.setEnabled(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * A 面状态机:等待启动 -> 运行采数 -> 完成提交
|
|
|
+ */
|
|
|
+ public static void getStatusA(S7PLC s7PLC) {
|
|
|
+ if (Boolean.TRUE.equals(getAStart(s7PLC))) {
|
|
|
+ setMesAllowStart(s7PLC, "A", false);
|
|
|
+ }
|
|
|
+ boolean autoAllow = MesClient.isAutoAllowSide("A");
|
|
|
+ if (MesClient.tjFlaga == 1) {
|
|
|
+ if (Boolean.TRUE.equals(getAStart(s7PLC))) {
|
|
|
+ MesClient.curFlag = "A";
|
|
|
+ MesClient.tjFlaga = 2;
|
|
|
+ MesClient.hjparamsA.clear();
|
|
|
+ final String runText = autoAllow ? "免扫码工位运行中(不采集)" : "设备运行中,采集中...";
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus("A", runText);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else if (MesClient.tjFlaga == 2) {
|
|
|
+ if (Boolean.TRUE.equals(getAFinish(s7PLC))) {
|
|
|
+ if (autoAllow) {
|
|
|
+ finishAutoAllowSide("A");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ collectWeldingParams(s7PLC);
|
|
|
+ MesClient.tjFlaga = 3;
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus("A", "焊接完成,提交结果中...");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ submitResult("A", MesClient.getSideSn("A"), MesClient.mes_gw1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * B 面状态机
|
|
|
+ */
|
|
|
+ public static void getStatusB(S7PLC s7PLC) {
|
|
|
+ if (Boolean.TRUE.equals(getBStart(s7PLC))) {
|
|
|
+ setMesAllowStart(s7PLC, "B", false);
|
|
|
+ }
|
|
|
+ boolean autoAllow = MesClient.isAutoAllowSide("B");
|
|
|
+ if (MesClient.tjFlagb == 1) {
|
|
|
+ if (Boolean.TRUE.equals(getBStart(s7PLC))) {
|
|
|
+ MesClient.curFlag = "B";
|
|
|
+ MesClient.tjFlagb = 2;
|
|
|
+ MesClient.hjparamsB.clear();
|
|
|
+ final String runText = autoAllow ? "免扫码工位运行中(不采集)" : "设备运行中,采集中...";
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus("B", runText);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else if (MesClient.tjFlagb == 2) {
|
|
|
+ if (Boolean.TRUE.equals(getBFinish(s7PLC))) {
|
|
|
+ if (autoAllow) {
|
|
|
+ finishAutoAllowSide("B");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ collectWeldingParams(s7PLC);
|
|
|
+ MesClient.tjFlagb = 3;
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus("B", "焊接完成,提交结果中...");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ submitResult("B", MesClient.getSideSn("B"), MesClient.mes_gw2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 运行中每秒采集 R1~R4 焊接参数(DB108)
|
|
|
+ * 只写入内存,不中途落库;加工结束整包一条上传
|
|
|
+ * 免扫码工位不采集
|
|
|
+ */
|
|
|
+ public static void collectWeldingParams(S7PLC s7PLC) {
|
|
|
+ boolean collectA = MesClient.tjFlaga == 2 && !MesClient.isAutoAllowSide("A");
|
|
|
+ boolean collectB = MesClient.tjFlagb == 2 && !MesClient.isAutoAllowSide("B");
|
|
|
+ if (!collectA && !collectB) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ Float r1Current = s7PLC.readFloat32(ADDR_R1_CURRENT);
|
|
|
+ Float r1Voltage = s7PLC.readFloat32(ADDR_R1_VOLTAGE);
|
|
|
+ Float r1WireFeed = s7PLC.readFloat32(ADDR_R1_WIRE);
|
|
|
+ Float r1Speed = s7PLC.readFloat32(ADDR_R1_SPEED);
|
|
|
+ Float r1Job = s7PLC.readFloat32(ADDR_R1_JOB);
|
|
|
+
|
|
|
+ Float r2Current = s7PLC.readFloat32(ADDR_R2_CURRENT);
|
|
|
+ Float r2Voltage = s7PLC.readFloat32(ADDR_R2_VOLTAGE);
|
|
|
+ Float r2WireFeed = s7PLC.readFloat32(ADDR_R2_WIRE);
|
|
|
+ Float r2Speed = s7PLC.readFloat32(ADDR_R2_SPEED);
|
|
|
+ Float r2Job = s7PLC.readFloat32(ADDR_R2_JOB);
|
|
|
+
|
|
|
+ Float r3Current = s7PLC.readFloat32(ADDR_R3_CURRENT);
|
|
|
+ Float r3Voltage = s7PLC.readFloat32(ADDR_R3_VOLTAGE);
|
|
|
+ Float r3WireFeed = s7PLC.readFloat32(ADDR_R3_WIRE);
|
|
|
+ Float r3Speed = s7PLC.readFloat32(ADDR_R3_SPEED);
|
|
|
+ Float r3Job = s7PLC.readFloat32(ADDR_R3_JOB);
|
|
|
+
|
|
|
+ Float r4Current = s7PLC.readFloat32(ADDR_R4_CURRENT);
|
|
|
+ Float r4Voltage = s7PLC.readFloat32(ADDR_R4_VOLTAGE);
|
|
|
+ Float r4WireFeed = s7PLC.readFloat32(ADDR_R4_WIRE);
|
|
|
+ Float r4Speed = s7PLC.readFloat32(ADDR_R4_SPEED);
|
|
|
+ Float r4Job = s7PLC.readFloat32(ADDR_R4_JOB);
|
|
|
+
|
|
|
+ String recordTime = DateLocalUtils.getCurrentTime();
|
|
|
+ String paramLine = r1Current + "|" + r1Voltage + "|" + r1WireFeed + "|" + r1Speed + "|" + r1Job + "|"
|
|
|
+ + r2Current + "|" + r2Voltage + "|" + r2WireFeed + "|" + r2Speed + "|" + r2Job + "|"
|
|
|
+ + r3Current + "|" + r3Voltage + "|" + r3WireFeed + "|" + r3Speed + "|" + r3Job + "|"
|
|
|
+ + r4Current + "|" + r4Voltage + "|" + r4WireFeed + "|" + r4Speed + "|" + r4Job + "|"
|
|
|
+ + recordTime;
|
|
|
+
|
|
|
+ if (collectA) {
|
|
|
+ MesClient.hjparamsA.add(paramLine);
|
|
|
+ }
|
|
|
+ if (collectB) {
|
|
|
+ MesClient.hjparamsB.add(paramLine);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新左右面 PLC 布尔点位显示(上料位 / 待加工 / 作业中 / 作业完成 / 联机屏蔽)
|
|
|
+ */
|
|
|
+ public static void refreshSidePointLabels(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ final boolean loadA = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_LOAD_A));
|
|
|
+ final boolean waitA = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_WAIT_A));
|
|
|
+ final boolean startA = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_WORK_A));
|
|
|
+ final boolean finishA = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_DONE_A));
|
|
|
+ final boolean shieldA = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_SHIELD_A));
|
|
|
+
|
|
|
+ final boolean loadB = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_LOAD_B));
|
|
|
+ final boolean waitB = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_WAIT_B));
|
|
|
+ final boolean startB = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_WORK_B));
|
|
|
+ final boolean finishB = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_DONE_B));
|
|
|
+ final boolean shieldB = Boolean.TRUE.equals(s7PLC.readBoolean(ADDR_SHIELD_B));
|
|
|
+
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ updateBoolLabel(MesClient.lblPointIdA, loadA);
|
|
|
+ updateBoolLabel(MesClient.lblPointWaitA, waitA);
|
|
|
+ updateBoolLabel(MesClient.lblPointStartA, startA);
|
|
|
+ updateBoolLabel(MesClient.lblPointFinishA, finishA);
|
|
|
+ updateBoolLabel(MesClient.lblPointShieldA, shieldA);
|
|
|
+ updateBoolLabel(MesClient.lblPointIdB, loadB);
|
|
|
+ updateBoolLabel(MesClient.lblPointWaitB, waitB);
|
|
|
+ updateBoolLabel(MesClient.lblPointStartB, startB);
|
|
|
+ updateBoolLabel(MesClient.lblPointFinishB, finishB);
|
|
|
+ updateBoolLabel(MesClient.lblPointShieldB, shieldB);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新底部公共焊机参数(DB108 R1~R4 工艺参数)
|
|
|
+ */
|
|
|
+ public static void refreshWelderParamLabels(S7PLC s7PLC) {
|
|
|
+ try {
|
|
|
+ final Float r1Current = s7PLC.readFloat32(ADDR_R1_CURRENT);
|
|
|
+ final Float r1Voltage = s7PLC.readFloat32(ADDR_R1_VOLTAGE);
|
|
|
+ final Float r1WireFeed = s7PLC.readFloat32(ADDR_R1_WIRE);
|
|
|
+ final Float r1Job = s7PLC.readFloat32(ADDR_R1_JOB);
|
|
|
+
|
|
|
+ final Float r2Current = s7PLC.readFloat32(ADDR_R2_CURRENT);
|
|
|
+ final Float r2Voltage = s7PLC.readFloat32(ADDR_R2_VOLTAGE);
|
|
|
+ final Float r2WireFeed = s7PLC.readFloat32(ADDR_R2_WIRE);
|
|
|
+ final Float r2Job = s7PLC.readFloat32(ADDR_R2_JOB);
|
|
|
+
|
|
|
+ final Float r3Current = s7PLC.readFloat32(ADDR_R3_CURRENT);
|
|
|
+ final Float r3Voltage = s7PLC.readFloat32(ADDR_R3_VOLTAGE);
|
|
|
+ final Float r3WireFeed = s7PLC.readFloat32(ADDR_R3_WIRE);
|
|
|
+ final Float r3Job = s7PLC.readFloat32(ADDR_R3_JOB);
|
|
|
+
|
|
|
+ final Float r4Current = s7PLC.readFloat32(ADDR_R4_CURRENT);
|
|
|
+ final Float r4Voltage = s7PLC.readFloat32(ADDR_R4_VOLTAGE);
|
|
|
+ final Float r4WireFeed = s7PLC.readFloat32(ADDR_R4_WIRE);
|
|
|
+ final Float r4Job = s7PLC.readFloat32(ADDR_R4_JOB);
|
|
|
+
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ setParamText(MesClient.r1_voltage, r1Voltage);
|
|
|
+ setParamText(MesClient.r1_current, r1Current);
|
|
|
+ setParamText(MesClient.r1_wire, r1WireFeed);
|
|
|
+ setParamText(MesClient.r1_bead, r1Job);
|
|
|
+
|
|
|
+ setParamText(MesClient.r2_voltage, r2Voltage);
|
|
|
+ setParamText(MesClient.r2_current, r2Current);
|
|
|
+ setParamText(MesClient.r2_wire, r2WireFeed);
|
|
|
+ setParamText(MesClient.r2_bead, r2Job);
|
|
|
+
|
|
|
+ setParamText(MesClient.r3_voltage, r3Voltage);
|
|
|
+ setParamText(MesClient.r3_current, r3Current);
|
|
|
+ setParamText(MesClient.r3_wire, r3WireFeed);
|
|
|
+ setParamText(MesClient.r3_bead, r3Job);
|
|
|
+
|
|
|
+ setParamText(MesClient.r4_voltage, r4Voltage);
|
|
|
+ setParamText(MesClient.r4_current, r4Current);
|
|
|
+ setParamText(MesClient.r4_wire, r4WireFeed);
|
|
|
+ setParamText(MesClient.r4_bead, r4Job);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void updateBoolLabel(JLabel label, boolean value) {
|
|
|
+ if (label == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value) {
|
|
|
+ label.setText("TRUE");
|
|
|
+ label.setForeground(new Color(0, 140, 0));
|
|
|
+ label.setBackground(new Color(200, 255, 200));
|
|
|
+ } else {
|
|
|
+ label.setText("FALSE");
|
|
|
+ label.setForeground(Color.GRAY);
|
|
|
+ label.setBackground(new Color(230, 230, 230));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void setParamText(JTextField field, Object value) {
|
|
|
+ if (field == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value == null) {
|
|
|
+ field.setText("0");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value instanceof Float) {
|
|
|
+ field.setText(String.format("%.2f", (Float) value));
|
|
|
+ } else {
|
|
|
+ field.setText(String.valueOf(value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 焊接完成:先提交质量结果,再整包上传焊接参数(两套接口分开)
|
|
|
+ * 1) sendQualityPc → MES 质量结果(pcresult)
|
|
|
+ * 2) flushHjParams → 本地 bw_cmt(一个工件一条,多条采数合并)
|
|
|
+ * 3) uploadPendingCmtParams → batchsave
|
|
|
+ */
|
|
|
+ private static void submitResult(String side, String sn, String oprno) {
|
|
|
+ if (sn == null || sn.trim().isEmpty()) {
|
|
|
+ sn = MesClient.getSideSn(side);
|
|
|
+ }
|
|
|
+ if (sn == null || sn.trim().isEmpty()) {
|
|
|
+ MesClient.log.error("{}面提交结果失败:工件码为空 workSnA={} workSnB={}",
|
|
|
+ side, MesClient.workSnA, MesClient.workSnB);
|
|
|
+ MesClient.setMenuStatus(side + "面工件码为空,无法提交结果,请手动OK/NG", -1);
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus(side, "工件码为空,提交失败");
|
|
|
+ enableManualButtons(side);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final String finalSn = sn.trim();
|
|
|
+
|
|
|
+ MesClient.getUser();
|
|
|
+ MesClient.log.info("{}面开始提交结果 sn={} oprno={} user={}",
|
|
|
+ side, finalSn, oprno, MesClient.user20);
|
|
|
+
|
|
|
+ JSONObject result = DataUtil.sendQualityPc(finalSn, "OK", MesClient.user20, oprno,
|
|
|
+ MesClient.mes_line_sn, MesClient.mes_server_ip);
|
|
|
+ boolean ok = DataUtil.isMesSuccess(result);
|
|
|
+
|
|
|
+ flushHjParams(side, oprno, finalSn);
|
|
|
+ MesClient.uploadPendingCmtParams();
|
|
|
+
|
|
|
+ if (ok) {
|
|
|
+ MesClient.setMenuStatus(side + "面结果提交成功", 0);
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus(side, "提交成功");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ MesClient.resetScan(side);
|
|
|
+ } else {
|
|
|
+ String msg = (result == null) ? "请求失败或返回空" : result.getString("message");
|
|
|
+ if (msg == null || msg.isEmpty()) {
|
|
|
+ msg = "提交失败";
|
|
|
+ }
|
|
|
+ MesClient.log.error("{}面结果提交失败 sn={} oprno={} ret={}",
|
|
|
+ side, finalSn, oprno, result == null ? "null" : result.toJSONString());
|
|
|
+ MesClient.setMenuStatus(side + "面结果" + msg + ",可手动重试", -1);
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ MesClient.setSideStatus(side, "结果提交失败,可手动OK/NG");
|
|
|
+ enableManualButtons(side);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void enableManualButtons(String side) {
|
|
|
+ if ("A".equals(side)) {
|
|
|
+ if (MesClient.finish_ok_bt_a != null) {
|
|
|
+ MesClient.finish_ok_bt_a.setEnabled(true);
|
|
|
+ }
|
|
|
+ if (MesClient.finish_ng_bt_a != null) {
|
|
|
+ MesClient.finish_ng_bt_a.setEnabled(true);
|
|
|
+ }
|
|
|
+ MesClient.tjStatusa = 1;
|
|
|
+ } else {
|
|
|
+ if (MesClient.finish_ok_bt_b != null) {
|
|
|
+ MesClient.finish_ok_bt_b.setEnabled(true);
|
|
|
+ }
|
|
|
+ if (MesClient.finish_ng_bt_b != null) {
|
|
|
+ MesClient.finish_ng_bt_b.setEnabled(true);
|
|
|
+ }
|
|
|
+ MesClient.tjStatusb = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷写指定面焊接参数到本地库(整包一条,不中途分片)
|
|
|
+ */
|
|
|
+ public static void flushHjParams(String oprno, String sn) {
|
|
|
+ String side = oprno != null && oprno.equals(MesClient.mes_gw2) ? "B" : "A";
|
|
|
+ flushHjParams(side, oprno, sn);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void flushHjParams(String side, String oprno, String sn) {
|
|
|
+ List<String> list = MesClient.getSideHjParams(side);
|
|
|
+ if (list == null || list.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ boolean ok = JdbcUtils.insertCmtData(oprno, MesClient.mes_line_sn, sn, JSON.toJSONString(list));
|
|
|
+ if (ok) {
|
|
|
+ list.clear();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|