hou 5 dienas atpakaļ
vecāks
revīzija
81cc52a850

+ 13 - 7
src/com/mes/netty/NettyClientHandler.java

@@ -5,24 +5,27 @@ import com.mes.ui.MesRevice;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
 public class NettyClientHandler extends ChannelInboundHandlerAdapter {
 
+    private static final Logger log = LoggerFactory.getLogger(NettyClientHandler.class);
     private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     public static byte[] responseByte;
 
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
-        System.out.println("mes connecting:" + sdf.format(new Date()));
+        log.info("MES TCP 已连接:{}", sdf.format(new Date()));
     }
 
     @Override
     public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
         Channel channel = ctx.channel();
-        System.err.println("close tcp, ip:" + channel.remoteAddress());
+        log.warn("MES TCP 断开,ip:{}", channel.remoteAddress());
         MesClient.tcp_connect_flag = false;
         MesClient.setTcpStatus();
         // 关闭通道
@@ -31,18 +34,17 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
 
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-        System.out.println("msg:"+msg);
+        log.info("收到MES原始报文:{}", msg);
 
         String mes_msg = formatResult(msg.toString());
         if(mes_msg == null || mes_msg.isEmpty()){ // error msg
+            log.warn("MES回包格式异常,已丢弃:{}", msg);
             return;
         }
 
         String msg_type = ProtocolParam.getMsgType(mes_msg);
-        System.out.println("msg_type="+msg_type);
-
         String processMsgRet = MesMsgUtils.processMsg(mes_msg, msg_type);
-        System.out.println("processMsgRet="+processMsgRet);
+        log.info("MES回包解析 type={}, ret={}, body={}", msg_type, processMsgRet, mes_msg);
         switch(msg_type) {
             case "AQDW": // 查询质量
                 MesRevice.checkQualityRevice(processMsgRet,mes_msg);
@@ -59,6 +61,9 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
             case "MQDW":
                 MesRevice.updateResultRevice(processMsgRet,mes_msg);
                 break;
+            default:
+                log.warn("未处理的MES报文类型:{}", msg_type);
+                break;
         }
 
 
