浏览代码

更新合并CCS业务代码

oyq28 2 年之前
父节点
当前提交
e758fb5382

+ 10 - 0
IMCS_CCS/Entitys/CallBackThreeCoordinatesRequestData.cs

@@ -33,5 +33,15 @@ namespace IMCS.CCS.Entitys
         /// 结果
         /// </summary>
         public string result { get; set; }
+
+        /// <summary>
+        /// 程序名
+        /// </summary>
+        public string workProgramName { get; set; }
+
+        /// <summary>
+        /// 工序编号
+        /// </summary>
+        public string procedureNo { get; set; }
     }
 }

+ 1 - 1
IMCS_CCS/Entitys/EquipmentMonitor.cs

@@ -13,7 +13,7 @@ namespace IMCS.CCS.Entitys
         [Key]
         [Column("id")]
         [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
-        public int Id { get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// ip

+ 28 - 0
IMCS_CCS/Entitys/RequestData.cs

@@ -120,4 +120,32 @@ namespace IMCS.CCS.Models
         public T data { get; set; }
     }
 
+    public class ProductionStatus
+    {
+        public string id { get; set; }
+        /// <summary>
+        /// 设备状态
+        /// </summary>
+        public string onlineStatus { get; set; }
+        /// <summary>
+        /// 设备警报
+        /// </summary>
+        public string alertMsg { get; set; } = "";
+
+    }
+
+    public class RequestSynStatusData
+    {
+        public int code { get; set; } = 0;
+        /// <summary>
+        /// 设备状态
+        /// </summary>
+        public string msg { get; set; } = "";
+        /// <summary>
+        /// 设备警报
+        /// </summary>
+        public string productionStatus { get; set; } = "";
+
+    }
+
 }

+ 4 - 0
IMCS_CCS/Model/vo/ResponseDigitalTwinsData.cs

@@ -13,6 +13,10 @@ namespace IMCS.CCS.Models.vo
         /// </summary>
         public string deviceType { get; set; }
 
+        /// <summary>
+        /// 设备资源Id
+        /// </summary>
+        public string resourceId { get; set; }
         /// <summary>
         /// 设备名称
         /// </summary>

+ 6 - 0
IMCS_CCS/Model/vo/ResponseHeidhData.cs

@@ -20,6 +20,12 @@ namespace IMCS_CCS.Model.vo
 
         public DeviceInfoData deviceData
         { get; set; }
+
+        public String toolsInfo { get; set; }
+
+        public String errorsInfo { get; set; }
+
+        public String runDatasInfo { get; set; }
     }
 
     public class DeviceInfoData

+ 1 - 1
IMCS_CCS/Repository/EquipmentMonitorRepository.cs

@@ -27,7 +27,7 @@ namespace IMCS.CCS.Repository
         } 
 
         //查询详情
