瀏覽代碼

fix:增加天轨机器人执行业务

wang.sq@aliyun.com 5 月之前
父節點
當前提交
4882a96664

+ 12 - 1
IMCS_CCS/Controllers/CcsController.cs

@@ -69,7 +69,18 @@ namespace IMCS.CCS.Controllers
         public async Task<ActionResult<ResponseECSData>> RobotAction(RequestData<LocationData> data)
         {
             return await _httpRequestService.RobotAction(data);
-        } 
+        }
+
+        /// <summary>
+        /// 刀具机器人取放动作: POST: api/CutterRobotAction
+        /// </summary> 
+        /// <returns></returns>
+        [Route("api/CutterRobotAction")]
+        [HttpPost]
+        public async Task<ActionResult<ResponseECSData>> CutterRobotAction(RequestData<LocationData> data)
+        {
+            return await _httpRequestService.CutterRobotAction(data);
+        }
 
         /// <summary>
         /// 上传文件: POST: api/UploadFile

+ 10 - 0
IMCS_CCS/Controllers/JobTasksController.cs

@@ -99,6 +99,16 @@ namespace IMCS.CCS.Controllers
             return await _taskJobService.CallbackJob7();
         }
 
+        /// <summary>
+        /// 刀具回调
+        /// </summary> 
+        /// <returns></returns>
+        [HttpPost("CallbackJob8")]
+        public async Task<string> CallbackJob8()
+        {
+            return await _taskJobService.CallbackJob8();
+        }
+
         /// <summary>
         /// 采集数据OPCUA
         /// </summary> 

+ 3 - 1
IMCS_CCS/Entitys/CcsAction.cs