@@ -66,11 +71,12 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        log.error("MES TCP 异常", cause);
         ctx.close();
     }
 
     private String formatResult(String msg){
-        System.err.println("length:" + msg.length() + " content:" + msg);
+        log.debug("回包 length={} content={}", msg.length(), msg);
         String msgType = msg.substring(0,2).trim();
         if(msgType.equals("OK")){
             return msg.substring(3,msg.length());

+ 12 - 1
src/com/mes/ui/DataUtil.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson2.JSONObject;
 import com.mes.netty.NettyClient;
 import com.mes.util.DateLocalUtils;
 import com.mes.util.JdbcUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.net.HttpURLConnection;
@@ -13,6 +15,8 @@ import java.util.Properties;
 
 public class DataUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(DataUtil.class);
+
     public static Boolean synrTcp(NettyClient nettyClient,String mes_gw){
         try{
             //TCP连接后,直接先发同步报文
@@ -117,9 +121,14 @@ public class DataUtil {
             String msgType = "MQDW";
             String gy = "100000";
             String param = "";
+            log.info("发送结果提交 MQDW sn={}, result={}, user={}", sn != null ? sn.trim() : "", ret, user);
             Boolean aqdw_str = sendMessage(nettyClient,msgType,gy,"",sn,ret,user,"00",param);
+            if (!aqdw_str) {
+                log.error("结果提交报文发送失败 sn={}, result={}", sn != null ? sn.trim() : "", ret);
+            }
             return aqdw_str;
         }catch (Exception e){
+            log.error("结果提交异常 sn=" + sn, e);
             return false;
         }
     }
@@ -141,11 +150,13 @@ public class DataUtil {
             String zt = "ZT" + DateLocalUtils.getCurrentTimeHMS();
             String yh = "YH" + rightPad(user, 20);
             String aqdw_str = start + msgType + gw + gy + reslx + id + rs + da + zt + yh + paramNums + params;
-            System.out.println("message="+aqdw_str);
+            log.info("发送MES报文 type={}, craft={}, sn={}, result={}, msg={}",
+                    msgType, craft, sn != null ? sn.trim() : "", result, aqdw_str);
             JdbcUtils.insertData(gw, gy, aqdw_str, msgType, sn);
             nettyClient.future.channel().writeAndFlush(aqdw_str);
             return true;
         }catch (Exception e){
+            log.error("发送MES报文失败 type=" + msgType + ", sn=" + sn, e);
             return false;
         }
     }

+ 12 - 0
src/com/mes/ui/ErrorMsg.java

@@ -43,6 +43,18 @@ public class ErrorMsg {
                 lmsg = "工件码格式不正确";
             }else if(processMsgRet.equalsIgnoreCase("CF")) {
                 lmsg = "工件码重复";
+            }else if(processMsgRet.equalsIgnoreCase("PZ")) {
+                lmsg = "请先上传照片";
+            }else if(processMsgRet.equalsIgnoreCase("TO")) {
+                lmsg = "工位加工超时(OP150完成后需在15分钟内完成本工位)";
+            }else if(processMsgRet.equalsIgnoreCase("GH")) {
+                lmsg = "上一工位完成后冷却时间未到";
+            }else if(processMsgRet.equalsIgnoreCase("RP")) {
+                lmsg = "该码已在本工位加工完成,不可重复";
+            }else if(processMsgRet.equalsIgnoreCase("MT")) {
+                lmsg = "气密已达最大NG次数";
+            }else if(processMsgRet.equalsIgnoreCase("AL")) {
+                lmsg = "该工件存在未处理的报警信息";
             }
 
             MesClient.setMenuStatus(lmsg,-1);

+ 1 - 2
src/com/mes/ui/LoginFarme.java

@@ -189,8 +189,7 @@ public class LoginFarme extends JFrame {
                     if(MesClient.jfxPanel2 == null){
                         String url = "http://"+ MesClient.mes_server_ip+":8980/js/a/mes/mesProcessCheckRecord/ulist?__sid="+MesClient.sessionid+"&oprno="+MesClient.mes_gw+"&lineSn="+MesClient.mes_line_sn;
                         MesClient.jfxPanel2 = new MesWebView(url);
-                        MesClient.jfxPanel2.setSize(990, 550);
-                        MesClient.indexPanelC.add(MesClient.jfxPanel2);
+                        MesClient.indexPanelC.add(MesClient.jfxPanel2, BorderLayout.CENTER);
                     }
 
                     MesClient.initWarehouseData();

+ 25 - 8
src/com/mes/ui/MesClient.java

@@ -123,6 +123,7 @@ public class MesClient extends JFrame {
 //    public static List<Map> blist = new ArrayList<>();
     public static Short deviceControl = 0; // 0=本地 1=远程
     public static Integer tjStatus = 0; // 1=提交失败
+    public static boolean manualSubmitFlag = false; // 手动提交模式,可跳过冷板绑定校验
 
 
     public static String namea = "M6"; // A枪螺栓类型
@@ -581,6 +582,7 @@ public class MesClient extends JFrame {
         work_status = 0;
         check_quality_result = false;
         tjStatus = 0;
+        manualSubmitFlag = false;
         MesClient.finish_ok_bt.setEnabled(false);
         MesClient.finish_ng_bt.setEnabled(false);
         product_sn.setText("");
@@ -905,8 +907,10 @@ public class MesClient extends JFrame {
                 if(MesClient.work_status == 1){
                     log.info("手动提交:"+MesClient.product_sn.getText());
                     MesClient.tjStatus = 0;
+                    MesClient.manualSubmitFlag = true;
                     MesClient.finish_ok_bt.setEnabled(true);
                     MesClient.finish_ng_bt.setEnabled(true);
+                    MesClient.setMenuStatus("手动提交模式,请选择OK或NG", 0);
                 }
             }
         });
@@ -984,6 +988,7 @@ public class MesClient extends JFrame {
         toolBar.add(space_4);
 
         tabbedPane = new JTabbedPane(JTabbedPane.TOP);
+        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
         tabbedPane.setMinimumSize(new Dimension(400, 50));
         tabbedPane.setFont(new Font("宋体", Font.BOLD, 22));
         contentPane.add(tabbedPane);
@@ -1075,20 +1080,27 @@ public class MesClient extends JFrame {
         finish_ok_bt.setEnabled(false);
         finish_ok_bt.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                if(work_status == 1 && check_quality_result && bindLbStatus){
+                if(work_status == 1 && check_quality_result && (bindLbStatus || manualSubmitFlag)){
 
-                    String sn = getBarcode(product_sn.getText());
+                    String snSrc = curSn != null && !curSn.trim().isEmpty() ? curSn : product_sn.getText();
+                    String sn = getBarcode(snSrc);
                     getUser();
 
                     String qret = "OK";
+                    log.info("手动点OK提交 sn={}, manualSubmit={}, bindLb={}, user={}",
+                            sn.trim(), manualSubmitFlag, bindLbStatus, user20);
                     Boolean sendret = DataUtil.sendQuality(nettyClient,sn,qret,user20);
                     if(!sendret){
+                        log.error("手动OK提交发送失败 sn={}", sn.trim());
                         MesClient.setMenuStatus("消息发送失败,请重试",-1);
                         return;
                     }
                     finish_ok_bt.setEnabled(false);
                     finish_ng_bt.setEnabled(false);
                     setMenuStatus("结果提交中,请稍候...", 0);
+                } else {
+                    log.warn("OK按钮条件不满足 work_status={}, check_quality={}, bindLb={}, manualSubmit={}",
+                            work_status, check_quality_result, bindLbStatus, manualSubmitFlag);
                 }
             }
         });
@@ -1103,19 +1115,26 @@ public class MesClient extends JFrame {
         finish_ng_bt.setEnabled(false);
         finish_ng_bt.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                if(work_status == 1 && check_quality_result && bindLbStatus){
+                if(work_status == 1 && check_quality_result && (bindLbStatus || manualSubmitFlag)){
 
-                    String sn = getBarcode(product_sn.getText());
+                    String snSrc = curSn != null && !curSn.trim().isEmpty() ? curSn : product_sn.getText();
+                    String sn = getBarcode(snSrc);
                     getUser();
                     String qret = "NG";
+                    log.info("手动点NG提交 sn={}, manualSubmit={}, bindLb={}, user={}",
+                            sn.trim(), manualSubmitFlag, bindLbStatus, user20);
                     Boolean sendret = DataUtil.sendQuality(nettyClient,sn,qret,user20);
                     if(!sendret){
+                        log.error("手动NG提交发送失败 sn={}", sn.trim());
                         MesClient.setMenuStatus("消息发送失败,请重试",-1);
                         return;
                     }
                     finish_ok_bt.setEnabled(false);
                     finish_ng_bt.setEnabled(false);
                     setMenuStatus("结果提交中,请稍候...", 0);
+                } else {
+                    log.warn("NG按钮条件不满足 work_status={}, check_quality={}, bindLb={}, manualSubmit={}",
+                            work_status, check_quality_result, bindLbStatus, manualSubmitFlag);
                 }
             }
         });
@@ -1208,11 +1227,9 @@ public class MesClient extends JFrame {
 
 //		searchScrollPane = new JScrollPane((Component) null);
 
-        indexPanelC = new JPanel();
-        searchScrollPaneDj = new JScrollPane(indexPanelC);
-        indexPanelC.setLayout(null);
+        indexPanelC = new JPanel(new BorderLayout());
 
-        tabbedPane.addTab("开班点检", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), searchScrollPaneDj, null);
+        tabbedPane.addTab("开班点检", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), indexPanelC, null);
 
 
         indexPanelB = new JPanel();

+ 173 - 142
src/com/mes/ui/MesRevice.java

@@ -1,142 +1,173 @@
-package com.mes.ui;

-

-import com.mes.netty.ProtocolParam;

-

-import java.awt.*;

-

-public class MesRevice {

-

-    private static boolean isColdPlateCraft(String craft) {

-        return "400006".equals(craft != null ? craft.trim() : "");

-    }

-

-    private static boolean isUnbindSuccess(String processMsgRet) {

-        if (processMsgRet == null) {

-            return false;

-        }

-        String ret = processMsgRet.trim();

-        return ret.equalsIgnoreCase("OK")

-                || ret.equalsIgnoreCase("UD")

-                || ret.equalsIgnoreCase("UF")

-                || ret.equalsIgnoreCase("UDF");

-    }

-

-    // 质量查询

-    public static void checkQualityRevice(String processMsgRet, String mes_msg) {

-        try {

-            String sn = ProtocolParam.getSn(mes_msg).trim();

-            MesClient.checkSnType(sn);

-

-            if (processMsgRet.equalsIgnoreCase("UD")) {

-                MesClient.status_menu.setForeground(Color.GREEN);

-                MesClient.check_quality_result = true;

-                MesClient.setMenuStatus("该工件可以加工", 0);

-

-                if (MesClient.work_status == 0) {

-                    String barcode36 = MesClient.getBarcode(MesClient.product_sn.getText());

-                    MesClient.getUser();

-                    DataUtil.startWork(MesClient.nettyClient, barcode36, MesClient.user20);

-                }

-            } else {

-                MesClient.check_quality_result = false;

-                ErrorMsg.setErrorMsg(mes_msg);

-            }

-

-            if (MesClient.check_quality_result) {

-                if (MesClient.work_status == 0) {

-                    MesClient.finish_ok_bt.setEnabled(false);

-                    MesClient.finish_ng_bt.setEnabled(false);

-                } else {

-                    MesClient.finish_ok_bt.setEnabled(true);

-                    MesClient.finish_ng_bt.setEnabled(true);

-                }

-            } else {

-                MesClient.finish_ok_bt.setEnabled(false);

-                MesClient.finish_ng_bt.setEnabled(false);

-            }

-        } catch (Exception e) {

-            e.printStackTrace();

-        }

-    }

-

-    // 开始回复处理

-    public static void startRevice(String processMsgRet, String mes_msg) {

-        try {

-            if (processMsgRet.equalsIgnoreCase("OK")) {

-                MesClient.work_status = 1;

-                MesClient.f_scan_data_bt_1.setEnabled(false);

-                MesClient.tjStatus = 0;

-                MesClient.work_status_jqb = 2;

-

-                MesClient.f_scan_data_bt_2.setEnabled(true);

-                MesClient.setMenuStatus("请扫描冷板码", 0);

-            }

-        } catch (Exception e) {

-            e.printStackTrace();

-        }

-    }

-

-    // 绑定

-    public static void bindRevice(String processMsgRet, String mes_msg) {

-        try {

-            String craft = ProtocolParam.getCraft(mes_msg);

-            if (processMsgRet.equalsIgnoreCase("OK")) {

-                if (isColdPlateCraft(craft)) {

-                    MesClient.setMenuStatus("绑定成功!", 0);

-                    MesClient.btnUnbindLb.setEnabled(true);

-                    MesClient.bindLbStatus = true;

-                    MesClient.f_scan_data_bt_2.setEnabled(false);

-

-                    MesClient.sortA = 0;

-                    MesClient.aFinish = 0;

-                    MesClient.param2.setText("0");

-                    MesClient.work_status_jqb = 3;

-                }

-            } else if (isColdPlateCraft(craft) && processMsgRet.equalsIgnoreCase("PZ")) {

-                MesClient.setMenuStatus("请先上传密封圈照片,再绑定冷板!", -1);

-            }

-        } catch (Exception e) {

-            e.printStackTrace();

-        }

-    }

-

-    // 解绑

-    public static void unbindRevice(String processMsgRet, String mes_msg) {

-        try {

-            String craft = ProtocolParam.getCraft(mes_msg);

-            if (isUnbindSuccess(processMsgRet) && isColdPlateCraft(craft)) {

-                MesClient.setMenuStatus("解绑成功!", 0);

-                MesClient.clearLbBindUi();

-                MesClient.sortA = 0;

-                MesClient.aFinish = 0;

-                MesClient.param2.setText("0");

-            } else if (isColdPlateCraft(craft)) {

-                MesClient.setMenuStatus("解绑失败!", -1);

-            }

-        } catch (Exception e) {

-            e.printStackTrace();

-        }

-    }

-

-    // 上传质量

-    public static void updateResultRevice(String processMsgRet, String mes_msg) {

-        try {

-            if (processMsgRet.equalsIgnoreCase("OK")) {

-                try {

-                    MesClient.s7PLC.writeBoolean("DB32.0.7", true);

-                } catch (Exception e) {

-                    e.printStackTrace();

-                }

-                MesClient.resetScanA();

-                MesClient.setMenuStatus("结果提交成功,请扫下一件", 0);

-            } else {

-                MesClient.tjStatus = 1;

-                MesClient.finish_ok_bt.setEnabled(true);

-                MesClient.finish_ng_bt.setEnabled(true);

-                MesClient.setMenuStatus("结果提交失败,请重试", -1);

-            }

-        } catch (Exception e) {

-            e.printStackTrace();

-        }

-    }

-}

+package com.mes.ui;
+
+import com.mes.netty.ProtocolParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.*;
+
+public class MesRevice {
+
+    private static final Logger log = LoggerFactory.getLogger(MesRevice.class);
+
+    private static boolean isColdPlateCraft(String craft) {
+        return "400006".equals(craft != null ? craft.trim() : "");
+    }
+
+    private static boolean isUnbindSuccess(String processMsgRet) {
+        if (processMsgRet == null) {
+            return false;
+        }
+        String ret = processMsgRet.trim();
+        return ret.equalsIgnoreCase("OK")
+                || ret.equalsIgnoreCase("UD")
+                || ret.equalsIgnoreCase("UF")
+                || ret.equalsIgnoreCase("UDF");
+    }
+
+    // 质量查询
+    public static void checkQualityRevice(String processMsgRet, String mes_msg) {
+        try {
+            String sn = ProtocolParam.getSn(mes_msg).trim();
+            MesClient.checkSnType(sn);
+            log.info("质量查询回包 sn={}, ret={}", sn, processMsgRet);
+
+            if (processMsgRet.equalsIgnoreCase("UD")) {
+                MesClient.status_menu.setForeground(Color.GREEN);
+                MesClient.check_quality_result = true;
+                MesClient.setMenuStatus("该工件可以加工", 0);
+
+                if (MesClient.work_status == 0) {
+                    String barcode36 = MesClient.getBarcode(MesClient.product_sn.getText());
+                    MesClient.getUser();
+                    log.info("质量通过,发送开工 sn={}", barcode36.trim());
+                    DataUtil.startWork(MesClient.nettyClient, barcode36, MesClient.user20);
+                }
+            } else {
+                MesClient.check_quality_result = false;
+                log.warn("质量查询不可加工 sn={}, ret={}", sn, processMsgRet);
+                ErrorMsg.setErrorMsg(mes_msg);
+            }
+
+            if (MesClient.check_quality_result) {
+                if (MesClient.work_status == 0) {
+                    MesClient.finish_ok_bt.setEnabled(false);
+                    MesClient.finish_ng_bt.setEnabled(false);
+                } else {
+                    MesClient.finish_ok_bt.setEnabled(true);
+                    MesClient.finish_ng_bt.setEnabled(true);
+                }
+            } else {
+                MesClient.finish_ok_bt.setEnabled(false);
+                MesClient.finish_ng_bt.setEnabled(false);
+            }
+        } catch (Exception e) {
+            log.error("质量查询回包处理异常", e);
+        }
+    }
+    public static void startRevice(String processMsgRet, String mes_msg) {
+        try {
+            String sn = ProtocolParam.getSn(mes_msg).trim();
+            log.info("开工回包 sn={}, ret={}", sn, processMsgRet);
+            if (processMsgRet.equalsIgnoreCase("OK")) {
+                MesClient.work_status = 1;
+                MesClient.f_scan_data_bt_1.setEnabled(false);
+                MesClient.tjStatus = 0;
+                MesClient.work_status_jqb = 2;
+
+                MesClient.f_scan_data_bt_2.setEnabled(true);
+                MesClient.setMenuStatus("请扫描冷板码", 0);
+            } else {
+                log.warn("开工失败 sn={}, ret={}", sn, processMsgRet);
+            }
+        } catch (Exception e) {
+            log.error("开工回包处理异常", e);
+        }
+    }
+
+    // 绑定
+    public static void bindRevice(String processMsgRet, String mes_msg) {
+        try {
+            String craft = ProtocolParam.getCraft(mes_msg);
+            String sn = ProtocolParam.getSn(mes_msg).trim();
+            log.info("绑定回包 sn={}, craft={}, ret={}", sn, craft, processMsgRet);
+            if (processMsgRet.equalsIgnoreCase("OK")) {
+                if (isColdPlateCraft(craft)) {
+                    MesClient.setMenuStatus("绑定成功!", 0);
+                    MesClient.btnUnbindLb.setEnabled(true);
+                    MesClient.bindLbStatus = true;
+                    MesClient.f_scan_data_bt_2.setEnabled(false);
+
+                    MesClient.sortA = 0;
+                    MesClient.aFinish = 0;
+                    MesClient.param2.setText("0");
+                    MesClient.work_status_jqb = 3;
+                    log.info("冷板绑定成功 sn={}, lb={}", MesClient.curSn, MesClient.product_sn_lb.getText());
+                }
+            } else if (isColdPlateCraft(craft) && processMsgRet.equalsIgnoreCase("PZ")) {
+                log.warn("冷板绑定失败,需先上传密封圈照片 sn={}", sn);
+                MesClient.setMenuStatus("请先上传密封圈照片,再绑定冷板!", -1);
+            } else if (isColdPlateCraft(craft)) {
+                log.warn("冷板绑定失败 sn={}, ret={}", sn, processMsgRet);
+            }
+        } catch (Exception e) {
+            log.error("绑定回包处理异常", e);
+        }
+    }
+
+    // 解绑
+    public static void unbindRevice(String processMsgRet, String mes_msg) {
+        try {
+            String craft = ProtocolParam.getCraft(mes_msg);
+            String sn = ProtocolParam.getSn(mes_msg).trim();
+            log.info("解绑回包 sn={}, craft={}, ret={}", sn, craft, processMsgRet);
+            if (isUnbindSuccess(processMsgRet) && isColdPlateCraft(craft)) {
+                MesClient.setMenuStatus("解绑成功!", 0);
+                MesClient.clearLbBindUi();
+                MesClient.sortA = 0;
+                MesClient.aFinish = 0;
+                MesClient.param2.setText("0");
+            } else if (isColdPlateCraft(craft)) {
+                log.warn("解绑失败 sn={}, ret={}", sn, processMsgRet);
+                MesClient.setMenuStatus("解绑失败!", -1);
+            }
+        } catch (Exception e) {
+            log.error("解绑回包处理异常", e);
+        }
+    }
+
+    // 上传质量
+    public static void updateResultRevice(String processMsgRet, String mes_msg) {
+        try {
+            String sn = ProtocolParam.getSn(mes_msg).trim();
+            log.info("结果提交回包 sn={}, ret={}, curSn={}, productSn={}, bindLb={}, aFinish={}/{}",
+                    sn, processMsgRet, MesClient.curSn, MesClient.product_sn.getText(),
+                    MesClient.bindLbStatus, MesClient.aFinish, MesClient.aMax);
+            if (processMsgRet.equalsIgnoreCase("OK")) {
+                try {
+                    MesClient.s7PLC.writeBoolean("DB32.0.7", true);
+                } catch (Exception e) {
+                    log.error("结果提交成功后写 PLC 完成信号失败", e);
+                }
+                MesClient.resetScanA();
+                MesClient.setMenuStatus("结果提交成功,请扫下一件", 0);
+                log.info("结果提交成功 sn={}", sn);
+            } else {
+                MesClient.tjStatus = 1;
+                MesClient.finish_ok_bt.setEnabled(true);
+                MesClient.finish_ng_bt.setEnabled(true);
+                String detail = com.mes.util.ErrorMsg.getErrorMsg(
+                        processMsgRet, ProtocolParam.getLx(mes_msg));
+                if (detail == null || detail.isEmpty()
+                        || "该工件本工位不可加工".equals(detail)) {
+                    detail = (processMsgRet == null || processMsgRet.trim().isEmpty())
+                            ? "未知原因" : processMsgRet.trim();
+                }
+                log.error("结果提交失败 sn={}, ret={}, detail={}, msg={}", sn, processMsgRet, detail, mes_msg);
+                MesClient.setMenuStatus("结果提交失败:" + detail, -1);
+            }
+        } catch (Exception e) {
+            log.error("结果提交回包处理异常", e);
+        }
+    }
+}

+ 10 - 1
src/com/mes/ui/ModbusUtil.java

@@ -2,11 +2,15 @@ package com.mes.ui;
 
 import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
 import com.mes.util.JdbcUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.nio.charset.Charset;
 
 public class ModbusUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(ModbusUtil.class);
+
     public static void getDataA(ModbusTcp plc){
 
         // 说明
@@ -91,8 +95,13 @@ public class ModbusUtil {
                 if(MesClient.aFinish != MesClient.aMax){
                     retf = "NG";
                 }
-                Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.product_sn.getText(),retf, MesClient.user20);
+                String sn = MesClient.curSn != null && !MesClient.curSn.trim().isEmpty()
+                        ? MesClient.curSn : MesClient.product_sn.getText();
+                log.info("自动提交结果 sn={}, result={}, aFinish={}/{}, user={}",
+                        sn, retf, MesClient.aFinish, MesClient.aMax, MesClient.user20);
+                Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.getBarcode(sn), retf, MesClient.user20);
                 if(!ret){
+                    log.error("自动提交结果发送失败 sn={}, result={}", sn, retf);
                     MesClient.setMenuStatus(MesClient.tjFlagTextErr,-1);
                 }
             }