-        public async Task<EquipmentMonitor> GetById(int id)
+        public async Task<EquipmentMonitor> GetById(long id)
         {
             EquipmentMonitor device = await _context.EquipmentMonitor.FindAsync(id);
             return device;

+ 1 - 1
IMCS_CCS/Repository/IEquipmentMonitorRepository.cs

@@ -9,7 +9,7 @@ namespace IMCS.CCS.Repository
     {
         Task<List<EquipmentMonitor>> GetList();
         //查询详情
-        Task<EquipmentMonitor> GetById(int id);
+        Task<EquipmentMonitor> GetById(long id);
 
         //添加
         Task<bool> Create(EquipmentMonitor device);

+ 1 - 1
IMCS_CCS/Service/IEquipmentMonitorService.cs

@@ -11,7 +11,7 @@ namespace IMCS.CCS.Services
         Task<List<EquipmentMonitor>> GetList();
           
         //查询详情
-        Task<EquipmentMonitor> GetById(int id);
+        Task<EquipmentMonitor> GetById(long id);
 
         //添加
         Task<bool> Create(EquipmentMonitor vo);

+ 1 - 1
IMCS_CCS/Service/Impl/EquipmentMonitorService .cs

@@ -19,7 +19,7 @@ namespace IMCS.CCS.Services
             return await _repository.GetList();
         }
         //查询详情
-        public async Task<EquipmentMonitor> GetById(int id)
+        public async Task<EquipmentMonitor> GetById(long id)
         {
             return await _repository.GetById(id);
         }

+ 64 - 19
IMCS_CCS/Service/Impl/HttpRequestService.cs

@@ -34,6 +34,8 @@ namespace IMCS.CCS.Services
 
         private readonly ICcsActionAddressService _ccsActionAddressService;
 
+        private readonly ITaskJobService _taskJobService;
+
         private int SLEEP_TIME = 1000;
 
         string LocalPath = "D:\\PROG";
@@ -50,6 +52,8 @@ namespace IMCS.CCS.Services
 
         private string ftpPwdContext;
 
+        private string ecsRootUrlContext;
+
         public IConfiguration Configuration { get; }
 
         private readonly IApiRequestService _apiRequestService;
@@ -57,7 +61,7 @@ namespace IMCS.CCS.Services
         public HttpRequestService(IDeviceService deviceService, ITaskCallbackService taskCallbackService,
                                   ICcsActionService ccsActionService, ICcsTagValueService ccsTagValueService,
                                   IEquipmentMonitorService equipmentMonitorService, ICcsActionAddressService ccsActionAddressService,
-                                  IApiRequestService apiRequestService,
+                                  IApiRequestService apiRequestService, ITaskJobService taskJobService,
                                   IConfiguration configuration)
         {
             _deviceService = deviceService;
@@ -67,6 +71,7 @@ namespace IMCS.CCS.Services
             _equipmentMonitorService = equipmentMonitorService;
             _ccsActionAddressService = ccsActionAddressService;
             _apiRequestService = apiRequestService;
+            _taskJobService = taskJobService;
             Configuration = configuration;
             fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
             opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
@@ -74,6 +79,7 @@ namespace IMCS.CCS.Services
             ftpUrlContext = Configuration.GetConnectionString("FTPServer");
             ftpUserContext = Configuration.GetConnectionString("FTPUser");
             ftpPwdContext = Configuration.GetConnectionString("FTPPwd");
+            ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
         }
 
         /// <summary>
@@ -99,27 +105,52 @@ namespace IMCS.CCS.Services
         /// </summary> 
         public async Task<List<ResponseDigitalTwinsData>> GetDigitalTwins()
         {
+            List<Device> devices = _deviceService.GetDeviceList();            
             List<ResponseDigitalTwinsData> list = new List<ResponseDigitalTwinsData>();
 
-            List<EquipmentMonitor> equipmentMonitors = await _equipmentMonitorService.GetList();
-            foreach (EquipmentMonitor equipment in equipmentMonitors)
+            String query3dUrl = ecsRootUrlContext + "api/authority/agv/agvCallbackService/query3dResouceDataInfo";
+            var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, query3dUrl, new Object(), null);
+            ResponsePageData<ResponseDigitalTwinsData> responseData = JsonConvert.DeserializeObject<ResponsePageData<ResponseDigitalTwinsData>>(result.Message);
+            list = responseData.Data;
+            foreach(ResponseDigitalTwinsData responseDigitalTwinsData in list)
             {
-                ResponseDigitalTwinsData digitalTwinsData = new ResponseDigitalTwinsData();
-                digitalTwinsData.id = equipment.Id.ToString();
-                digitalTwinsData.deviceType = equipment.Type;
-                digitalTwinsData.deviceName = equipment.Name;
-                digitalTwinsData.monitoringStatus = equipment.Status;
-                digitalTwinsData.operationName = "工序名称";
-                digitalTwinsData.orderName = "100001";
-                digitalTwinsData.orderNumber = "100002";
-                digitalTwinsData.productName = "100003";
-                digitalTwinsData.productNumber = "100004";
-                digitalTwinsData.feedRate = "50";
-                digitalTwinsData.spindleLoad = "100";
-                digitalTwinsData.spindleMagnification = "80";
-                digitalTwinsData.spindleSpeed = "40";
-                list.Add(digitalTwinsData);
+                EquipmentMonitor equipmentMonitor = await _equipmentMonitorService.GetById(long.Parse(responseDigitalTwinsData.resourceId));
+                Device device = devices.Where(x => x.Ip.Equals(equipmentMonitor.IP)).FirstOrDefault();
+                if (null!=device && equipmentMonitor.Type == "HEIDEHAIN")
+                {
+                    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);
+                    if (Result.IsSuccess)
+                    {
+                        ResponseHeidhData retData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
+                        if (!string.IsNullOrEmpty(retData.runDatasInfo.Trim()))
+                        {                            
+                            ResponseDigitalTwinsData twinsData = JsonConvert.DeserializeObject<ResponseDigitalTwinsData>(retData.runDatasInfo);
+                            responseDigitalTwinsData.feedRate = twinsData.feedRate;
+                            responseDigitalTwinsData.spindleMagnification = twinsData.spindleMagnification;
+                        }                        
+                    }
+                }
+                else if(null != device && equipmentMonitor.Type == "FANUC")
+                {
+                    string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
+                    //调用发那科接口
+                    var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=All", null, null);
+
+                    if (Result.IsSuccess)
+                    {
+                        ResponseFanucData responseFanucData = JsonConvert.DeserializeObject<ResponseFanucData>(Result.Message);
+                        responseDigitalTwinsData.feedRate = responseFanucData.ActFeed;
+                        responseDigitalTwinsData.spindleMagnification = responseFanucData.ActSpindle;
+                        //responseDigitalTwinsData.spindleSpeed = responseFanucData.
+                        //responseDigitalTwinsData.spindleLoad = responseFanucData.
+                    }
+                }
             }
