using MathNet.Numerics;
using Prism.Events;
using Prism.Ioc;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using TeamAAS_VP.Core;
using TeamAAS_VP.Core.PLCs;
using TeamAAS_VP.Events;
using TeamAAS_VP.Interfaces;
using TeamAAS_VP.Models;
using TeamAAS_VP.Models.PLC;
using TeamAAS_VP.Models.Torque;
namespace TeamAAS_VP.Services
{
public class TorqueService : BindableBase
{
IEventAggregator _eventAggregator;
IConfigService _configService;
IContainerProvider _container;
IRobotService _robotService;
IPlcService _plcService;
private Management management;
///
/// 扭矩日志月份目录
///
private string TorqueParametrPath
{
get
{
// 示例:..//Log//LogTorque//2026-01
return $"..//Log//LogTorque//{DateTime.Now:yyyy-MM}";
}
}
///
/// 当天扭矩 CSV 文件完整路径
///
private string CurrentVariableCSV
{
get
{
// 示例:..//Log//LogTorque//2026-01//2026-01-22.csv
return $"..//Log//LogTorque//{DateTime.Now:yyyy-MM}//{DateTime.Now:yyyy-MM-dd}.csv";
}
}
public async void Save_Torque_Log(string fileName, string content)
{
try
{
if (!File.Exists(TorqueParametrPath))
{
Directory.CreateDirectory(TorqueParametrPath);
}
bool Is_Exists = File.Exists(CurrentVariableCSV);
if (!Is_Exists)
{
Directory.CreateDirectory(CurrentVariableCSV);
}
using (FileStream fs = new FileStream(CurrentVariableCSV, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
if (!Is_Exists)
{
//初始化文件,写入标题行
sw.WriteLine("Time,...");
sw.WriteLine("Time,...");
}
else
{
sw.WriteLine("Time,...");
}
}
}
}
catch (Exception)
{
}
}
public TorqueService(IEventAggregator ea, IConfigService configService,
IContainerProvider container, IRobotService robotService, IPlcService plcService)
{
_eventAggregator = ea;
_configService = configService;
_container = container;
_robotService = robotService;
_plcService = plcService;
management = _container.Resolve();
}
public async Task Throw_Screw_Async(IRobot Robot, OpcUaClientPLC plc, PlcAddressConfig addressConfig, TorqueProduceModel PlcPoint)
{
List result = new List();
var point = new RPoint()
{
X = PlcPoint.TorquePoints[0].X_Position,
Y = PlcPoint.TorquePoints[0].Y_Position,
Z = PlcPoint.TorquePoints[0].Z_Position_Start,
};
result.Add(await plc.WriteNodeAsync(addressConfig.Manu_ZAxis_Velocity.Address, (float)99.0));
float Z_Distance = -(PlcPoint.TorquePoints[0].Z_Position_Start - PlcPoint.TorquePoints[0].Z_Position_Stop);
result.Add(await Robot.JumpAsync(point, 0));
result.Add(await plc.WriteNodeAsync(addressConfig.ManuToHome.Address, true));
return !result.Contains(false);
}
public async Task Pick_Screw_Async(IRobot Robot, OpcUaClientPLC plc, PlcAddressConfig addressConfig, TorqueProduceModel PlcPoint)
{
List result = new List();
var point = new RPoint()
{
X = PlcPoint.TorquePoints[1].X_Position,
Y = PlcPoint.TorquePoints[1].Y_Position,
Z = PlcPoint.TorquePoints[1].Z_Position_Start,
};
result.Add(await plc.WriteNodeAsync(addressConfig.Screw_Backward.Address, true));
result.Add(await Robot.JumpAsync(point, 0));
result.Add(await plc.WriteNodeAsync(addressConfig.ManuTOWork.Address, true));
result.Add(await plc.WriteNodeAsync(addressConfig.Screw_Backward.Address, false));
result.Add(await BackZero_Async(Robot, point));
result.Add(await Task.Run(() =>
{
return (bool)plc.ReadNode(addressConfig.InWork.Address);
}));
return !result.Contains(false);
}
public async Task Screw_Torque_Async(IRobot Robot, OpcUaClientPLC plc, PlcAddressConfig addressConfig, TorqueProduceModel PlcPoint)
{
List result = new List();
var point = new RPoint()
{
X = PlcPoint.TorquePoints[2].X_Position,
Y = PlcPoint.TorquePoints[2].Y_Position,
Z = PlcPoint.TorquePoints[2].Z_Position_Start,
};
//float Z_Distance = -(PlcPoint.TorquePoints[2].Z_Position_Start - PlcPoint.TorquePoints[2].Z_Position_Stop);
result.Add(await plc.WriteNodeAsync(addressConfig.Manu_ZAxis_Velocity.Address, (float)5.0));
result.Add(await Robot.JumpAsync(point, 0));
result.Add(await plc.WriteNodeAsync(addressConfig.Check_ScrewTorque.Address, true));
//result.Add(await Robot.JogAsync("Z", Z_Distance));
point.Z = PlcPoint.TorquePoints[2].Z_Position_Stop;
Robot.Go(point);
result.Add(await plc.WriteNodeAsync(addressConfig.ManuToHome.Address, true));
result.Add(await plc.WriteNodeAsync(addressConfig.Manu_ZAxis_Velocity.Address, (float)100.0));
result.Add(await BackZero_Async(Robot, point));
return !result.Contains(false);
}
public async Task Safety_Position_Async(IRobot Robot, OpcUaClientPLC plc, PlcAddressConfig addressConfig, TorqueProduceModel PlcPoint)
{
List result = new List();
var point = new RPoint()
{
X = PlcPoint.TorquePoints[3].X_Position,
Y = PlcPoint.TorquePoints[3].Y_Position,
Z = PlcPoint.TorquePoints[3].Z_Position_Start,
};
result.Add(await Robot.JumpAsync(point, 0));
return !result.Contains(false);
}
public async Task BackZero_Async(IRobot Robot, RPoint point)
{
point.Z = 0;
return Robot.Go(point);
}
public async Task Signal_Move_Async(IRobot Robot, OpcUaClientPLC plc, PlcAddressConfig addressConfig, PlcPoint_Torque target)
{
var point = new RPoint()
{
X = target.X_Position,
Y = target.Y_Position,
Z = target.Z_Position_Start,
};
await Robot.JumpAsync(point, 0);
}
}
}