wang.sq@aliyun.com 6 bulan lalu
induk
melakukan
01f87c4eba
1 mengubah file dengan 160 tambahan dan 104 penghapusan
  1. 160 104
      IMCS_CCS/Service/Impl/TaskJobService.cs

+ 160 - 104
IMCS_CCS/Service/Impl/TaskJobService.cs

@@ -23,6 +23,7 @@ using Microsoft.AspNetCore.Mvc;
 using Org.BouncyCastle.Ocsp;
 using System.Text;
 using IMCS.CCS.Entitys.Dto;
+using System.IO.Pipelines;
 
 namespace IMCS.CCS.Service.Impl
 {
@@ -348,6 +349,159 @@ namespace IMCS.CCS.Service.Impl
             }
         }
 
+        // rfid校验,true为通过,false为回滚
+        private async Task<Rfid> CheckRFid(TaskCallback task) {
+
+            Rfid rfid = new Rfid();
+            rfid.success = true;
+
+            // 读取初始化的数据,判断是否RFID校验生效
+            var rfidFlag = await _redisService.Database.StringGetAsync(RFID + RedisKeyEnum.Flag);
+            Boolean flag = true;
+            if (!rfidFlag.IsNullOrEmpty && rfidFlag=="false")
+            {
+                Log.Instance.WriteLogAdd("RFID逻辑块==》放弃RFID生效,放行操作,执行的任务:" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
+                rfid.success = true;
+                rfid.msg = "放弃RFID生效,放行操作";
+                return rfid;
+            }
+
+
+            // 读取imcs缓存的托盘编码以及零件编码
+            string imcsRFID = _redisService.Database.StringGetAsync(RFID + task.TaskNodeId).Result;
+            // 读取ccs缓存的托盘编码
+
+            SiemensS7Net plcS7 = DevicePlcS7.SiemensS7(task.IP);
+            HslCommunication.OperateResult plcConnectionResult = plcS7.ConnectServer();
+            if (!plcConnectionResult.IsSuccess)
+            {
+                Log.Instance.WriteLogAdd("RFID逻辑块==》PLC连接失败,执行的任务:" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
+                rfid.success = false;
+                rfid.msg = "PLC连接失败====》"+ task.IP;
+                return rfid;
+            }
+            
+            //获取任务执行结果 2表示取完成,开始下发读指令
+            string plcResult = plcS7.ReadInt16("DB1.16").Content.ToString();
+            if (plcResult == "5") {
+                Log.Instance.WriteLogAdd("RFID逻辑块==》任务已完成状态,放行操作,执行的任务:" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
+
+                plcS7.Write("DB2.12", Convert.ToInt16("0"));
+                plcS7.ConnectClose();
+                rfid.success = true;
+                rfid.msg = "任务已完成状态,放行操作";
+                return rfid;
+            }
+            else 
+            if (plcResult != "1" && plcResult != "2" && plcResult != "3")
+            {
+                Log.Instance.WriteLogAdd("RFID逻辑块==》DB1.16结果不满足,执行的任务:" + JsonConvert.SerializeObject(task)+ "DB1.16 应该为2实际为"+ plcResult, LOG_TITLE_CALLBACK);
+
+                rfid.success = false;
+                rfid.msg = "未取完成====》DB1.16 应该为2实际为"+ plcResult;
+                plcS7.ConnectClose();
+                return rfid;
+            }
+
+            // 获取读写状态
+            string plcRead = plcS7.ReadInt16("DB1.18").Content.ToString();
+
+            // 判断读写状态,DB1.DBB18 
+            if (plcRead == "1")
+            { //下发读指令
+                plcS7.Write("DB2.12", Convert.ToInt16("1"));
+                Log.Instance.WriteLogAdd("RFID逻辑块==》rfid读命令已下发,执行的任务:" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
+                plcS7.ConnectClose();
+                rfid.success = false;
+                rfid.msg = "RFID读命令已下发";
+                return rfid;
+            }
+            else if (plcRead == "3")
+            { // 取rfid数据,并比对数据
+
+                //  imcs缓存的托盘编码数据
+                string[] strings = imcsRFID.Replace("\"", "").Split("&");
+                Rfid imcsRfid = new Rfid();
+                imcsRfid.trayNo = strings[0];
+                imcsRfid.uniqueCode = strings[1];
+
+                //读取RFID的托盘编码
+                string readResult = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.20", 39).Content).Replace(" ","");
+                if (imcsRfid.trayNo != readResult)
+                {
+                    Log.Instance.WriteLogAdd("RFID逻辑块==》RFID校验托盘失败:" + "读取imcs_redis数据_" + JsonConvert.SerializeObject(imcsRfid) + ",读取RFID数据_" + readResult.ToString(), LOG_TITLE_CALLBACK);
+
+                    plcS7.ConnectClose();
+                    rfid.success = false;
+                    rfid.msg = task.Id + ":RFID托盘校验失败,imcs和RFID托盘信息不一致";
+                    return rfid;
+                }
+                else
+                {
+                    plcS7.Write("DB2.12", Convert.ToInt16("2"));
+
+                    //读 源位置 是上下料站还是机床
+                    string up = plcS7.ReadInt16("DB1.12").Content.ToString();
+                    //如果是上下料站,往RFID中写state(1毛坯)和PID(零件编码)
+                    if (sList.Contains(up))
+                    {
+                        if (imcsRfid.uniqueCode == null)
+                        {
+                            plcS7.Write("DB2.55", Convert.ToInt16("0"));
+                            plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString("", 39));
+                        }
+                        else
+                        {
+                            plcS7.Write("DB2.55", Convert.ToInt16("1"));
+                            plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString(imcsRfid.uniqueCode, 39));
+                        }
+
+                    }
+                    else if (jList.Contains(up))
+                    { //如果是机床,往RFID中写state(2 成品)和PID(零件编码)
+                        plcS7.Write("DB2.55", Convert.ToInt16("2"));
+                        string readResult1 = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.62", 39).Content);
+
+                        plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString(readResult1, 39));
+                    }
+                    else
+                    {
+                        string readResult1 = plcS7.ReadInt16("DB1.61").Content.ToString();
+                        string readResult2 = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.62", 39).Content).Replace(" ","");
+
+                        plcS7.Write("DB2.55", Convert.ToInt16("2"));
+                        plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString(readResult2, 39));
+                    }
+                }
+                Log.Instance.WriteLogAdd("RFID逻辑块==》重新写入RFID命令已下发:" + "读取imcs_redis数据_" + JsonConvert.SerializeObject(imcsRfid) + ",读取RFID数据_" + readResult.ToString(), LOG_TITLE_CALLBACK);
+
+                plcS7.ConnectClose();
+                rfid.success = false;
+                rfid.msg = task.Id + "重新写入RFID命令已下发";
+                return rfid;
+
+            }
+            else if (plcRead == "5")
+            { // 重新写入rfid成功,读写模式归零
+                plcS7.Write("DB2.12", Convert.ToInt16("0"));
+                plcS7.ConnectClose();
+
+                Log.Instance.WriteLogAdd("RFID逻辑块==》校验重新写入的RFID校验正确:" , LOG_TITLE_CALLBACK);
+
+                rfid.success = true;
+                rfid.msg = task.Id + "校验重新写入的RFID校验正确";
+                return rfid;
+            }
+            else {
+
+                Log.Instance.WriteLogAdd("RFID逻辑块==》RFID比对状态匹配失败,查询不出任务状态:"+ plcRead, LOG_TITLE_CALLBACK);
+
+                plcS7.ConnectClose();
+                rfid.success = false;
+                rfid.msg = "RFID比对状态匹配失败,任务状态为:"+ plcRead;
+                return rfid;
+            }
+        }
         /// <summary>
         /// 取和放回调任务
         /// </summary> 