+
             return list;
 
         }
@@ -2005,7 +2036,21 @@ namespace IMCS.CCS.Services
 
                 if (Result.IsSuccess)
                 {
-                    list = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message);
+                    ResponseFanucData responseFanucData = JsonConvert.DeserializeObject<ResponseFanucData>(Result.Message);
+                    //list = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message.ToolLife);
+                    list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseFanucData.ToolLife);
+                }
+            }else if(device.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
+            {
+                RequestHeidhData hdhReq = new RequestHeidhData();
+                hdhReq.ServerUrl = device.ServerUrl;
+                hdhReq.MachineName = device.UserName;
+                hdhReq.Type = "ToolList";
+                var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);                
+                if (Result.IsSuccess)
+                {
+                    ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
+                    list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseData.toolsInfo);
                 }
             }
 

+ 116 - 9
IMCS_CCS/Service/Impl/TaskJobService.cs

@@ -16,6 +16,8 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
+using IMCS.CCS.Models;
+
 
 namespace IMCS.CCS.Service.Impl
 {
@@ -36,16 +38,22 @@ namespace IMCS.CCS.Service.Impl
 
         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<String, int> syncStatusMap = new Dictionary<String, int>();
+
         private string LOG_TITLE_OPCUA = "OPCUA采集";
 
         private string LOG_TITLE_S7 = "S7采集";
@@ -67,6 +75,7 @@ namespace IMCS.CCS.Service.Impl
                               IApiRequestService apiRequestService,
                               ICcsTagValueService ccsTagValueService,
                               IEquipmentMonitorService equipmentMonitorService,
+                              IDictionaryService  dictionaryService,
                               ICcsActionAddressService ccsActionAddressService,
                               IConfiguration configuration)
         {
@@ -76,12 +85,20 @@ namespace IMCS.CCS.Service.Impl
             _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);
         }
 
         /// <summary>
@@ -1158,8 +1175,19 @@ namespace IMCS.CCS.Service.Impl
                                     {
                                         var operateResult = s7.ReadString(actionAddress.Address);
                                         requestData.workId = operateResult.ToString();
-                                    } 
-                                }
+                                    }
+                                    else if (actionAddress.Value == "procedureNo")
+                                    {
+                                        var operateResult = s7.ReadString(actionAddress.Address);
+                                        requestData.procedureNo = operateResult.ToString();
+                                     }
+                                    else if (actionAddress.Value == "workProgramName")
+                                    {
+                                         var operateResult = s7.ReadString(actionAddress.Address);
+                                        requestData.workProgramName = operateResult.ToString();
+
+                                    }
+                            }
                             }
 
 
