|
@@ -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
|
|
|
{
|