@@ -44,7 +44,9 @@ namespace IMCS.CCS.Entitys
     public enum ActionTypeEnum
     {
         [EnumDescription("机器人动作")]
-        RobotAction, 
+        RobotAction,
+        [EnumDescription("刀具机器人动作")]
+        CutterRobotAction,
         [EnumDescription("上传文件")]
         UploadFile,
         [EnumDescription("启动机床程序")]

+ 0 - 8
IMCS_CCS/Entitys/RequestData.cs

@@ -9,10 +9,6 @@ namespace IMCS.CCS.Models
 {
     public class LocationData   
     {
-        /// <summary>
-        /// 取料设备区域
-        /// </summary>
-        public string LocationArea { get; set; }
         /// <summary>
         /// 原库位
         /// </summary>
@@ -23,10 +19,6 @@ namespace IMCS.CCS.Models
         /// </summary>
         public string LocationDevice { get; set; }
 
-        /// <summary>
-        /// 放目标区域
-        /// </summary>
-        public string DestLocationArea { get; set; }
         /// <summary>
         /// 目的库位
         /// </summary>

+ 2 - 1
IMCS_CCS/Entitys/TaskCallback.cs

@@ -95,8 +95,9 @@ namespace IMCS.CCS.Entitys
 
         [Column("description")]
         public string Description { get; set; }
+        
+
 
-       
         public TaskCallback(string IP, string OperateType, string OperateName, string TaskId, string TaskNodeId)
         {
             this.TaskNodeId = TaskNodeId;

+ 34 - 10
IMCS_CCS/IMCS.CCS.xml

@@ -223,6 +223,12 @@
             </summary> 
             <returns></returns>
         </member>
+        <member name="M:IMCS.CCS.Controllers.CcsController.CutterRobotAction(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.LocationData})">
+            <summary>
+            刀具机器人取放动作: POST: api/CutterRobotAction
+            </summary> 
+            <returns></returns>
+        </member>
         <member name="M:IMCS.CCS.Controllers.CcsController.UploadFile(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.UploadFileData})">
             <summary>
             上传文件: POST: api/UploadFile
@@ -393,6 +399,12 @@
             </summary> 
             <returns></returns>
         </member>
+        <member name="M:IMCS.CCS.Controllers.JobTasksController.CallbackJob8">
+            <summary>
+            刀具回调
+            </summary> 
+            <returns></returns>
+        </member>
         <member name="M:IMCS.CCS.Controllers.JobTasksController.DataCollectOPCUAJob">
             <summary>
             采集数据OPCUA
@@ -782,11 +794,6 @@
             性别 
             </summary>
         </member>
-        <member name="P:IMCS.CCS.Models.LocationData.LocationArea">
-            <summary>
-            取料设备区域
-            </summary>
-        </member>
         <member name="P:IMCS.CCS.Models.LocationData.Location">
             <summary>
             原库位
@@ -797,11 +804,6 @@
             取料设备编码
             </summary>
         </member>
-        <member name="P:IMCS.CCS.Models.LocationData.DestLocationArea">
-            <summary>
-            放目标区域
-            </summary>
-        </member>
         <member name="P:IMCS.CCS.Models.LocationData.DestLocation">
             <summary>
             目的库位
@@ -1570,6 +1572,12 @@
             <param name="strData"></param>
             <returns></returns>
         </member>
+        <member name="M:IMCS.CCS.Service.Impl.TaskJobService.CallbackJob8">
+            <summary>
+            柔性产线,伺服等取和放回调任务
+            </summary> 
+            <returns></returns>
+        </member>
         <member name="T:IMCS.CCS.Service.Impl.TaskService">
             <summary>
             任务服务
@@ -1726,6 +1734,12 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="M:IMCS.CCS.Service.ITaskJobService.CallbackJob8">
+            <summary>
+            刀具伺服机回调
+            </summary>
+            <returns></returns>
+        </member>
         <member name="M:IMCS.CCS.Service.ITaskJobService.DataCollectOPCUAJob">
             <summary>
             OPCUA采集
@@ -1845,6 +1859,11 @@
             机器人动作取放
             </summary> 
         </member>
+        <member name="M:IMCS.CCS.Services.IHttpRequestService.CutterRobotAction(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.LocationData})">
+            <summary>
+            机器人动作取放
+            </summary> 
+        </member>
         <member name="M:IMCS.CCS.Services.IHttpRequestService.UploadFile(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.UploadFileData})">
             <summary>
             上传文件
@@ -1925,6 +1944,11 @@
             机器人取放动作
             </summary> 
         </member>
+        <member name="M:IMCS.CCS.Services.HttpRequestService.CutterRobotAction(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.LocationData})">
+            <summary>
+            机器人取放动作
+            </summary> 
+        </member>
         <member name="M:IMCS.CCS.Services.HttpRequestService.UploadFile(IMCS.CCS.Models.RequestData{IMCS.CCS.Models.UploadFileData})">
             <summary>
             上传文件

+ 5 - 0
IMCS_CCS/Service/IHttpRequestService .cs

@@ -33,6 +33,11 @@ namespace IMCS.CCS.Services
         /// </summary> 
         Task<ResponseECSData> RobotAction(RequestData<LocationData> req);
 
+        /// <summary>
+        /// 机器人动作取放
+        /// </summary> 
+        Task<ResponseECSData> CutterRobotAction(RequestData<LocationData> req);
+
 
         /// <summary>
         /// 上传文件

+ 6 - 0
IMCS_CCS/Service/ITaskJobService.cs

@@ -54,6 +54,12 @@ namespace IMCS.CCS.Service
         /// <returns></returns>
         Task<string> CallbackJob7();
 
+        /// <summary>
+        /// 刀具伺服机回调
+        /// </summary>
+        /// <returns></returns>
+        Task<string> CallbackJob8();
+
         /// <summary>
         /// OPCUA采集
         /// </summary>

+ 229 - 14
IMCS_CCS/Service/Impl/HttpRequestService.cs

@@ -62,6 +62,12 @@ namespace IMCS.CCS.Services
 
         private readonly IApiRequestService _apiRequestService;
 
+        // 装载站
+        private static Dictionary<string, string> shangLiaoQaingQiu = new Dictionary<string, string>();
+        private static Dictionary<string, string> xiaLiaoQaingQiu = new Dictionary<string, string>();
+        private static Dictionary<string, string> shangLiaoZhuangTai = new Dictionary<string, string>();
+        private static Dictionary<string, string> xiaLiaoZhuangTai = new Dictionary<string, string>();
+
         public HttpRequestService(IDeviceService deviceService, ITaskCallbackService taskCallbackService,
                                   ICcsActionService ccsActionService, ICcsTagValueService ccsTagValueService,
                                   IEquipmentMonitorService equipmentMonitorService, ICcsActionAddressService ccsActionAddressService,
@@ -82,6 +88,25 @@ namespace IMCS.CCS.Services
             opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
             hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext"); 
             ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
+
+            if (shangLiaoQaingQiu.Count == 0) {
+                shangLiaoQaingQiu.Add("LAUP000101", "DB1001.782.1");
+                shangLiaoQaingQiu.Add("LAUP000102", "DB1001.782.2");
+            }
+            if (xiaLiaoQaingQiu.Count == 0) {
+                xiaLiaoQaingQiu.Add("LAUP000101", "DB1001.780.1");
+                xiaLiaoQaingQiu.Add("LAUP000102", "DB1001.780.2");
+            }
+            if (shangLiaoZhuangTai.Count == 0) {
+                shangLiaoZhuangTai.Add("LAUP000101", "DB1000.294.1");
+                shangLiaoZhuangTai.Add("LAUP000102", "DB1000.294.2");
+            }
+            if (xiaLiaoZhuangTai.Count == 0) {
+                xiaLiaoZhuangTai.Add("LAUP000101", "DB1000.296.1");
+                xiaLiaoZhuangTai.Add("LAUP000102", "DB1000.296.2");
+            }
+
+
         }
 
         /// <summary>
@@ -265,16 +290,20 @@ namespace IMCS.CCS.Services
                 // 是提示状态不对,否则写下料请求状态
 
                 // 上料料请求
-                if (req.data.DestLocation == "LAUP000102")
-                {
-                    string shangliaoqingqiu = s7.ReadBool("DB1001.782.2").Content.ToString();
-                    string xialiaoqingqiu = s7.ReadBool("DB1001.780.2").Content.ToString();
-                    string shangliaoyunxu = s7.ReadBool("DB1000.294.2").Content.ToString();
-                    string xialiaoyunxu = s7.ReadBool("DB1000.296.2").Content.ToString();
+                if (shangLiaoQaingQiu.ContainsKey(req.data.DestLocation)) {
+                    string shangliaoqingqiuDB = shangLiaoQaingQiu[req.data.DestLocation];
+                    string xialiaoqingqiuDB = xiaLiaoQaingQiu[req.data.DestLocation];
+                    string shangliaoyunxuDB = shangLiaoZhuangTai[req.data.DestLocation];
+                    string xialiaoyunxuDB = xiaLiaoZhuangTai[req.data.DestLocation];
+
+                    string shangliaoqingqiu = s7.ReadBool(shangliaoqingqiuDB).Content.ToString();
+                    string xialiaoqingqiu = s7.ReadBool(xialiaoqingqiuDB).Content.ToString();
+                    string shangliaoyunxu = s7.ReadBool(shangliaoyunxuDB).Content.ToString();
+                    string xialiaoyunxu = s7.ReadBool(xialiaoyunxuDB).Content.ToString();
 
                     if (shangliaoqingqiu == "False" && xialiaoqingqiu == "False")
                     {
-                        s7.Write("DB1001.782.2", true);
+                        s7.Write(shangliaoqingqiuDB, true);
                         s7.ConnectClose();
                         Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "====已发送上料请求,等待上料允许====" + JsonConvert.SerializeObject(req),
                         EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
@@ -304,16 +333,22 @@ namespace IMCS.CCS.Services
                 }
 
                 // 下料允许
-                if (req.data.Location== "LAUP000102" )
+                if (xiaLiaoQaingQiu.ContainsKey(req.data.Location))
                 {
-                    string shangliaoqingqiu = s7.ReadBool("DB1001.782.2").Content.ToString();
-                    string xialiaoqingqiu = s7.ReadBool("DB1001.780.2").Content.ToString();
-                    string shangliaoyunxu = s7.ReadBool("DB1000.294.2").Content.ToString();
-                    string xialiaoyunxu  = s7.ReadBool("DB1000.296.2").Content.ToString();
+
+                    string shangliaoqingqiuDB = shangLiaoQaingQiu[req.data.Location];
+                    string xialiaoqingqiuDB = xiaLiaoQaingQiu[req.data.Location];
+                    string shangliaoyunxuDB = shangLiaoZhuangTai[req.data.Location];
+                    string xialiaoyunxuDB = xiaLiaoZhuangTai[req.data.Location];
+
+                    string shangliaoqingqiu = s7.ReadBool(shangliaoqingqiuDB).Content.ToString();
+                    string xialiaoqingqiu = s7.ReadBool(xialiaoqingqiuDB).Content.ToString();
+                    string shangliaoyunxu = s7.ReadBool(shangliaoyunxuDB).Content.ToString();
+                    string xialiaoyunxu = s7.ReadBool(xialiaoyunxuDB).Content.ToString();
 
                     if (shangliaoqingqiu == "False" && xialiaoqingqiu == "False")
                     {
-                        s7.Write("DB1001.780.2", true);
+                        s7.Write(xialiaoqingqiu, true);
                         s7.ConnectClose();
                         Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "====已发送下料请求,等待下料允许====" + JsonConvert.SerializeObject(req),
                         EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
@@ -431,7 +466,187 @@ namespace IMCS.CCS.Services
                 }
                 return responseData;
             }
-        } 
+        }
+
+
+        /// <summary>
+        /// 机器人取放动作
+        /// </summary> 
+        public async Task<ResponseECSData> CutterRobotAction(RequestData<LocationData> req)
+        {
+            ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId, "执行成功");
+            SiemensS7Net s7 = null;
+            try
+            {
+
+                // 获取所有在线的设备
+                List<Device> devices = _deviceService.GetDeviceList();
+
+                // 比较在线设备是否在其中
+                Device device = devices.Where(x => x.Ip == req.url && x.Port == req.port).FirstOrDefault();
+
+                if (device == null)
+                {
+                    Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "设备已离线===>>" + JsonConvert.SerializeObject(req),
+                    EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                    responseData.result = "false";
+                    responseData.resultMsg = "设备已离线:" + req.url;
+                    return responseData;
+                }
+
+                // 根据ip查询设备
+                CcsAction actionQuery = new CcsAction();
+                actionQuery.OperateType = ActionTypeEnum.CutterRobotAction.ToString();
+                actionQuery.Ip = req.url;
+                CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
+
+                // 进行plc的连接
+                s7 = DevicePlcS7.SiemensS7(actionInfo.Ip);
+                OperateResult ConnectionResult = s7.ConnectServer();
+                if (!ConnectionResult.IsSuccess)
+                {
+                    s7.ConnectClose();
+                    Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
+                    EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                    responseData.result = "false";
+                    responseData.resultMsg = ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req);
+                    return responseData;
+                }
+
+                // 检查出发地,目的地比对数据开始====
+                if (req.data.LocationDevice != null)
+                {  // 判断取料设备是否满足条件
+                    CcsActionDeviceSourceCheck ccsActionDeviceSourceCheck = new CcsActionDeviceSourceCheck();
+                    ccsActionDeviceSourceCheck.Type = CcsActionDeviceSourceCheckTypeEnum.CHECK.ToString();
+                    ccsActionDeviceSourceCheck.ActionId = actionInfo.Id;
+                    ccsActionDeviceSourceCheck.DeviceCode = req.data.LocationDevice;
+                    ccsActionDeviceSourceCheck.DeviceSource = "out";
+                    ResponseECSCallbackData callbackData = _ccsActionDeviceSourceCheckService.checkDataAddress(ccsActionDeviceSourceCheck, s7);
+
+                    if (!callbackData.isSuccess)
+                    {
+                        s7.ConnectClose();
+                        Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "====" + callbackData.msg + "====" + JsonConvert.SerializeObject(req),
+                        EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                        responseData.result = "false";
+                        responseData.resultMsg = callbackData.msg;
+                        return responseData;
+                    }
+                }
+
+                if (req.data.DestLocationDevice != null)
+                {
+                    CcsActionDeviceSourceCheck ccsActionDeviceSourceCheck = new CcsActionDeviceSourceCheck();
+                    ccsActionDeviceSourceCheck.Type = CcsActionDeviceSourceCheckTypeEnum.CHECK.ToString();
+                    ccsActionDeviceSourceCheck.ActionId = actionInfo.Id;
+                    ccsActionDeviceSourceCheck.DeviceCode = req.data.DestLocationDevice;
+                    ccsActionDeviceSourceCheck.DeviceSource = "in";
+                    ResponseECSCallbackData callbackData = _ccsActionDeviceSourceCheckService.checkDataAddress(ccsActionDeviceSourceCheck, s7);
+
+                    if (!callbackData.isSuccess)
+                    {
+                        s7.ConnectClose();
+                        Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "====" + callbackData.msg + "====" + JsonConvert.SerializeObject(req),
+                        EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                        responseData.result = "false";
+                        responseData.resultMsg = callbackData.msg;
+                        return responseData;
+                    }
+                }
+                // 检查出发地,目的地比对数据结束===
+
+                // 查询需要操作的plc的db块
+                CcsActionAddress actionAddressQuery = new CcsActionAddress();
+                actionAddressQuery.ActionId = actionInfo.Id;
+                List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
+
+                //查询出需要检查的地址列表
+                List<CcsActionAddress> CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
+                foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
+                {
+                    if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
+                    {
+                        string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
+                        if (actionAddress.CheckType ? operateResult != actionAddress.Value : operateResult == actionAddress.Value)
+                        {
+                            s7.ConnectClose();
+                            Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "====实际为:" + operateResult + JsonConvert.SerializeObject(req),
+                            EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                            responseData.result = "false";
+                            responseData.resultMsg = "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "==实际为:" + operateResult;
+                            return responseData;
+                        }
+                    }
+                }
+
+                //查询需要写入地址列表
+                List<CcsActionAddress> CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList();
+                foreach (CcsActionAddress actionAddress in CcsActionAddressWrites)
+                {
+                    if (!string.IsNullOrEmpty(actionAddress.Address))
+                    {
+                        string parValue = "";
+                        // 写入取放点位、需要进行点位拼接
+                        if (actionAddress.Sort == 1)
+                        {
+                            //区域块为七位,点位为三位
+                            //parValue = req.data.LocationArea.PadRight(7,'0')+ req.data.Location.PadLeft(3, '0') + req.data.DestLocationArea.PadRight(7, '0') + req.data.DestLocation.PadLeft(3, '0');
+                            parValue = req.data.Location + req.data.DestLocation;
+                            s7.Write(actionAddress.Address, Convert.ToString(parValue));
+                        }
+                        else if (actionAddress.Sort == 2)
+                        {
+                            // 需要写入启动状态
+                            parValue = actionAddress.Value;
+                            s7.Write(actionAddress.Address, Convert.ToBoolean(parValue));
+                        }
+
+                        // 同步TagValue数据状态
+                        CcsTagValue tagValueQuery = new CcsTagValue();
+                        tagValueQuery.Ip = req.url;
+                        tagValueQuery.Address = actionAddress.Address;
+                        CcsTagValue tagValue = _ccsTagValueService.GetList(tagValueQuery).ToList().FirstOrDefault();
+                        if (tagValue != null)
+                        {
+                            tagValue.TagValue = parValue;
+                            await _ccsTagValueService.Update(tagValue);
+                        }
+
+
+                        Thread.Sleep(SLEEP_TIME);
+                    }
+                }
+
+                s7.ConnectClose();
+
+                //插入回调
+                TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.RobotAction.ToString(),
+                    EnumHelper.GetDescription(ActionTypeEnum.RobotAction), req.taskId, req.taskNodeId);
+                taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
+
+                // 保存数据
+                await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
+                Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.RobotAction) + "取成功===>>" + JsonConvert.SerializeObject(req)
+                   , EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                return responseData;
+            }
+            catch (Exception ex)
+            {
+                // 记录日志
+                Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
+                    EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
+                responseData.resultMsg = ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
+                responseData.result = "false";
+
+                // 关闭plc连接
+                if (s7 != null)
+                {
+                    s7.ConnectClose();
+                }
+                return responseData;
+            }
+        }
+
 
         /// <summary>
         /// 上传文件