@@ -1305,14 +1333,14 @@ namespace IMCS.CCS.Service.Impl
                     }
                     else if (equipment.Name == "机械手")
                         {
-                            CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address)).FirstOrDefault();
-                            if (ccsTagValue != null)
+                            CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address)).FirstOrDefault();                            
+                        if (ccsTagValue != null)
                             {
                                 if (ccsTagValue.TagValue == "3")
                                 {
                                     if (equipment.Status != "报警")
-                                    {
-                                        equipment.Status = "报警";
+                                    {                                       
+                                        equipment.Status = "报警";                                        
                                         changeEquipmentMonitors.Add(equipment);
                                     }
                                     
@@ -1359,14 +1387,93 @@ namespace IMCS.CCS.Service.Impl
                     
                 }
                 //变化的修改 并且更新缓存
-                if(changeEquipmentMonitors != null)
+                if(changeEquipmentMonitors.Count > 0)
                 {
-                    foreach (EquipmentMonitor equipment in changeEquipmentMonitors)
+                    List<ProductionStatus> productionStatusList = new List<ProductionStatus>();
+                    foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors)
                     {
-                        await _equipmentMonitorService.Update(equipment);
+                        ProductionStatus productionStatus = new ProductionStatus();
+                        productionStatus.id = changeEquipment.Id.ToString();
+                        productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString();
+                        //equipment.Status == "离线" ? "0" : "1";
+                        //productionStatus.alertMsg = equipment.AlertMsg;
+                        if (productionStatus.onlineStatus !="3" && !string.IsNullOrEmpty(changeEquipment.Type))
+                        {
+                            if(changeEquipment.Type == "HEIDEHAIN")
+                            {
+                                RequestHeidhData hdhReq = new RequestHeidhData();                                
+                                Device device = devices.Where(x => x.Ip.Equals(changeEquipment.IP)).FirstOrDefault();
+                                hdhReq.ServerUrl = device.ServerUrl;
+                                hdhReq.MachineName = device.UserName;
+                                hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString();
+                                var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
+                                if (Result.IsSuccess)
+                                {
+                                    ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
+                                    if (!string.IsNullOrEmpty(responseData.errorsInfo))
+                                    {
+                                        productionStatus.alertMsg = responseData.errorsInfo;
+                                    }
+                                }
+                            }
+                            else if(changeEquipment.Type == "FANUC")
+                            {                                
+                                Device device = devices.Where(x => x.Ip.Equals(changeEquipment.IP)).FirstOrDefault();
+                                string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
+                                //调用发那科接口
+                                var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null);
+                                if (Result.IsSuccess)
+                                {
+                                    ResponseFanucData fncReq = new ResponseFanucData();
+                                    fncReq = JsonConvert.DeserializeObject<ResponseFanucData>(Result.Message);
+                                    List<AlmInfo> AlmMsg = fncReq.AlmMsg;
+                                    if (AlmMsg!=null && AlmMsg.Count>0)
+                                    {
+                                        var msgs = from o in AlmMsg select o.msg;
+                                        productionStatus.alertMsg = string.Join(",", msgs.ToArray());                                        
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            //获取机械手报警信息
+                            CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip.Equals(changeEquipment.IP) && x.Address.Equals("DB200.34")).FirstOrDefault();
+                            ToolDto ccsDictionary = new ToolDto();
+                            ccsDictionary.Type = "PlcWarnInfo";
+                            ccsDictionary.state = true;
+                            ccsDictionary.Code = plcWarnValue.TagValue;
+
+                            List<ToolDto> dictList = await _dictionaryService.GetList(ccsDictionary);
+                            if (dictList.Count > 0 && dictList[0]!=null)
+                            {
+                                if (!string.IsNullOrEmpty(dictList[0].DictValue))
+                                {
+                                    productionStatus.alertMsg = dictList[0].DictValue.Trim();
+                                }
+                            }
+                        }
+                        productionStatusList.Add(productionStatus);
+                        await _equipmentMonitorService.Update(changeEquipment);
                     }
                     await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(equipmentMonitors));
 
+                    
+                    //主动推送同步状态数据接口
+                    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<ResponseECSCallbackData>(result.Message);
+                    if(responseECSCallback!=null && responseECSCallback.code == 0)
+                    {
+                        Log.Instance.WriteLogAdd("同步设备状态成功", LOG_TITLE_CALLBACK);
+                    }
+                    else
+                    {
+                        Log.Instance.WriteLogAdd("同步设备状态操作失败:" + responseECSCallback.msg, LOG_TITLE_CALLBACK);
+                    } 
                 }
                 return message;
             }