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 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 System.Reflection;
using Newtonsoft.Json;
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 mazakUrlContext;
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;
mazakUrlContext = Configuration.GetConnectionString("mazakUrlContext");
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;
return list;
}
///
/// 查询设备状态
///
public async Task> GetEquipMent()
{
return await _equipmentMonitorService.GetList();
}
///
/// 机器人取放动作
///
public async Task RobotAction(RequestData req)
{
ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
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";
return responseData;
}
CcsAction actionQuery = new CcsAction();
actionQuery.OperateType = ActionTypeEnum.RobotAction.ToString();
actionQuery.Ip = req.url;
CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
SiemensS7Net 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";
return responseData;
}
CcsActionAddress actionAddressQuery = new CcsActionAddress();
actionAddressQuery.ActionId = actionInfo.Id;
List CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
//查询条件
List CcsActionAddressChecks = new List();
if (req.data.taskType == "1" && (req.data.destLocation == "30" || req.data.destLocation == "900")) //取料
{
CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK_GET.ToString()).ToList();
}
else if (req.data.taskType == "1" && (req.data.destLocation != "30" && req.data.destLocation != "900")) //放料
{
CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK_SEND.ToString()).ToList();
}
foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
{
if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
{
string operateResult = s7.ReadInt16(actionAddress.Address).Content.ToString();
if (actionAddress.CheckType ? operateResult != actionAddress.Value : operateResult == actionAddress.Value)
{
s7.ConnectClose();
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "条件不满足" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.result = "false";
return responseData;
}
}
}
//查询写入地址列表
List CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressWrites)
{
if (!string.IsNullOrEmpty(actionAddress.Address))
{
//string operateResult = s7.ReadInt16(actionAddress.Address).Content.ToString();
if (string.IsNullOrEmpty(actionAddress.Value))
{
//取参数传参值
string dataValue = getProperties(req.data, actionAddress.Description);
if (!string.IsNullOrEmpty(dataValue))
{
s7.Write(actionAddress.Address, Convert.ToInt16(dataValue));
}
}
else
{
s7.Write(actionAddress.Address, Convert.ToInt16(actionAddress.Value));
}
//同步更新数据库状态
//CcsTagValue tagValueQuery = new CcsTagValue();
//tagValueQuery.Ip = req.url;
//tagValueQuery.Address = actionAddress.Address;
//CcsTagValue tagValue = _ccsTagValueService.GetList(tagValueQuery).ToList().FirstOrDefault();
//if(tagValue != null)
//{
// tagValue.TagValue = actionAddress.Value;
// await _ccsTagValueService.Update(tagValue);
//}
Thread.Sleep(SLEEP_TIME);
}
}
List CcsActionAddressWriteChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE_CHECK.ToString()).ToList();
bool checkFlag = true;
foreach (CcsActionAddress actionAddress in CcsActionAddressWriteChecks)
{
if (!string.IsNullOrEmpty(actionAddress.Address))
{
//取参数传参值
string dataValue = getProperties(req.data, actionAddress.Description);
//读取写入结果
string readWriteResult = s7.ReadInt16(actionAddress.Address).Content.ToString();
if(dataValue != readWriteResult)
{
checkFlag = false;
break;
}
}
}
//不通过不写执行
if (!checkFlag)
{
s7.ConnectClose();
Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "写入失败,plc没有写入相应的值" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
responseData.result = "false";
return responseData;
}
//二次写入地址列表
List CcsActionAddressWriteSeconds = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE_SECOND.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressWriteSeconds)
{
if (!string.IsNullOrEmpty(actionAddress.Address))
{
if (string.IsNullOrEmpty(actionAddress.Value))
{
//取参数传参值
string dataValue = getProperties(req.data, actionAddress.Description);
if (!string.IsNullOrEmpty(dataValue))
{
s7.Write(actionAddress.Address, Convert.ToInt16(dataValue));
}
}
else
{
s7.Write(actionAddress.Address, Convert.ToInt16(actionAddress.Value));
}
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);
if(req.data.taskType == "1" && (req.data.destLocation == "30" || req.data.destLocation == "900")) //取料完成
{
taskCallbackData.CallbackValue = "2";
}else if (req.data.taskType == "1" && (req.data.destLocation != "30" && req.data.destLocation != "900")) //放料完成
{
taskCallbackData.CallbackValue = "4";
}
else if (req.data.taskType == "512" ) //移动完成
{
taskCallbackData.CallbackValue = "4"; //todo 待确定移动完成 值
}
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.result = "false";
return responseData;
}
}
///
/// 上传文件
///
public async Task UploadFile(RequestData req)
{
ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
try
{
List devices = _deviceService.GetDeviceList();
Device deviceMazak = devices.Where(x => x.Ip.Equals(req.url)
&& x.ProtocolType.Equals(ProtocalTypeEnum.MAZAK.ToString())).FirstOrDefault();
if (deviceMazak == null)
{
Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "设备已离线===>>" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
responseData.result = "false";
return responseData;
}
//mazak系统上传
if (deviceMazak != null)
{
RequestOpcUaData deviceReq = new RequestOpcUaData();
deviceReq.ServerUrl = req.url;
deviceReq.Path = req.data.fileName;
deviceReq.Type = OpcUaActionTypeEnum.Upload.ToString();
var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, mazakUrlContext, deviceReq, 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;
}
}
//插入回调
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.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";
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);
if (actionInfo.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
{
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.ReadInt16(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;
}
}
}
//查询写入地址列表
List CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressWrites)
{
if (!string.IsNullOrEmpty(actionAddress.Address))
{
s7.Write(actionAddress.Address, Convert.ToInt16(actionAddress.Value));
Thread.Sleep(SLEEP_TIME);
}
}
List CcsActionAddressWriteChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE_CHECK.ToString()).ToList();
foreach (CcsActionAddress actionAddress in CcsActionAddressWriteChecks)
{
if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
{
string operateResult = s7.ReadInt16(actionAddress.Address).Content.ToString();
if (operateResult != actionAddress.Value)
{
s7.ConnectClose();
Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "异常===>>" + "写入失败" + JsonConvert.SerializeObject(req),
EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
responseData.result = "false";
return responseData;
}
}
}
s7.ConnectClose();
//插入回调
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";
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