using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using IMCS.CCS.Entitys;
using IMCS.CCS.Models.vo;
using IMCS.CCS.Models;
using IMCS.CCS.DeviceProtocol;
using System;
using S7.Net;
using IMCS_CCS.Utils;
using Newtonsoft.Json;
using IMCS_CCS.Utils.DeviceProtocol;
using HslCommunication.Profinet.Siemens;
using Microsoft.Extensions.Configuration;
using IMCS.CCS.Service;
using IMCS_CCS.Model.vo;
using FTP;
using HslCommunication;
using System.Text.RegularExpressions;
using System.IO;
using Org.BouncyCastle.Ocsp;
using MySqlX.XDevAPI.Common;
namespace IMCS.CCS.Services
{
public class HttpRequestService : IHttpRequestService
{
private readonly IDeviceService _deviceService;
private readonly ITaskCallbackService _taskCallbackService;
private readonly ICcsActionService _ccsActionService;
private readonly ICcsTagValueService _ccsTagValueService;
private readonly IEquipmentMonitorService _equipmentMonitorService;
private readonly ICcsActionAddressService _ccsActionAddressService;
private readonly ITaskJobService _taskJobService;
private int SLEEP_TIME = 1000;
string LocalPath = "D:\\PROG";
private string fanucUrlContext;
private string opcuacUrlContext;
private string hdhUrlContext;
private string ecsRootUrlContext;
public IConfiguration Configuration { get; }
private readonly IApiRequestService _apiRequestService;
public HttpRequestService(IDeviceService deviceService, ITaskCallbackService taskCallbackService,
ICcsActionService ccsActionService, ICcsTagValueService ccsTagValueService,
IEquipmentMonitorService equipmentMonitorService, ICcsActionAddressService ccsActionAddressService,
IApiRequestService apiRequestService, ITaskJobService taskJobService,
IConfiguration configuration)
{
_deviceService = deviceService;
_taskCallbackService = taskCallbackService;
_ccsActionService = ccsActionService;
_ccsTagValueService = ccsTagValueService;
_equipmentMonitorService = equipmentMonitorService;
_ccsActionAddressService = ccsActionAddressService;
_apiRequestService = apiRequestService;
_taskJobService = taskJobService;
Configuration = configuration;
fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext");
ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
}
///
/// 获取状态当前值
///
public string GetTagValue(RequestTagValueData req)
{
CcsTagValue queryParam = new CcsTagValue();
queryParam.Ip = req.ip;
queryParam.Address = req.tagname;
List tagValues = _ccsTagValueService.GetList(queryParam);
string tagValue = "0";
if (tagValues != null && tagValues.Count > 0)
{
tagValue = tagValues[0].TagValue;
}
return tagValue;
}
///
/// 益模调用接口,显示3D
///
public async Task> GetDigitalTwins()
{
List devices = _deviceService.GetDeviceList();
List list = new List();
String query3dUrl = ecsRootUrlContext + "/api/authority/agv/agvCallbackService/query3dResouceDataInfo";
var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, query3dUrl, new Object(), null);
ResponsePageData responseData = JsonConvert.DeserializeObject>(result.Message);
list = responseData.Data;
foreach(ResponseDigitalTwinsData responseDigitalTwinsData in list)
{
EquipmentMonitor equipmentMonitor = await _equipmentMonitorService.GetById(long.Parse(responseDigitalTwinsData.resourceId));
if (equipmentMonitor==null || equipmentMonitor.IP == null)
{
continue;
}
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(Result.Message);
if (!string.IsNullOrEmpty(retData.runDatasInfo.Trim()))
{
ResponseDigitalTwinsData twinsData = JsonConvert.DeserializeObject(retData.runDatasInfo);
responseDigitalTwinsData.feedRate = !string.IsNullOrEmpty(twinsData.feedRate)? twinsData.feedRate : "0";
responseDigitalTwinsData.spindleMagnification = !string.IsNullOrEmpty(twinsData.spindleMagnification)? twinsData.spindleMagnification:"0";
responseDigitalTwinsData.spindleSpeed = !string.IsNullOrEmpty(twinsData.spindleSpeed) ? twinsData.spindleSpeed + "00" : "0";
responseDigitalTwinsData.spindleLoad = !string.IsNullOrEmpty(twinsData.spindleLoad) ? 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(Result.Message);
responseDigitalTwinsData.feedRate = !string.IsNullOrEmpty(responseFanucData.ActFeed)? responseFanucData.ActFeed:"0";
responseDigitalTwinsData.spindleMagnification = !string.IsNullOrEmpty(responseFanucData.SpindleMagnification)? responseFanucData.SpindleMagnification:"0";
responseDigitalTwinsData.spindleSpeed = !string.IsNullOrEmpty(responseFanucData.ActSpindle)? responseFanucData.ActSpindle : "0";
responseDigitalTwinsData.spindleLoad = !string.IsNullOrEmpty(responseFanucData.SpindleLoad)? responseFanucData.SpindleLoad : "-";
}
}
}
return list;
}
///
/// 查询设备状态
///
public async Task> GetEquipMent()
{
return await _equipmentMonitorService.GetList();
}
///
/// 机器人取放动作
///
public async Task RobotAction(RequestData req)
{
ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId,"执行成功");
SiemensS7Net s7 = null;
try
{
// 获取所有在线的设备
List devices = _deviceService.GetDeviceList();
// 比较在线设备是否在其中
Device device = devices.Where(x => x.Ip == req.url && x.Port == req.port).FirstOrDefault();
if (device == null)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "设备已离线===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.result = "false";
responseData.resultMsg = "设备已离线:"+ req.url;
return responseData;
}
// 根据ip查询设备
CcsAction actionQuery = new CcsAction();
actionQuery.OperateType = ActionTypeEnum.RobotAction.ToString();
actionQuery.Ip = req.url;
CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
// 进行plc的连接
s7 = DevicePlcS7.SiemensS7(actionInfo.Ip);
OperateResult ConnectionResult = s7.ConnectServer();
if (!ConnectionResult.IsSuccess)
{
s7.ConnectClose();
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.result = "false";
responseData.resultMsg = ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req);
return responseData;
}
// 查询需要操作的plc的db块
CcsActionAddress actionAddressQuery = new CcsActionAddress();
actionAddressQuery.ActionId = actionInfo.Id;
List CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
//查询出需要检查的地址列表
List CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
{
if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
{
string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
if (actionAddress.CheckType ? operateResult != actionAddress.Value : operateResult == actionAddress.Value)
{
s7.ConnectClose();
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "====实际为:" + operateResult + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.result = "false";
responseData.resultMsg = "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "==实际为:" + operateResult;
return responseData;
}
}
}
//查询需要写入地址列表
List CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressWrites)
{
if (!string.IsNullOrEmpty(actionAddress.Address))
{
string parValue = "";
// 写入取放点位、需要进行点位拼接
if (actionAddress.Sort == 1)
{
//区域块为七位,点位为三位
parValue = req.data.LocationArea.PadRight(7,'0')+ req.data.Location.PadLeft(3, '0') + req.data.DestLocationArea.PadRight(7, '0') + req.data.DestLocation.PadLeft(3, '0');
s7.Write(actionAddress.Address, Convert.ToString(parValue));
}
else if (actionAddress.Sort == 2)
{
// 需要写入启动状态
parValue = actionAddress.Value;
s7.Write(actionAddress.Address, Convert.ToBoolean(parValue));
}
// 同步TagValue数据状态
CcsTagValue tagValueQuery = new CcsTagValue();
tagValueQuery.Ip = req.url;
tagValueQuery.Address = actionAddress.Address;
CcsTagValue tagValue = _ccsTagValueService.GetList(tagValueQuery).ToList().FirstOrDefault();
if (tagValue != null)
{
tagValue.TagValue = parValue;
await _ccsTagValueService.Update(tagValue);
}
Thread.Sleep(SLEEP_TIME);
}
}
s7.ConnectClose();
//插入回调
TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.RobotAction.ToString(),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction), req.taskId, req.taskNodeId);
taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
// 保存数据
await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.RobotAction) + "取成功===>>" + JsonConvert.SerializeObject(req)
, EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
return responseData;
}
catch (Exception ex)
{
// 记录日志
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.resultMsg = ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
responseData.result = "false";
// 关闭plc连接
if (s7 != null)
{
s7.ConnectClose();
}
return responseData;
}
}
///
/// 上传文件
///
public async Task UploadFile(RequestData req)
{
ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
try
{
List devices = _deviceService.GetDeviceList();
Device deviceFtp = devices.Where(x => x.Ip.Equals(req.url)
&& x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).FirstOrDefault();
Device deviceOpcUa = devices.Where(x => x.Ip.Equals(req.url)
&& x.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString())).FirstOrDefault();
Device deviceHeidenhain = devices.Where(x => x.Ip.Equals(req.url)
&& x.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString())).FirstOrDefault();
if (deviceOpcUa == null && deviceHeidenhain == null)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "设备已离线===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
responseData.result = "false";
responseData.resultMsg = ActionTypeEnum.UploadFile + "设备已离线===>>" + JsonConvert.SerializeObject(req);
return responseData;
}
//西门子系统上传
if (deviceOpcUa != null)
{
RequestOpcUaData opcUaReq = new RequestOpcUaData();
opcUaReq.ServerUrl = deviceOpcUa.ServerUrl;
opcUaReq.UserName = deviceOpcUa.UserName;
opcUaReq.Password = deviceOpcUa.Password;
opcUaReq.Path = req.data.fileName;
opcUaReq.Type = OpcUaActionTypeEnum.Upload.ToString();
var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
ResponseOpcUaData responseOpcUaData = JsonConvert.DeserializeObject(Result.Message);
if (!Result.IsSuccess || !responseOpcUaData.result)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传异常===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
responseData.result = "false";
return responseData;
}
}
else if(deviceHeidenhain != null)
{
RequestHeidhData hdhReq = new RequestHeidhData();
hdhReq.ServerUrl = deviceHeidenhain.ServerUrl;
hdhReq.MachineName = deviceHeidenhain.UserName;
hdhReq.Path = req.data.fileName;
hdhReq.Type = OpcUaActionTypeEnum.Upload.ToString();
//远程机床相对路径
hdhReq.Address = req.data.remotePath;
var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject(Result.Message);
if (!Result.IsSuccess || !responseHeidhData.result)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "预上传异常===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
responseData.result = "false";
return responseData;
}
}
//插入回调
TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.UploadFile.ToString(),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile), req.taskId, req.taskNodeId);
await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传成功===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
return responseData;
}
catch (Exception ex)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
responseData.resultMsg = ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
responseData.result = "false";
return responseData;
}
}
///
/// 启动机床程序
///
public async Task StartNCProgram(RequestData req)
{
ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
try
{
List devices = _deviceService.GetDeviceList();
Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
if (device == null)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
responseData.result = "false";
responseData.resultMsg = ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req);
return responseData;
}
CcsAction actionQuery = new CcsAction();
actionQuery.OperateType = ActionTypeEnum.StartNCProgram.ToString();
actionQuery.Ip = req.url;
CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
CcsActionAddress actionAddressQuery = new CcsActionAddress();
actionAddressQuery.ActionId = actionInfo.Id;
List CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
//opcua启动程序
if (actionInfo.ProtocolType == ProtocalTypeEnum.OPCUA.ToString())
{
//插入回调
//获取启动前放的 工位
TaskCallback queryTaskCallBack = new TaskCallback();
queryTaskCallBack.IP = actionInfo.PlcIp;
queryTaskCallBack.Description = ProtocalTypeEnum.OPCUA.ToString();
TaskCallback TaskBean = await _taskCallbackService.GetRobotActionList(queryTaskCallBack);
TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
taskCallbackData.Description = ProtocalTypeEnum.OPCUA.ToString();
if(TaskBean != null)
{
taskCallbackData.Data = TaskBean.Data;
}
else
{
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "失败,上一放动作 没有工位信息===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
return responseData;
}
await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
return responseData;
} else if (actionInfo.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
{
//调用机器人plc启动海德汉程序
//SiemensS7Net s7 = DevicePlcS7.SiemensS7(actionInfo.PlcIp);
//OperateResult ConnectionResult = s7.ConnectServer();
//if (!ConnectionResult.IsSuccess)
//{
// s7.ConnectClose();
// Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
// EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
// responseData.result = "false";
// return responseData;
//}
////查询条件
//List CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
//foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
//{
// if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
// {
// string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
// if (actionAddress.CheckType ? operateResult.Equals(actionAddress.Value) : operateResult != actionAddress.Value)
// {
// s7.ConnectClose();
// Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "条件不满足" + JsonConvert.SerializeObject(req),
// EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
// responseData.result = "false";
// return responseData;
// }
// }
//}
//s7.ConnectClose();
RequestHeidhData hdhReq = new RequestHeidhData();
hdhReq.ServerUrl = device.ServerUrl;
hdhReq.MachineName = device.UserName;
hdhReq.Path = req.data.remotePath;
hdhReq.Type = OpcUaActionTypeEnum.StartNcProgram.ToString();
var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject(Result.Message);
if (!Result.IsSuccess || !responseHeidhData.result)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
responseData.result = "false";
responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
return responseData;
}
//插入回调
TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
return responseData;
}
else
{
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
responseData.result = "false";
responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
return responseData;
}
}
catch (Exception ex)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "程序异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
responseData.result = "false";
return responseData;
}
}
///
/// 启动清洗机
///
public async Task StartCleanMachine(RequestData