+ 184 - 0
IMCS_CCS/Service/Impl/TaskJobService.cs

@@ -473,12 +473,16 @@ namespace IMCS.CCS.Service.Impl
                     {
                         task.State = false;
                         task.UpdateTime = DateTime.Now;
+                        task.Description = result.Message;
                         await _taskCallbackService.CreateOrUpdateAndCache(task);
                         message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
                         Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                     }
                     else
                     {
+                        task.UpdateTime = DateTime.Now;
+                        task.Description = result.Message;
+                        await _taskCallbackService.CreateOrUpdateAndCache(task);
                         message = message + JsonConvert.SerializeObject(task) + ",上传请求失败! WebApi 返回结果" + ";";
                         Log.Instance.WriteLogAdd("上传回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                     }
@@ -550,6 +554,7 @@ namespace IMCS.CCS.Service.Impl
                             //请求成功,任务状态改成结束
                             task.State = false;
                             task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
                             await _taskCallbackService.CreateOrUpdateAndCache(task);
                             message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
                             Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
@@ -569,6 +574,9 @@ namespace IMCS.CCS.Service.Impl
                             }
                             else
                             {
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
                                 message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
                                 Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                             }
@@ -619,12 +627,16 @@ namespace IMCS.CCS.Service.Impl
                             {
                                 task.State = false;
                                 task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
                                 await _taskCallbackService.CreateOrUpdateAndCache(task);
                                 message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",回调失败结果:" + result.Message + ";";
                                 Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                             }
                             else
                             {
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
                                 message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
                                 Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
                             }
@@ -823,12 +835,16 @@ namespace IMCS.CCS.Service.Impl
                         {
                             task.State = false;
                             task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
                             await _taskCallbackService.CreateOrUpdateAndCache(task);
                             message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
                             Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                         }
                         else
                         {
+                            task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
+                            await _taskCallbackService.CreateOrUpdateAndCache(task);
                             message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
                             Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                         }
@@ -878,12 +894,16 @@ namespace IMCS.CCS.Service.Impl
                             {
                                 task.State = false;
                                 task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
                                 await _taskCallbackService.CreateOrUpdateAndCache(task);
                                 message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
                                 Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                             }
                             else
                             {
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
                                 message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
                                 Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                             }
@@ -1075,12 +1095,16 @@ namespace IMCS.CCS.Service.Impl
                         {
                             task.State = false;
                             task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
                             await _taskCallbackService.CreateOrUpdateAndCache(task);
                             message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
                             Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                         }
                         else
                         {
+                            task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
+                            await _taskCallbackService.CreateOrUpdateAndCache(task);
                             message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
                             Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                         }
@@ -1713,12 +1737,16 @@ namespace IMCS.CCS.Service.Impl
                     {
                         task.State = false;
                         task.UpdateTime = DateTime.Now;
+                        task.Description = result.Message;
                         await _taskCallbackService.CreateOrUpdateAndCache(task);
                         message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
                         Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
                     }
                     else
                     {
+                        task.UpdateTime = DateTime.Now;
+                        task.Description = result.Message;
+                        await _taskCallbackService.CreateOrUpdateAndCache(task);
                         message = message + JsonConvert.SerializeObject(task) + ",坐标系偏差值请求失败! WebApi 返回结果" + ";";
                         Log.Instance.WriteLogAdd("坐标系偏差值回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
                     }
@@ -1735,5 +1763,161 @@ namespace IMCS.CCS.Service.Impl
 
 
         }
+
+        /// <summary>
+        /// 柔性产线,伺服等取和放回调任务
+        /// </summary> 
+        /// <returns></returns>
+        public async Task<string> CallbackJob8()
+        {
+            List<TaskCallback> taskList = new List<TaskCallback>();
+            var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
+            // 判断redis是否有数据,没有则查询表中是否有没有完成任务
+            if (taskCallbackListData.IsNullOrEmpty)
+            {
+                taskList = await _taskCallbackService.GetAllList();
+            }
+            else
+            {
+                taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
+            }
+            //在线设备 
+            List<Device> deviceList = await getDeviceList();
+
+            taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.CutterRobotAction.ToString())).ToList();
+            taskList = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).ToList();
+            //TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault() ; 
+            if (taskList == null || taskList.Count == 0)
+            {
+                return "无回调任务";
+            }
+            string message = "";
+            try
+            {
+                foreach (TaskCallback task in taskList)
+                {
+                    CcsTagValue tagValueQuery = new CcsTagValue();
+                    tagValueQuery.Ip = task.IP;
+
+                    // 查询出采集的数据
+                    List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
+                    CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
+
+                    // ①比较采集的数据值与回调的值是否相等,
+                    // ②并且比较完成的时间与数据创建的时间是否大于10秒,因为机器人运动远大与十秒,小于十秒说明数据采集有问题,
+                    DateTime currentTime = DateTime.Now;
+                    if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue && currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
+                    {
+                        CallBackRequestData requestData = new CallBackRequestData();
+                        requestData.taskId = long.Parse(task.TaskId);
+                        requestData.taskNodeId = long.Parse(task.TaskNodeId);
+
+                        // 调用接口回传给imcs
+                        var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
+                        ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
+                        if (result.IsSuccess && responseECSCallback.code == 0)
+                        {
+                            //请求成功,任务状态改成结束
+                            task.State = false;
+                            task.UpdateTime = DateTime.Now;
+                            task.Description = result.Message;
+                            await _taskCallbackService.CreateOrUpdateAndCache(task);
+                            message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
+                            Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
+                        }
+                        else
+                        {
+                            //ecs返回-5 任务作废
+                            if (result.IsSuccess && responseECSCallback.code == -5)
+                            {
+                                task.State = false;
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = "ecs返回-5,回调任务作废";
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
+                                message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
+                                Log.Instance.WriteLogAdd("回调异常,请求接口失败,ecs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
+
+                            }
+                            else
+                            {
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
+                                message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
+                                Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
+                            }
+
+                        }
+
+                    }
+                    //回调检测到失败,回调通知ecs
+                    if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
+                    {
+                        bool failFalg = false;
+                        if (!string.IsNullOrEmpty(task.FailAddress))
+                        {
+                            List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
+
+                            if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
+                            {
+                                failFalg = true;
+                            }
+                        }
+                        if (!string.IsNullOrEmpty(task.FailAddress2))
+                        {
+                            List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
+
+                            if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
+                            {
+                                failFalg = true;
+                            }
+                        }
+                        if (!string.IsNullOrEmpty(task.FailAddress3))
+                        {
+                            List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
+
+                            if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
+                            {
+                                failFalg = true;
+                            }
+                        }
+                        if (failFalg)
+                        {
+                            CallBackRequestData requestData = new CallBackRequestData();
+                            requestData.taskId = long.Parse(task.TaskId);
+                            requestData.taskNodeId = long.Parse(task.TaskNodeId);
+                            requestData.code = "0";
+                            requestData.msg = "操作失败";
+                            var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
+                            if (result.IsSuccess)
+                            {
+                                task.State = false;
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
+                                message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",回调失败结果:" + result.Message + ";";
+                                Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
+                            }
+                            else
+                            {
+                                task.UpdateTime = DateTime.Now;
+                                task.Description = result.Message;
+                                await _taskCallbackService.CreateOrUpdateAndCache(task);
+                                message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
+                                Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
+                            }
+                        }
+                    }
+                    Thread.Sleep(1000);
+                }
+                return string.IsNullOrEmpty(message) ? "无回调任务" : message;
+            }
+            catch (Exception ex)
+            {
+                Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
+                return "回调异常" + ex.Message;
+            }
+        }
+
     }
 }