@@ -394,111 +548,12 @@ namespace IMCS.CCS.Service.Impl
                         return "当前操作模式非自动并运行";
                     }
 
-                    // start---------------RFID
-
-                    //获取imcs存储的托盘编码和零件编码
-                    string imcsRFID=_redisService.Database.StringGetAsync(RFID + task.TaskNodeId).Result;
-                    
-                    var rfidFlag = await _redisService.Database.StringGetAsync(RFID + RedisKeyEnum.Flag);
-                    Boolean flag = true;
-                    if (rfidFlag.HasValue)
-                    {
-                        flag = (Boolean)rfidFlag;
+                    // RFID ============= 比对开始
+                    Rfid aa = await this.CheckRFid(task);
+                    if (aa.success == false) { 
+                        return aa.msg;
                     }
-
-                    
-                    if (flag && imcsRFID!=null)
-                    {
-                        var taskId = await _redisService.Database.StringGetAsync(RFID + task.Id);
-                        if (taskId.HasValue)
-                        {
-                            return task.Id + ":已经执行过了";
-                        }
-                        else
-                        {
-                            await _redisService.Database.StringSetAsync(RFID + task.Id, task.TaskNodeId);
-                        }
-
-
-                        SiemensS7Net plcS7 = DevicePlcS7.SiemensS7(task.IP);
-                        HslCommunication.OperateResult plcConnectionResult = plcS7.ConnectServer();
-                        if (plcConnectionResult.IsSuccess)
-                        {
-                            //获取任务执行结果 2表示取完成,开始下发读指令
-                            string plcResult = plcS7.ReadInt16("DB1.16").Content.ToString();
-
-                            //读 源位置 是上下料站还是机床
-                            string up = plcS7.ReadInt16("DB1.12").Content.ToString();
-                            if (plcResult == "2")//取完成
-                            {
-                                //只要是取完成,先下发读指令
-                                //下发读指令
-                                plcS7.Write("DB2.12", Convert.ToInt16("1"));
-
-                                Thread.Sleep(200);
-
-                                //读取RFID的托盘编码
-                                string readResult = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.20", 39).Content);
-
-                                //读取RFID的零件编码
-                                //string readResult = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.62", 39).Content);
-
-
-                                //比较托盘编码是否一致
-                                //读取redis数据
-                                string[] strings = imcsRFID.Replace("\"", "").Split("&");
-                                Rfid imcsRfid = new Rfid();
-                                imcsRfid.trayNo = strings[0];
-                                imcsRfid.trayNo = strings[1];
-
-                                if(imcsRfid.trayNo != readResult)
-                                {
-                                    Log.Instance.WriteLogAdd("RFID校验托盘失败:" + "读取imcs_redis数据_"+JsonConvert.SerializeObject(imcsRfid)+",读取RFID数据_"+ readResult.ToString(), LOG_TITLE_CALLBACK);
-                                    return task.Id + ":RFID托盘校验失败,imcs和RFID托盘信息不一致";
-                                }
-
-                                //TODO 如果想比零件是否一致,只需要在imcs redis uniqueCode有值并且 RDFID的零件编码也有值时对比以下
-
-
-
-                                //下发写指令
-                                plcS7.Write("DB2.12", Convert.ToInt16("2"));
-                                Thread.Sleep(200);
-
-                                //如果是上下料站,往RFID中写state(1毛坯)和PID(零件编码)
-                                if (sList.Contains(up))
-                                {
-                                    if(imcsRfid.uniqueCode == null)
-                                    {
-                                        plcS7.Write("DB2.55", Convert.ToInt16("0"));
-                                        plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString("", 39));
-                                    }
-                                    else
-                                    {
-                                        plcS7.Write("DB2.55", Convert.ToInt16("1"));
-                                        plcS7.Write("DB2.56", ToolUtils.ReturnBtyesWtitString(imcsRfid.uniqueCode, 39));
-                                        
-                                    }  
-                                }
-
-                                //如果是机床,往RFID中写state(2 成品)和PID(零件编码)
-
-                                if (jList.Contains(up))
-                                {
-                                    plcS7.Write("DB2.55", Convert.ToInt16("2"));
-                                }
-                                plcS7.ConnectClose();
-                            }
-                            else
-                            {
-                                return task.Id + ":未取完成";
-                            }
-                        }
-                        
-                    }
-
-                    // end---------------RFID
-
+                    // RFID ============= 比对结束
 
                     CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
 
@@ -515,6 +570,7 @@ namespace IMCS.CCS.Service.Impl
                             s7.Write("DB2.6", Convert.ToInt16("0"));
                             s7.Write("DB2.8", Convert.ToInt16("0"));
                             s7.Write("DB2.10", Convert.ToInt16("0"));
+                            s7.Write("DB2.12", Convert.ToInt16("0"));
                         }
                         else
                         {