using HslCommunication; using HslCommunication.Profinet.Siemens; using IMCS.CCS.Common.Redis; using IMCS.CCS.DeviceProtocol; using IMCS.CCS.Entitys; using IMCS.CCS.Models.vo; using IMCS.CCS.Services; using IMCS_CCS.Model.vo; using IMCS_CCS.Utils; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using S7.Net; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using IMCS.CCS.Models; using System.Net.NetworkInformation; using IMCS_CCS.Model; using MySqlX.XDevAPI.Common; using Microsoft.AspNetCore.Mvc; using Org.BouncyCastle.Ocsp; using System.Text; using IMCS.CCS.Entitys.Dto; using System.IO.Pipelines; using Microsoft.IdentityModel.Tokens; using StackExchange.Redis; namespace IMCS.CCS.Service.Impl { /// /// 任务调度服务 /// public class TaskJobService : ITaskJobService { private readonly IRedisService _redisService; private readonly IDeviceService _deviceService; private readonly IApiRequestService _apiRequestService; private readonly ITaskCallbackService _taskCallbackService; private readonly ICcsTagValueService _ccsTagValueService; private readonly IEquipmentMonitorService _equipmentMonitorService; private readonly IDictionaryService _dictionaryService; private readonly ICcsActionAddressService _ccsActionAddressService; private string ecsUrlContext; private string ecsRootUrlContext; private string fanucUrlContext; private string opcuacUrlContext; private string hdhUrlContext; private Dictionary syncStatusMap = new Dictionary(); private Dictionary jcAddressDict = new Dictionary(); private Dictionary jcIpDict = new Dictionary(); private string LOG_TITLE_OPCUA = "OPCUA采集"; private string LOG_TITLE_FUNC = "发那科采集"; private string LOG_TITLE_HEIDEHAIN = "海德汉采集"; private string LOG_TITLE_S7 = "S7采集"; private string LOG_TITLE_CALLBACK = "回调任务"; private string LOG_TITLE_DEVICE = "设备监控"; private string LOG_HEART_PLC = "PLC心跳"; private string PLC_ALARM_INFO = "PLC有异常"; private string imcs_redis_key = "IMCS_CCS:"; private string RFID = "RFID:"; private string LOG_RESOURCE_STATE = "设备状态"; private static List sList = new List(); private static List jList = new List(); public IConfiguration Configuration { get; } public TaskJobService(IRedisService redisService, ITaskCallbackService taskCallbackService, IDeviceService deviceService, IApiRequestService apiRequestService, ICcsTagValueService ccsTagValueService, IEquipmentMonitorService equipmentMonitorService, IDictionaryService dictionaryService, ICcsActionAddressService ccsActionAddressService, IConfiguration configuration) { _redisService = redisService; _taskCallbackService = taskCallbackService; _deviceService = deviceService; _apiRequestService = apiRequestService; _ccsTagValueService = ccsTagValueService; _equipmentMonitorService = equipmentMonitorService; _dictionaryService = dictionaryService; _ccsActionAddressService = ccsActionAddressService; Configuration = configuration; ecsUrlContext = Configuration.GetConnectionString("ecsUrlContext"); fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext"); opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext"); hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext"); ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext"); syncStatusMap.Add("离线", 0); syncStatusMap.Add("空闲", 1); syncStatusMap.Add("生产中", 2); syncStatusMap.Add("报警", 3); //在线状态默认传参后台空闲状态 syncStatusMap.Add("在线", 1); syncStatusMap.Add("掉线", -1); if(sList.Count == 0) { sList.Add("201"); sList.Add("202"); } if (jList.Count == 0) { jList.Add("1"); jList.Add("2"); jList.Add("3"); } } /// /// 采集数据S7 /// /// public async Task DataCollectS7Job() { try { List deviceList = await getDeviceList(); deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()) && x.State).ToList(); foreach (Device device in deviceList) { List tagValues = new List(); string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType; var data = await _redisService.Database.StringGetAsync(redis_key); if (data.IsNullOrEmpty) { CcsTagValue tagQuery = new CcsTagValue(); tagQuery.ProtocolType = device.ProtocolType; tagQuery.Ip = device.Ip; tagValues = _ccsTagValueService.GetList(tagQuery); //首次设置redis if (tagValues != null && tagValues.Count > 0) { await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues)); } } else { tagValues = JsonConvert.DeserializeObject>(data); } if (tagValues != null && tagValues.Count > 0) { tagValues = JsonConvert.DeserializeObject>(data); List changTagValues = new List(); //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString()); SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.ServerUrl); OperateResult ConnectionResult = s7.ConnectServer(); if (!ConnectionResult.IsSuccess) { device.State = false; await _deviceService.UpdateDevice(device); s7.ConnectClose(); Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>"+ device.ServerUrl, LOG_TITLE_S7); return "采集失败,plc连不上"; } else { foreach (CcsTagValue tagValueData in tagValues) { string operateResult = ""; if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString())) { operateResult = s7.ReadBool(tagValueData.Address).Content.ToString(); } else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString())) { operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString(); } else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString())) { operateResult = s7.ReadString(tagValueData.Address).Content.ToString(); } else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Array.ToString())) { operateResult = ToolUtils.ReturnStringByBytes(s7.Read(tagValueData.Address,2048).Content); } if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult) { if(tagValueData.Address == "DB1.20") { continue; } tagValueData.TagValue = operateResult.ToString(); tagValueData.UpdateTime = DateTime.Now; changTagValues.Add(tagValueData); Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7); //有变化更新数据库 await _ccsTagValueService.Update(tagValueData); } Thread.Sleep(50); } s7.ConnectClose(); //值有变化,重新设置一次redis if (changTagValues != null && changTagValues.Count > 0) { await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues)); } //存储采集数据 CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_S7); } } } return "S7采集成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7); return "S7采集失败"; } } /// /// 采集数据HEIDEHAIN /// /// public async Task DataCollectHeidehainJob() { try { List deviceList = await getDeviceList(); deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString()) && x.State).ToList(); foreach (Device device in deviceList) { RequestHeidhData hdhReq = new RequestHeidhData(); hdhReq.ServerUrl = device.ServerUrl; hdhReq.MachineName = device.UserName; hdhReq.Type = "Collect"; //调用海德汉采集接口 var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null); { string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType; //采集数据放入缓存 await _redisService.Database.StringSetAsync(redis_key, Result.Message); //存储采集数据 CollectDataLog.Instance.WriteLogAdd(Result.Message, LOG_TITLE_HEIDEHAIN); } } return "HEIDEHAIN采集成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("HEIDEHAIN采集异常===>>" + ex.Message, LOG_TITLE_S7); return "HEIDEHAIN采集失败"; } } /// /// 上传程序回调任务 /// /// public async Task CallbackJob1() { List list = new List(); var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList); if (taskCallbackListData.IsNullOrEmpty) { list = await _taskCallbackService.GetAllList(); } else { list = JsonConvert.DeserializeObject>(taskCallbackListData); } TaskCallback task = list.Where(x => x.OperateType.Equals(ActionTypeEnum.UploadFile.ToString())).FirstOrDefault(); if (task == null) { return "无回调任务"; } string message = ""; try { DateTime currentTime = DateTime.Now; if (currentTime.Subtract(task.CreateTime).TotalSeconds > 5) { CallBackRequestData requestData = new CallBackRequestData(); requestData.taskId = long.Parse(task.TaskId); requestData.taskNodeId = long.Parse(task.TaskNodeId); var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";"; Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK); } } return string.IsNullOrEmpty(message) ? "无回调任务" : message; } catch (Exception ex) { Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK); return "回调异常" + ex.Message; } } // rfid校验,true为通过,false为回滚 private async Task 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; } 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(); Console.WriteLine("====================================状态 DB1.18:" + plcRead); // 判断读写状态,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]; //读取PLC中的RFID的托盘编码 string readResult = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.20", 39).Content).Replace(" ",""); Console.WriteLine("====================================数据 DB1.20:" + readResult); if (imcsRfid.trayNo != readResult) { //TODO 可能要往PLC中写入一个值,表示校验错误 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(readResult1)); 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") { await _redisService.Database.StringSetAsync(RFID + task.TaskId + task.TaskNodeId, "2"); // 二次下发读的命令 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 { Log.Instance.WriteLogAdd("RFID逻辑块==》RFID比对状态匹配失败,查询不出任务状态:"+ plcRead, LOG_TITLE_CALLBACK); plcS7.ConnectClose(); rfid.success = false; rfid.msg = "RFID比对状态匹配失败,任务状态为:"+ plcRead; return rfid; } } /// /// 取和放回调任务 /// /// public async Task CallbackJob2() { try { Console.WriteLine("取和放回调任务开始:" + DateTime.Now.ToString()); List taskList = new List(); var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList); if (taskCallbackListData.IsNullOrEmpty) { taskList = await _taskCallbackService.GetAllList(); } else { taskList = JsonConvert.DeserializeObject>(taskCallbackListData); } //在线设备 List deviceList = await getDeviceList(); taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.RobotAction.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 = ""; foreach(TaskCallback task in taskList) { CcsTagValue tagValueQuery = new CcsTagValue(); tagValueQuery.Ip = task.IP; //tagValueQuery.Address = task.Address; List tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList(); //系统操作模式 CcsTagValue tagValueMode = tagValues.Where(o => o.Address == "DB1.2").FirstOrDefault(); if (tagValueMode.TagValue != "257") { return "当前操作模式非自动并运行"; } // RFID ============= 比对开始 /* string rfidFlag = _redisService.Database.StringGetAsync(RFID+ task.TaskId + task.TaskNodeId).Result; if (rfidFlag.IsNullOrEmpty()) { Rfid aa = await this.CheckRFid(task); if (aa.success == false) { return aa.msg; } } else if (rfidFlag == "2") { // 获取读写状态 SiemensS7Net plcS7 = DevicePlcS7.SiemensS7(task.IP); string plcRead = plcS7.ReadInt16("DB1.18").Content.ToString(); Console.WriteLine("====================================第二次状态 DB1.18:" + plcRead); if (plcRead == "3") { //下发归零任务 await _redisService.Database.StringSetAsync(RFID + task.TaskId + task.TaskNodeId, "3"); string readResult = ToolUtils.ReturnStringByBytes(plcS7.Read("DB1.20", 39).Content).Replace(" ", ""); Console.WriteLine("====================================第二次读完成写的数据:" + readResult); plcS7.Write("DB2.12", Convert.ToInt16("0")); plcS7.ConnectClose(); } else { // 二次下发读的命令 Log.Instance.WriteLogAdd("等待二次读命令完成RFID读命令已下发:" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK); plcS7.ConnectClose(); return "等待二次读命令完成RFID读命令已下发"; } }*/ // RFID ============= 比对结束 CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault(); if ((callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue) ) { // 任务执行完毕,删除临时存储的缓存数据 Console.WriteLine("任务执行完成,删除临时校验的缓存数据,任务状态"+task.CallbackValue+"==taskID:"+ task.TaskId+"==taskNodeID:"+ task.TaskNodeId); await _redisService.Database.KeyDeleteAsync(RFID + task.TaskId + task.TaskNodeId); //执行位清零 SiemensS7Net s7 = DevicePlcS7.SiemensS7(task.IP); HslCommunication.OperateResult ConnectionResult = s7.ConnectServer(); if (ConnectionResult.IsSuccess) { Log.Instance.WriteLogAdd("任务【" + task.TaskNodeId + "】回调清零,plc点位:" + task.Address + "值:" + callBacktagValue.TagValue, LOG_TITLE_CALLBACK); s7.Write("DB2.2", Convert.ToInt16("0")); s7.Write("DB2.4", Convert.ToInt16("0")); 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 { Log.Instance.WriteLogAdd("回调异常,PLC连接不上==>", LOG_TITLE_CALLBACK); return "回调异常,PLC连接不上==>"; } s7.ConnectClose(); task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); CallBackRequestData requestData = new CallBackRequestData(); requestData.taskId = long.Parse(task.TaskId); requestData.taskNodeId = long.Parse(task.TaskNodeId); var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; 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 { 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 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 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 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; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { 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; } } /// /// 读写回调任务 /// /// public async Task CallbackJob3() { try { List taskList = new List(); var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList); if (taskCallbackListData.IsNullOrEmpty) { taskList = await _taskCallbackService.GetAllList(); } else { taskList = JsonConvert.DeserializeObject>(taskCallbackListData); } List deviceList = await getDeviceList(); //在线设备 taskList = taskList.Where(x => (x.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString()) || x.OperateType.Equals(ActionTypeEnum.WriteRFID.ToString())) && x.State).ToList(); TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault(); if (task == null) { return "无回调任务"; } string message = ""; DateTime currentTime = DateTime.Now; CcsTagValue tagValueQuery = new CcsTagValue(); tagValueQuery.Ip = task.IP; List tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList(); CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault(); if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue ) { CcsTagValue callBacktagValue2 = null; if (task.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString())){ callBacktagValue2 = tagValues.Where(o => o.Address == task.Address2).FirstOrDefault(); } CallBackRequestData requestData = new CallBackRequestData(); requestData.taskId = long.Parse(task.TaskId); requestData.taskNodeId = long.Parse(task.TaskNodeId); //读RFID的值返回ecs if (callBacktagValue2 != null) { requestData.content = callBacktagValue2.TagValue; } var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";"; Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), 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 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 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 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); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";"; Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK); } } } return string.IsNullOrEmpty(message) ? "无回调任务" : message; } catch (Exception ex) { Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK); return "回调异常" + ex.Message; } } /// /// 启动机床程序回调任务 /// /// public async Task CallbackJob4() { try { List taskList = new List(); var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList); if (taskCallbackListData.IsNullOrEmpty) { taskList = await _taskCallbackService.GetAllList(); } else { taskList = JsonConvert.DeserializeObject>(taskCallbackListData); } List deviceList = await getDeviceList(); //在线设备 taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList(); if (taskList == null || taskList.Count == 0) { return "无回调任务"; } string message = ""; DateTime currentTime = DateTime.Now; foreach (TaskCallback task in taskList) { CcsTagValue tagValueQuery = new CcsTagValue(); //tagValueQuery.Ip = task.IP; //tagValueQuery.Address = task.Address; List tagValues = _ccsTagValueService.GetList(tagValueQuery); //系统操作模式 CcsTagValue tagValueMode = tagValues.Where(o => o.Address == "DB1.2").FirstOrDefault(); if (tagValueMode.TagValue != "257") { return "当前操作模式非自动并运行"; } CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address.Trim()).FirstOrDefault(); if (tagValue != null && tagValue.TagValue == task.CallbackValue ) { CallBackRequestData requestData = new CallBackRequestData(); requestData.taskId = long.Parse(task.TaskId); requestData.taskNodeId = long.Parse(task.TaskNodeId); var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { 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 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 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 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); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";"; Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), 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; } } /// /// 启动清洗机回调任务 /// /// public async Task CallbackJob5() { try { List taskList = new List(); var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList); if (taskCallbackListData.IsNullOrEmpty) { taskList = await _taskCallbackService.GetAllList(); } else { taskList = JsonConvert.DeserializeObject>(taskCallbackListData); } List deviceList = await getDeviceList(); //在线设备 taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCleanMachine.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList(); // TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault(); if (taskList == null || taskList.Count == 0) { return "无回调任务"; } string message = ""; DateTime currentTime = DateTime.Now; foreach (TaskCallback task in taskList) { CcsTagValue tagValueQuery = new CcsTagValue(); //tagValueQuery.Ip = task.IP; tagValueQuery.Address = task.Address; List tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList(); CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault(); if (tagValue != null && tagValue.TagValue == task.CallbackValue) //临时处理以解决ecs配置问题 //if(currentTime.Subtract(task.CreateTime).TotalSeconds > 10) { SiemensS7Net s7 = DevicePlcS7.SiemensS7("10.161.30.248"); HslCommunication.OperateResult ConnectionResult = s7.ConnectServer(); if (!ConnectionResult.IsSuccess) { s7.ConnectClose(); Log.Instance.WriteLogAdd("回调异常,PLC连接不上", LOG_TITLE_CALLBACK); return "PLC连接不上"; } //清除配方内容和配方编号 CcsActionAddress actionAddressQuery = new CcsActionAddress(); actionAddressQuery.ActionId = 7; List CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery); //查询写入地址列表 List CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList(); foreach (CcsActionAddress actionAddress in CcsActionAddressWrites) { if (!string.IsNullOrEmpty(actionAddress.Address)) { if (actionAddress.dataType == "bytes") { s7.Write(actionAddress.Address, ToolUtils.ReturnBtyesWtitString("", 64)); } else if (actionAddress.dataType == "int") { s7.Write(actionAddress.Address, Convert.ToInt16("0")); } } } Log.Instance.WriteLogAdd("任务【" + task.TaskNodeId + "】喷墨回调清零", LOG_TITLE_CALLBACK); CallBackRequestData requestData = new CallBackRequestData(); requestData.taskId = long.Parse(task.TaskId); requestData.taskNodeId = long.Parse(task.TaskNodeId); var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { 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 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 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 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); ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (result.IsSuccess && responseECSCallback.code == 0) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.CreateOrUpdateAndCache(task); message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";"; Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK); } else { message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";"; Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), 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; } } /// /// 监控设备状态 /// /// public async Task MonitorEquipmentStatusJob() { try { string message = "MonitorEquipmentStatusJob调度成功"; //查询全部使用设备包括不在线和离线 string all_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLDeviceList ; List devices = new List(); var deviceListData = await _redisService.Database.StringGetAsync(all_device_redis_key); if (deviceListData.IsNullOrEmpty) { devices = _deviceService.GetDevices(); await _redisService.Database.StringSetAsync(all_device_redis_key, JsonConvert.SerializeObject(devices)); } else { devices = JsonConvert.DeserializeObject>(deviceListData); } List equipmentMonitors = new List(); string equipment_monitors_redis_key = imcs_redis_key + RedisKeyEnum.MonitorEquipmentStatusJob; var data = await _redisService.Database.StringGetAsync(equipment_monitors_redis_key); if (data.IsNullOrEmpty) { equipmentMonitors = await _equipmentMonitorService.GetList(); //首次设置redis if (equipmentMonitors != null && equipmentMonitors.Count > 0) { await _redisService.Database.StringSetAsync(equipment_monitors_redis_key, JsonConvert.SerializeObject(equipmentMonitors)); } } else { equipmentMonitors = JsonConvert.DeserializeObject>(data); } //变化的设备 List changeEquipmentMonitors = new List(); foreach (EquipmentMonitor equipment in equipmentMonitors) { Device device = devices.Where(x => x.Ip == equipment.IP).FirstOrDefault(); //缓存取PLC tagvalue 值 List tagValues = new List(); if(device == null) { continue; } string tag_value_redis_key = imcs_redis_key + device.Ip + ":" + device.ProtocolType; var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key); if (tagData.IsNullOrEmpty) { CcsTagValue tagQuery = new CcsTagValue(); tagQuery.ProtocolType = device.ProtocolType; tagQuery.Ip = device.Ip; tagValues = _ccsTagValueService.GetList(tagQuery); //首次设置redis if (tagValues != null && tagValues.Count > 0) { await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues)); } } else { tagValues = JsonConvert.DeserializeObject>(tagData); } CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault(); if (device != null && !device.UseState) { if (equipment.Status != "离线") { equipment.Status = "离线"; changeEquipmentMonitors.Add(equipment); } continue; } else if(device != null && !device.State) { if (equipment.Status != "掉线") { equipment.Status = "掉线"; changeEquipmentMonitors.Add(equipment); } continue; } else if (device != null && device.State && device.UseState && (equipment.Type == "HEIDEHAIN" || equipment.Type == "FANUC")) { //通过数组获取机床对应的PLC ip地址 string plcIp = jcIpDict[device.Ip]; string ktRedisKey = imcs_redis_key + plcIp + ":" + ProtocalTypeEnum.S7_1500; string plcAddress = jcAddressDict[device.Ip]; var ktTagData = await _redisService.Database.StringGetAsync(ktRedisKey); List ktTagValues = new List(); if (ktTagData.IsNullOrEmpty) { CcsTagValue tagQuery = new CcsTagValue(); tagQuery.ProtocolType = ProtocalTypeEnum.S7_1500.ToString(); tagQuery.Ip = plcIp; ktTagValues = _ccsTagValueService.GetList(tagQuery); //首次设置redis if (ktTagValues != null && ktTagValues.Count > 0) { await _redisService.Database.StringSetAsync(ktRedisKey, JsonConvert.SerializeObject(ktTagValues)); } } else { ktTagValues = JsonConvert.DeserializeObject>(ktTagData); } CcsTagValue ktTagValue = ktTagValues.Where(x => x.Ip.Trim() == plcIp && x.Address.Trim() == plcAddress).FirstOrDefault(); if(ktTagValue != null) { if (ktTagValue.TagValue == "1") { if (equipment.Status != "生产中") { equipment.Status = "生产中"; changeEquipmentMonitors.Add(equipment); } continue; } if (ktTagValue.TagValue == "2") { if (equipment.Status != "空闲") { equipment.Status = "空闲"; changeEquipmentMonitors.Add(equipment); } continue; } } } else if (device != null && (equipment.Name == "机械手" || equipment.Name == "保障中心_伺服舵机")) { ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault(); if (ccsTagValue != null) { if (ccsTagValue.TagValue == "3") { if (equipment.Status != "报警") { equipment.Status = "报警"; changeEquipmentMonitors.Add(equipment); } continue; } } CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address2).FirstOrDefault(); if (ccsTagValue2 != null) { if (ccsTagValue2.TagValue == "9") { if (equipment.Status != "报警") { equipment.Status = "报警"; changeEquipmentMonitors.Add(equipment); } continue; } } if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8") { if (equipment.Status != "空闲") { equipment.Status = "空闲"; changeEquipmentMonitors.Add(equipment); } continue; } if (equipment.Status != "生产中") { equipment.Status = "生产中"; changeEquipmentMonitors.Add(equipment); } } else { if (equipment.Status != "在线") { equipment.Status = "在线"; changeEquipmentMonitors.Add(equipment); } } } //初始化推送列表 List productionStatusList = new List(); //变化的修改 并且更新缓存 if (changeEquipmentMonitors.Count > 0) { foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors) { ProductionStatus productionStatus = new ProductionStatus(); productionStatus.id = changeEquipment.Id.ToString(); productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString(); productionStatusList.Add(productionStatus); } //修改并重置缓存 await _equipmentMonitorService.UpdateAndCache(equipmentMonitors); } //在线设备,报警放入推送数组 List onlineDeviceList = await getDeviceList(); foreach (Device onlineDevice in onlineDeviceList) { EquipmentMonitor alarmEquipment = equipmentMonitors.Where(x => x.IP == onlineDevice.Ip && x.Type == onlineDevice.ProtocolType).FirstOrDefault(); if (alarmEquipment != null && alarmEquipment.Type == "HEIDEHAIN") { Thread.Sleep(1000); RequestHeidhData hdhReq = new RequestHeidhData(); hdhReq.ServerUrl = onlineDevice.ServerUrl; hdhReq.MachineName = onlineDevice.UserName; hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString(); var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null); if (Result.IsSuccess) { ResponseHeidhData responseData = JsonConvert.DeserializeObject(Result.Message); if (!string.IsNullOrEmpty(responseData.errorsInfo) && !Result.Message.Contains("无报警")) { ProductionStatus productionStatus = new ProductionStatus(); productionStatus.id = alarmEquipment.Id.ToString(); productionStatus.ip = onlineDevice.Ip; productionStatus.alertMsg = responseData.errorsInfo; productionStatus.alarmState = true;//报警 productionStatus.onlineStatus = "1"; productionStatusList.Add(productionStatus); } } } else if (alarmEquipment != null && alarmEquipment.Type == "FANUC") { Thread.Sleep(1000); string Url = fanucUrlContext + "?ip=" + onlineDevice.Ip + "&port=" + onlineDevice.Port; //调用发那科接口 var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null); if (Result.IsSuccess) { //ResponseFanucData fncReq = new ResponseFanucData(); List AlmMsg = JsonConvert.DeserializeObject>(Result.Message); //List AlmMsg = fncReq.AlmMsg; if (AlmMsg != null && AlmMsg.Count > 0) { var msgs = from o in AlmMsg select o.msg; if(msgs != null && !Result.Message.Contains("无报警")) { ProductionStatus productionStatus = new ProductionStatus(); productionStatus.id = alarmEquipment.Id.ToString(); productionStatus.ip = onlineDevice.Ip; productionStatus.alertMsg = string.Join(",", msgs.ToArray()); productionStatus.alarmState = true;//报警 productionStatus.onlineStatus = "1"; productionStatusList.Add(productionStatus); } } } } else if(alarmEquipment != null && onlineDevice.ProtocolType == "S7_1500") { //缓存取PLCagvalue 值 List tagValues = new List(); string tag_value_redis_key = imcs_redis_key + onlineDevice.Ip + ":" + onlineDevice.ProtocolType; var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key); if (tagData.IsNullOrEmpty) { CcsTagValue tagQuery = new CcsTagValue(); tagQuery.ProtocolType = onlineDevice.ProtocolType; tagQuery.Ip = onlineDevice.Ip; tagValues = _ccsTagValueService.GetList(tagQuery); //首次设置redis if (tagValues != null && tagValues.Count > 0) { await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues)); } } else { tagValues = JsonConvert.DeserializeObject>(tagData); } //获取机械手报警信息 CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip == alarmEquipment.IP && x.Address == "DB200.34").FirstOrDefault(); if (plcWarnValue != null && plcWarnValue.TagValue != "0") { //从字典中查询具体描述 List dictList = new List() ; string dict_value_redis_key = imcs_redis_key + RedisKeyEnum.DictKeyList; var dictData = await _redisService.Database.StringGetAsync(dict_value_redis_key); if (dictData.IsNullOrEmpty) { Dictionary ccsDictionary = new Dictionary(); dictList = await _dictionaryService.GetList(ccsDictionary); //首次设置redis if (dictList != null && dictList.Count > 0) { await _redisService.Database.StringSetAsync(dict_value_redis_key, JsonConvert.SerializeObject(dictList)); } } else { dictList = JsonConvert.DeserializeObject>(dictData); } Dictionary dictObj = dictList.Where(x => x.Type == onlineDevice.Ip && x.Code.ToString() == plcWarnValue.TagValue && x.state).FirstOrDefault(); if (null != dictObj && !string.IsNullOrEmpty(dictObj.DictValue.Trim())) { ProductionStatus productionStatus = new ProductionStatus(); productionStatus.id = alarmEquipment.Id.ToString(); productionStatus.ip = onlineDevice.Ip; productionStatus.alertMsg = dictObj.Description.Trim(); productionStatus.onlineStatus = "1"; productionStatus.alarmState = true; //报警 productionStatusList.Add(productionStatus); } } } } //推送 if (productionStatusList != null && productionStatusList.Count > 0) { //主动推送同步状态数据接口 RequestSynStatusData requestData = new RequestSynStatusData(); requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList); String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synProductionStatus"; var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null); //解析回调数据结果 ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (responseECSCallback != null && responseECSCallback.code == 0) { Log.Instance.WriteLogAdd("同步设备状态成功==>" + JsonConvert.SerializeObject(productionStatusList), PLC_ALARM_INFO); } else { Log.Instance.WriteLogAdd("同步设备状态操作失败==>:"+JsonConvert.SerializeObject(productionStatusList) + responseECSCallback.msg, PLC_ALARM_INFO); } } return message; } catch (Exception ex) { Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, PLC_ALARM_INFO); return "MonitorEquipmentStatusJob : " + ex.Message; } } /// /// 监控设备状态 /// /// public async Task DeviceStatusJob() { try { string message = ""; string all_use_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLUseDeviceList ; List devices = new List(); //查询全部使用设备包括在线和不在线 var deviceListData = await _redisService.Database.StringGetAsync(all_use_device_redis_key); if (deviceListData.IsNullOrEmpty) { devices = _deviceService.GetDeviceAllList(); await _redisService.Database.StringSetAsync(all_use_device_redis_key, JsonConvert.SerializeObject(devices)); } else { devices = JsonConvert.DeserializeObject>(deviceListData); } //ftp不监控 devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList(); foreach (Device device in devices) { Ping pingSender = new Ping(); PingReply reply = pingSender.Send(device.Ip); if (reply.Status != IPStatus.Success) { Device oldDevice = await _deviceService.GetDeviceById(device.Id); if (oldDevice != null && oldDevice.State) { device.State = false; device.DisconnectUpdateTime = DateTime.Now; await _deviceService.UpdateAndCache(device); } Log.Instance.WriteLogAdd(device.Ip + ":" + device.ProtocolType + "连接失败,或已离线", LOG_TITLE_DEVICE); message = message + device.Ip + ",连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; continue; } else { Device oldDevice = await _deviceService.GetDeviceById(device.Id); if (oldDevice != null && !oldDevice.State) { oldDevice.State = true; device.DisconnectUpdateTime = DateTime.Now; await _deviceService.UpdateAndCache(oldDevice); } Log.Instance.WriteLogAdd(device.Ip + ":"+ device.ProtocolType + "连接成功", LOG_TITLE_DEVICE); message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; continue; } //Thread.Sleep(50); } return message; } catch (Exception ex) { Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE); return "设备连接异常,或以离线" + ex.Message; } } /// /// 删除redis /// /// public void removeRedis() { List devices = _deviceService.GetDeviceAllList(); _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.ALLUseDeviceList); _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.CallbackTaskList); foreach (Device device in devices) { _redisService.Database.KeyDelete(imcs_redis_key + device.Ip + ":" + device.ProtocolType); } } /// /// fanuc根据类型获取值 /// /// private string GetFanucValue(ResponseFanucData fanucData, string address) { string value = ""; if (address == FanucAddressEnum.MainProg.ToString()) { value = fanucData.MainProg; } else if (address == FanucAddressEnum.Status.ToString()) { value = fanucData.Status; } else if (address == FanucAddressEnum.PowerOnTime.ToString()) { value = fanucData.PowerOnTime; } else if (address == FanucAddressEnum.ActSpindle.ToString()) { value = fanucData.ActSpindle; } return value; } /// /// 数字科学计数法处理 /// /// /// private Decimal ChangeToDecimal(string strData) { Decimal dData = 0.0M; if (strData.Contains("E")) { dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float)); } else { dData = Convert.ToDecimal(strData); } return dData; } /// /// 获取redis 设备在线列表 /// /// /// private async Task> getDeviceList() { List deviceList = new List(); var deviceListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.DeviceList); if (deviceListData.IsNullOrEmpty || deviceListData.Length() == 0) { deviceList = _deviceService.GetDeviceList(); await _redisService.Database.StringSetAsync(imcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList)); } else { deviceList = JsonConvert.DeserializeObject>(deviceListData); } return deviceList; } /// /// 心跳任务 /// public async Task PlcHeartbeatJob() { try { SiemensS7Net s7 = DevicePlcS7.SiemensS7("10.161.30.248"); OperateResult ConnectionResult = s7.ConnectServer(); if (!ConnectionResult.IsSuccess) { s7.ConnectClose(); Log.Instance.WriteLogAdd("S7心跳写入异常,plc连不上==>" + "10.161.30.248", LOG_HEART_PLC); return "心跳写入失败,plc连不上"; } else { string heartAdress = "DB2.0"; string operateResult = s7.ReadInt16(heartAdress).Content.ToString(); if (operateResult == "0") { s7.Write(heartAdress, Convert.ToInt16("1")); } else { s7.Write(heartAdress, Convert.ToInt16("0")); } } s7.ConnectClose(); }catch (Exception ex) { Log.Instance.WriteLogAdd("心跳写入异常" + ex.Message, LOG_HEART_PLC); Console.WriteLine("心跳写入异常"); return "心跳写入异常" + ex.Message; } Console.WriteLine("心跳写入成功"); return "心跳写入成功"; } /// /// 监控设备状态 /// /// public async Task MonitorEquipmentStatusJob2() { try { SiemensS7Net s7 = DevicePlcS7.SiemensS7("10.161.30.248"); OperateResult ConnectionResult = s7.ConnectServer(); if (!ConnectionResult.IsSuccess) { s7.ConnectClose(); Log.Instance.WriteLogAdd("监控设备状态写入异常,plc连不上==>" + "10.161.30.248", LOG_RESOURCE_STATE); return "监控设备状态写入异常,plc连不上"; } List equipmentMonitors = new List(); string equipment_monitors_redis_key = imcs_redis_key + RedisKeyEnum.MonitorEquipmentStatusJob; var data = await _redisService.Database.StringGetAsync(equipment_monitors_redis_key); if (data.IsNullOrEmpty) { equipmentMonitors = await _equipmentMonitorService.GetList(); //首次设置redis if (equipmentMonitors != null && equipmentMonitors.Count > 0) { await _redisService.Database.StringSetAsync(equipment_monitors_redis_key, JsonConvert.SerializeObject(equipmentMonitors)); } } else { equipmentMonitors = JsonConvert.DeserializeObject>(data); } //变化的设备 List changeEquipmentMonitors = new List(); foreach (EquipmentMonitor equipment in equipmentMonitors) { string operateResult = s7.ReadInt16(equipment.Address).Content.ToString(); string state = operateResult == "0" ? "离线" : operateResult == "1" ? "生产中" : "空闲"; if(equipment.Status == null || equipment.Status != state) { equipment.Status = state; changeEquipmentMonitors.Add(equipment); } } //初始化推送列表 List productionStatusList = new List(); //变化的修改 并且更新缓存 if (changeEquipmentMonitors.Count > 0) { foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors) { ProductionStatus productionStatus = new ProductionStatus(); productionStatus.id = changeEquipment.Id.ToString(); productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString(); if (changeEquipment.Description != null) { productionStatus.ip = changeEquipment.IP; } productionStatusList.Add(productionStatus); } //修改并重置缓存 await _equipmentMonitorService.UpdateAndCache(equipmentMonitors); } //推送 if (productionStatusList != null && productionStatusList.Count > 0) { //主动推送同步状态数据接口 RequestSynStatusData requestData = new RequestSynStatusData(); requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList); String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synDeviceStatus"; var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null); //解析回调数据结果 ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject(result.Message); if (responseECSCallback != null && responseECSCallback.code == 0) { Log.Instance.WriteLogAdd("同步设备状态成功==>" + JsonConvert.SerializeObject(productionStatusList), LOG_RESOURCE_STATE); } else { Log.Instance.WriteLogAdd("同步设备状态操作失败==>:" + JsonConvert.SerializeObject(productionStatusList) + responseECSCallback.msg, LOG_RESOURCE_STATE); } } return "监控设备状态成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, LOG_RESOURCE_STATE); return "MonitorEquipmentStatusJob : " + ex.Message; } } /// /// 采集数据S7报警数据 /// /// public async Task> DataCollectS7JobWarn() { var data = await _redisService.Database.StringGetAsync("PLC_COSTOM_ADDRESS"); List returnList=new List(); List dataList = data.ToString().Split(',').ToList(); SiemensS7Net s7 = DevicePlcS7.SiemensS7("10.161.30.248"); OperateResult ConnectionResult = s7.ConnectServer(); if (!ConnectionResult.IsSuccess) { s7.ConnectClose(); Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>10.161.30.248" , LOG_TITLE_S7); return null; } else { foreach(string st in dataList) { string operateResult = s7.ReadBool(st).Content.ToString(); returnList.Add(operateResult); } } s7.ConnectClose(); return returnList; } public async Task remoteRedis() { _redisService.Database.KeyDelete("IMCS_CCS:10.161.30.248:S7_1500"); _redisService.Database.KeyDelete("IMCS_CCS:ALLDeviceList"); _redisService.Database.KeyDelete("IMCS_CCS:ALLUseDeviceList"); _redisService.Database.KeyDelete("IMCS_CCS:DeviceList"); _redisService.Database.KeyDelete("IMCS_CCS:MonitorEquipmentStatusJob"); _redisService.Database.KeyDelete("IMCS_CCS:CallbackTaskList"); return "清除成功"; } } }