using IMCS.CCS.Common.Redis; using IMCS.CCS.DeviceProtocol; using IMCS.CCS.Entitys; using IMCS.CCS.Model.vo; using IMCS.CCS.Services; using IMCS_CCS.Utils; using IMCS_CCS.Utils.DeviceProtocol; 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; 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 string ecsUrlContext; private string LOG_TITLE_OPCUA = "OPCUA采集"; private string LOG_TITLE_S7 = "S7采集"; private string LOG_TITLE_CALLBACK = "回调任务"; private string LOG_TITLE_DEVICE = "设备监控"; public IConfiguration Configuration { get; } public TaskJobService(IRedisService redisService, ITaskCallbackService taskCallbackService, IDeviceService deviceService, IApiRequestService apiRequestService, ICcsTagValueService ccsTagValueService, IConfiguration configuration) { _redisService = redisService; _taskCallbackService = taskCallbackService; _deviceService = deviceService; _apiRequestService = apiRequestService; _ccsTagValueService = ccsTagValueService; Configuration = configuration; ecsUrlContext = Configuration.GetConnectionString("ecsUrlContext"); } /// /// 采集数据OPCUA /// /// public async Task DataCollectOPCUAJob() { try { List deviceList = _deviceService.GetDeviceList(); deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString())).ToList(); foreach (Device device in deviceList) { List tagValues = new List(); string redis_key = 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) { List changTagValues = new List(); DeviceOPCUat deviceOPCUat = new DeviceOPCUat(device.ServerUrl, device.UserName, device.Password); if (!deviceOPCUat.IsConnection) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("OpcUA采集异常,连不上设备", LOG_TITLE_OPCUA); return "采集失败,连不上设备"; } else { List addresses = new List(); foreach (CcsTagValue tagValue in tagValues) { addresses.Add(tagValue.Address); } List values = deviceOPCUat.OpcUa_Read(addresses); for (int i = 0; i < tagValues.Count; i++) { CcsTagValue tagValueData = (CcsTagValue)tagValues[i]; if (!tagValueData.TagValue.Equals(values[i])) { tagValueData.TagValue = values[i]; tagValueData.UpdateTime = DateTime.Now; changTagValues.Add(tagValueData); Log.Instance.WriteLogAdd("OpcUA采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_OPCUA); //有变化更新数据库 await _ccsTagValueService.Update(tagValueData); } } deviceOPCUat.OpcUa_Close(); //值有变化,重新设置一次redis if (changTagValues != null && changTagValues.Count > 0) { await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues)); } } } else { Log.Instance.WriteLogAdd("OpcUA采集异常,没有采集数据===", LOG_TITLE_OPCUA); return "没有采集数据"; } } return "采集成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("OpcUA采集异常===>>" + ex.Message, LOG_TITLE_OPCUA); return "采集失败"; } } /// /// 采集数据S7 /// /// public async Task DataCollectS7Job() { try { List deviceList = _deviceService.GetDeviceList(); deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString())).ToList(); foreach (Device device in deviceList) { List tagValues = new List(); string redis_key = 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()); if (s7.IsConnected != true) { device.State = false; await _deviceService.UpdateDevice(device); s7.Close(); Log.Instance.WriteLogAdd("S7采集异常,plc连不上", LOG_TITLE_S7); return "采集失败,plc连不上"; } else { foreach (CcsTagValue tagValueData in tagValues) { string Address = ToolUtils.AddressConvertDBW(tagValueData.Address); var operateResult = ((ushort)s7.Read(Address)).ConvertToShort(); if (!tagValueData.TagValue.Equals(operateResult)) { 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.Close(); //值有变化,重新设置一次redis if (changTagValues != null && changTagValues.Count > 0) { await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues)); } } } } return "采集成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7); return "采集失败"; } } /// /// 采集数据FANUC /// /// public async Task DataCollectFanucJob() { try { List deviceList = _deviceService.GetDeviceList(); deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.FANUC.ToString())).ToList(); foreach (Device device in deviceList) { List tagValues = new List(); string redis_key = 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(); DeviceFanuc fanuc = new DeviceFanuc(device.Ip, device.Port); if (fanuc.h <= 0) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("FANUC采集异常,FANUC连不上", LOG_TITLE_S7); return "采集失败,FANUC连不上"; } else { foreach (CcsTagValue tagValueData in tagValues) { string operateResult = GetFanucValue(fanuc, tagValueData.TagValue); if (!tagValueData.TagValue.Equals(operateResult)) { tagValueData.TagValue = operateResult.ToString(); tagValueData.UpdateTime = DateTime.Now; changTagValues.Add(tagValueData); Log.Instance.WriteLogAdd("FANUC采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7); //有变化更新数据库 await _ccsTagValueService.Update(tagValueData); } Thread.Sleep(50); } //值有变化,重新设置一次redis if (changTagValues != null && changTagValues.Count > 0) { await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues)); } } } } return "采集成功"; } catch (Exception ex) { Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7); return "采集失败"; } } /// /// 机床启动,上传程序回调任务 /// /// public async Task CallbackJob1() { List list = await _taskCallbackService.GetAllList(); list = list.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString()) || x.OperateType.Equals(ActionTypeEnum.UploadFile.ToString())).ToList(); string message = ""; try { foreach (TaskCallback task in list) { DateTime currentTime = DateTime.Now; if (currentTime.Subtract(task.CreateTime).TotalMinutes > 10) { 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); if (result.IsSuccess) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.Update(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); } } } return string.IsNullOrEmpty(message) ? "无回调任务" : message; } catch (Exception ex) { Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK); return "回调异常" + ex.Message; } } /// /// 柔性产线,伺服回调任务 /// /// public async Task CallbackJob2() { List taskList = await _taskCallbackService.GetAllList(); //在线设备 List deviceList = _deviceService.GetDeviceList(); taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.GetFlexibleWire.ToString()) || x.OperateType.Equals(ActionTypeEnum.SendFlexibleWire.ToString()) || x.OperateType.Equals(ActionTypeEnum.MoveRobotPosition.ToString()) || x.OperateType.Equals(ActionTypeEnum.GetServoStacker.ToString()) || x.OperateType.Equals(ActionTypeEnum.SendServoStacker.ToString())).ToList(); List list = new List(); foreach (Device device in deviceList) { foreach (TaskCallback task in taskList) { if (task.IP.Equals(device.Ip)) { list.Add(task); } } } string message = ""; try { foreach (TaskCallback task in list) { DateTime currentTime = DateTime.Now; CcsTagValue tagValueQuery = new CcsTagValue(); tagValueQuery.Ip = task.IP; tagValueQuery.Address = task.Address; List tagValues = _ccsTagValueService.GetList(tagValueQuery); CcsTagValue tagValue = null; if (tagValues != null && tagValues.Count > 0) { tagValue = tagValues[0]; } else { message = message + JsonConvert.SerializeObject(task) + ",此节点没配置;"; Log.Instance.WriteLogAdd("回调异常,此节点没配置" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK); continue; } if (tagValue.TagValue.Equals(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); if (result.IsSuccess) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.Update(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); } } else if (!string.IsNullOrEmpty(task.CallbackValue2) && tagValue.TagValue.Equals(task.CallbackValue2)) { 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.Update(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); } } else if (!string.IsNullOrEmpty(task.CallbackValue3)) { CcsTagValue tagValueQuery3 = new CcsTagValue(); tagValueQuery.Ip = task.IP; tagValueQuery.Address = task.Address3; List tagValues3 = _ccsTagValueService.GetList(tagValueQuery); if (tagValues3 != null && tagValues3.Count > 0) { CcsTagValue tagValue3 = tagValues3[0]; if (tagValue3.TagValue.Equals(task.CallbackValue3)) { 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.Update(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); } } } } } return string.IsNullOrEmpty(message) ? "无回调任务" : message; } catch (Exception ex) { Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK); return "回调异常" + ex.Message; } } /// /// 打标机回调任务 /// /// public async Task CallbackJob3() { List taskList = await _taskCallbackService.GetAllList(); //在线设备 List deviceList = _deviceService.GetDeviceList(); taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartLabelMachine.ToString())).ToList(); List list = new List(); foreach (Device device in deviceList) { foreach (TaskCallback task in taskList) { if (task.IP.Equals(device.Ip)) { list.Add(task); } } } string message = ""; try { foreach (TaskCallback task in list) { DateTime currentTime = DateTime.Now; CcsTagValue tagValueQuery = new CcsTagValue(); tagValueQuery.Ip = task.IP; tagValueQuery.Address = task.Address; List tagValues = _ccsTagValueService.GetList(tagValueQuery); CcsTagValue tagValueQuery3 = new CcsTagValue(); tagValueQuery3.Ip = task.IP; tagValueQuery3.Address = task.Address3; List tagValues3 = _ccsTagValueService.GetList(tagValueQuery3); CcsTagValue tagValue = null; CcsTagValue tagValue3 = null; if (tagValues != null && tagValues.Count > 0 && tagValues3 != null && tagValues3.Count > 0) { tagValue = tagValues[0]; tagValue3 = tagValues3[0]; } else { message = message + JsonConvert.SerializeObject(task) + ",此节点没配置;"; Log.Instance.WriteLogAdd("回调异常,此节点没配置" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK); continue; } if (tagValue.TagValue.Equals(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); if (result.IsSuccess) { task.State = false; task.UpdateTime = DateTime.Now; await _taskCallbackService.Update(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); } } else if (!string.IsNullOrEmpty(task.CallbackValue2) && tagValue.TagValue.Equals(task.CallbackValue2)) { 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.Update(task); message = 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); } } } return string.IsNullOrEmpty(message) ? "无回调任务" : message; } catch (Exception ex) { Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK); return "回调异常" + ex.Message; } } /// /// 监控设备状态 /// /// public async Task DeviceStatusJob() { try { string message = ""; List devices = _deviceService.GetDeviceAllList(); //ftp不监控 devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList(); foreach (Device device in devices) { if (device.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString())) { try { Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString()); if (s7.IsConnected != true) { device.State = false; await _deviceService.UpdateDevice(device); s7.Close(); Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE); message = message + ",plc连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; continue; } else { device.State = true; await _deviceService.UpdateDevice(device); s7.Close(); Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE); message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; continue; } } catch (Exception s7ex) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE); message = message + ",plc连接失败,plc连不上" + s7ex.Message + ",ip:" + device.Ip + ",协议类型:" + device.ProtocolType; } } else if (device.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString())) { try { DeviceOPCUat deviceOPCUat = new DeviceOPCUat(device.ServerUrl, device.UserName, device.Password); if (!deviceOPCUat.IsConnection) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("OPCUA连接异常,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_OPCUA); message = message + ",OPCUA连接异常,或以离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; ; continue; } else { device.State = true; await _deviceService.UpdateDevice(device); deviceOPCUat.disConnect(); Log.Instance.WriteLogAdd("OPCUA连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_DEVICE); continue; } } catch (Exception opcex) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("OPCUA连接异常,或以离线" + opcex.Message + ",ip:" + device.Ip + ", 协议类型: " + device.ProtocolType, LOG_TITLE_DEVICE); continue; } } else if (device.ProtocolType.Equals(ProtocalTypeEnum.FANUC.ToString())) { try { int ret = Fanuc.cnc_allclibhndl3(device.ServerUrl, Convert.ToUInt16(device.Port), 2, out Fanuc.h); if (ret != Fanuc.EW_OK) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("Fanuc连接异常,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_OPCUA); message = message + ",Fanuc连接异常,或以离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; ; continue; } else { device.State = true; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("Fanuc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_DEVICE); continue; } } catch (Exception opcex) { device.State = false; await _deviceService.UpdateDevice(device); Log.Instance.WriteLogAdd("Fanuc连接异常,或以离线" + opcex.Message + ",ip:" + device.Ip + ", 协议类型: " + device.ProtocolType, LOG_TITLE_DEVICE); continue; } } } return message; } catch (Exception ex) { Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE); return "设备连接异常,或以离线" + ex.Message; } } /// /// fanuc根据类型获取值 /// /// private string GetFanucValue(DeviceFanuc fanuc,string tagValue) { string value = ""; if (tagValue.Equals(FanucAddressEnum.MainProg.ToString())) { value = fanuc.MainProg(); }else if (tagValue.Equals(FanucAddressEnum.Status.ToString())) { value = fanuc.Status(); } else if (tagValue.Equals(FanucAddressEnum.PowerOnTime.ToString())) { value = fanuc.PowerOnTime(); } return value; } } }