+ 18 - 13
src/com/mes/ui/PlcUtil.java

@@ -10,12 +10,16 @@ import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
 import com.mes.util.HcPlcPointUtilA;
 //import com.mes.util.HcPlcPointUtilB; // B枪已停用
 import com.mes.util.JdbcUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.nio.charset.Charset;
 import java.text.DecimalFormat;
 
 public class PlcUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(PlcUtil.class);
+
     public static void getDataA(TCPMasterConnection connection){
         if (!MesClient.bindLbStatus) {
             return;
@@ -41,15 +45,13 @@ public class PlcUtil {
             // 4. 解析数据
             HcPlcPointUtilA.PlcMesData mesData = HcPlcPointUtilA.readAllPoint(dRegs);
 
-            MesClient.maxa = mesData.setQty;
-            MesClient.param1.setText(String.valueOf(mesData.setQty));
-            String name = mesData.modelName;
-            MesClient.lblA.setText("拉铆枪A("+name+")");
-
-            if (MesClient.maxa <= 0){
+            if (mesData.setQty > 0) {
                 MesClient.maxa = mesData.setQty;
+                MesClient.aMax = mesData.setQty;
                 MesClient.param1.setText(String.valueOf(mesData.setQty));
             }
+            String name = mesData.modelName;
+            MesClient.lblA.setText("拉铆枪A("+name+")");
 
             MesClient.param2.setText(String.valueOf(MesClient.sortA));
             int currentOk = mesData.okQty;
@@ -69,7 +71,8 @@ public class PlcUtil {
                 name = mesData.modelName;
                 MesClient.lblA.setText("拉铆枪A("+name+")");
 
-                System.out.println("cur:" + currentOk);
+                log.info("拉铆计数更新 okQty={}, aMax={}, sn={}, bindLb={}",
+                        currentOk, MesClient.aMax, MesClient.curSn, MesClient.bindLbStatus);
                 // 只有条码存在时才写入数据库
                 if (!MesClient.product_sn.getText().isEmpty()) {
                     JdbcUtils.insertProdData(
@@ -85,12 +88,9 @@ public class PlcUtil {
                 }
             }
 
-            // 6. 更新产品条码
-            if (mesData.barcode != null && !mesData.barcode.isEmpty()) {
-                MesClient.product_sn.setText(mesData.barcode);
-            }
+            // 不覆盖已扫工件码:拉铆枪 PLC 条码地址可能与开工/绑定 SN 不一致,覆盖后会导致 MES 结果提交失败
 
-            // 7. 上传结果(旧逻辑中有 upResult())
+            // 上传结果
             upResult();
 
 
@@ -283,8 +283,13 @@ public class PlcUtil {
                 if(MesClient.aFinish != MesClient.aMax){
                     retf = "NG";
                 }
-                Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.product_sn.getText(),retf, MesClient.user20);
+                String sn = MesClient.curSn != null && !MesClient.curSn.trim().isEmpty()
+                        ? MesClient.curSn : MesClient.product_sn.getText();
+                log.info("自动提交结果 sn={}, result={}, aFinish={}/{}, user={}",
+                        sn, retf, MesClient.aFinish, MesClient.aMax, MesClient.user20);
+                Boolean ret = DataUtil.sendQuality(MesClient.nettyClient, MesClient.getBarcode(sn), retf, MesClient.user20);
                 if(!ret){
+                    log.error("自动提交结果发送失败 sn={}, result={}", sn, retf);
                     MesClient.setMenuStatus(MesClient.tjFlagTextErr,-1);
                 }
             }

+ 12 - 0
src/com/mes/util/ErrorMsg.java

@@ -38,6 +38,18 @@ public class ErrorMsg {
                 lmsg = "工件码格式不正确";
             }else if(processMsgRet.equalsIgnoreCase("CF")) {
                 lmsg = "工件码重复";
+            }else if(processMsgRet.equalsIgnoreCase("PZ")) {
+                lmsg = "请先上传照片";
+            }else if(processMsgRet.equalsIgnoreCase("TO")) {
+                lmsg = "工位加工超时(OP150完成后需在15分钟内完成本工位)";
+            }else if(processMsgRet.equalsIgnoreCase("GH")) {
+                lmsg = "上一工位完成后冷却时间未到";
+            }else if(processMsgRet.equalsIgnoreCase("RP")) {
+                lmsg = "该码已在本工位加工完成,不可重复";
+            }else if(processMsgRet.equalsIgnoreCase("MT")) {
+                lmsg = "气密已达最大NG次数";
+            }else if(processMsgRet.equalsIgnoreCase("AL")) {
+                lmsg = "该工件存在未处理的报警信息";
             }
         }catch (Exception e){ }
         return lmsg;

+ 1 - 1
src/resources/config/config.properties

@@ -1,4 +1,4 @@
-mes.gw=OP160B
+mes.gw=OP160A
 #mes.server_ip=127.0.0.1
 mes.server_ip=192.168.16.99
 mes.tcp_port=3000