change - 出入库任务下发逻辑实现

foamRearStore
wenjy 1 year ago
parent fd527cbdc2
commit 6e3059dae6

Binary file not shown.

@ -1,4 +1,5 @@
using HighWayIot.Log4net;
using HighWayIot.Config;
using HighWayIot.Log4net;
using HighWayIot.Repository.domain;
using HighWayIot.Repository.service;
using HighWayIot.Repository.service.Impl;
@ -6,6 +7,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Aucma.Scada.Business
@ -27,6 +29,8 @@ namespace Aucma.Scada.Business
private IRealTaskInfoService _taskInfoService = new RealTaskInfoServiceImpl();
private AppConfig appConfig = AppConfig.Instance;
/// <summary>
/// 初始化入库任务
/// </summary>
@ -51,11 +55,9 @@ namespace Aucma.Scada.Business
public delegate void RefreshLogMessage(string message);
public event RefreshLogMessage RefreshLogMessageEvent;
public InStoreBusiness()
private InStoreBusiness()
{
//System.Timers.Timer timer = new System.Timers.Timer(interval: 3000);
//timer.Elapsed += (sender, e) => HandleTimer();
//timer.Start();
StartPassDown();
}
private void HandleTimer()
@ -122,17 +124,162 @@ namespace Aucma.Scada.Business
}
}
#region 轮询获取入库任务下发至PLC等待PLC执行反馈完成后再次下发
private SemaphoreSlim shellSemaphore = new SemaphoreSlim(0);
private SemaphoreSlim linerSemaphore = new SemaphoreSlim(0);
private void StartPassDown()
{
Task.Run(() =>
{
while (true)
{
PassDownShellTask();
Thread.Sleep(1000);
}
});
Task.Run(() =>
{
while (true)
{
PassDownLinerTask();
Thread.Sleep(1000);
}
});
}
/// <summary>
/// 依次获取箱壳任务队列进行下发
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void PassDownShellTask()
{
RealTaskInfo taskInfo = GetAwaitSendTask(appConfig.shellStoreCode);
if(taskInfo != null)
{
PrintLogInfoMessage($"下发箱壳入库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (shellSemaphore.Wait(TimeSpan.FromSeconds(10)))
{
// 收到反馈
PrintLogInfoMessage("箱壳收到反馈,继续执行");
}
else
{
PrintLogInfoMessage("超时未反馈");
}
//shellSemaphore.Wait(); //一直堵塞直到信号量释放
}
else
{
PrintLogInfoMessage("未获取到需要下发的箱壳入库任务");
Thread.Sleep(5000);
}
}
/// <summary>
/// 依次获取内胆任务队列进行下发
/// </summary>
private void PassDownLinerTask()
{
RealTaskInfo taskInfo = GetAwaitSendTask(appConfig.linerStoreCode);
if(taskInfo != null)
{
PrintLogInfoMessage($"下发内胆入库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (linerSemaphore.Wait(TimeSpan.FromSeconds(10)))
{
// 收到反馈
PrintLogInfoMessage("内胆收到反馈,继续执行");
}
else
{
PrintLogInfoMessage("超时未反馈");
}
//semaphore.Wait(); //一直堵塞直到信号量释放
}
else
{
PrintLogInfoMessage("未获取到需要下发的箱壳入库任务");
Thread.Sleep(5000);
}
}
/// <summary>
/// 获取待执行的入库任务
/// </summary>
/// <param name="storeCode"></param>
/// <returns></returns>
private RealTaskInfo GetAwaitSendTask(string storeCode)
{
RealTaskInfo taskInfo = null;
try
{
taskInfo = _taskInfoService.GetTaskInfoByStoreCode(storeCode, 1);
if(taskInfo != null)
{
taskInfo.taskStatus = 2;
_taskInfoService.UpdateTaskInfo(taskInfo);
}
}
catch (Exception ex)
{
PrintLogErrorMessage("获取待执行的入库任务异常", ex);
}
return taskInfo;
}
/// <summary>
/// 箱壳执行反馈
/// </summary>
private void ShellTaskFeedback()
{
Thread.Sleep(4000);
PrintLogInfoMessage("箱壳执行完成,自动释放信号量");
shellSemaphore.Release();
}
/// <summary>
/// 内胆执行反馈
/// </summary>
private void LinerTaskFeedback()
{
Thread.Sleep(8000);
PrintLogInfoMessage("内胆执行完成,自动释放信号量");
linerSemaphore.Release();
}
#endregion
/// <summary>
/// 入库完成
/// </summary>
/// <param name="storeCode"></param>
/// <param name="spaceCode"></param>
/// <param name="materialType"></param>
private void InStoreFinish(string taskCode)
private void InStoreFinish(string taskCode,string storeCode)
{
try
{
var taskInfo = _taskInfoService.GetTaskInfoByTaskCode(taskCode);
var taskInfo = _taskInfoService.GetTaskInfoByTaskCode(taskCode, storeCode);
if (taskInfo != null)
{
var spaceInfo = _spaceInfoService.GetSpaceInfoBySpaceCode(taskInfo.storeCode, taskInfo.spaceCode);
@ -145,7 +292,7 @@ namespace Aucma.Scada.Business
}
//清除任务信息
_taskInfoService.DeleteTaskInfo(taskCode);
_taskInfoService.DeleteTaskInfo(taskCode, storeCode);
}
}

@ -39,7 +39,12 @@ namespace Aucma.Scada.Business
private TaskHandleBusiness taskHandleBusiness = TaskHandleBusiness.Instance;
private Semaphore m_SendTaskSem = new Semaphore(0, 100000);
/// <summary>
/// 出库任务等待反馈信号量
/// </summary>
private Semaphore m_ShellTaskSem = new Semaphore(0, 1);
private Semaphore m_LinerTaskSem = new Semaphore(0, 1);
/// <summary>
/// 初始化出库任务
@ -65,13 +70,10 @@ namespace Aucma.Scada.Business
public delegate void RefreshLogMessage(string message);
public event RefreshLogMessage RefreshLogMessageEvent;
public OutStoreBusiness()
private OutStoreBusiness()
{
assemblyPlanBusiness.NextPassExecutePlanInfoEvent += PlanHandle;
Task.Run(() =>
{
StartTimerPassDown();
});
StartPassDown();
}
/// <summary>
@ -123,6 +125,7 @@ namespace Aucma.Scada.Business
else
{
//报警停线
PrintLogInfoMessage($"{storeCode};仓库内未获取到{bomInfo.materialCode}相匹配的物料及货道");
}
}
catch (Exception ex)
@ -231,70 +234,140 @@ namespace Aucma.Scada.Business
_spaceInfoService.UpdateSpaceInfo(spaceInfo);
}
#region 开启定时获取出库任务下发至PLC等待PLC执行反馈完成后再次下发
#region 轮询获取出库任务下发至PLC等待PLC执行反馈完成后再次下发
private SemaphoreSlim semaphore = new SemaphoreSlim(0);
private int completedTasks = 0;
private System.Timers.Timer timer = new System.Timers.Timer(5000);
private int taskAmount = 2;
private void StartTimerPassDown()
private void StartPassDown()
{
Task.Run(() =>
{
//try
//{
// if (!timer.Enabled)
// {
// timer.Elapsed += new System.Timers.ElapsedEventHandler(PassDownTaskInfoByTimer);
// timer.AutoReset = true;
// timer.Enabled = false;
// timer.Start();
// PrintLogInfoMessage("StartTimerPassDown(),开启定时获取出库任务进行下发");
// }
//}
//catch (Exception ex)
//{
// PrintLogErrorMessage("开启定时下发出库任务异常", ex);
//}
while (true)
{
PassDownTaskInfo();
Thread.Sleep(1000);
}
});
}
/// <summary>
/// 依次获取任务队列进行下发
/// object sender, System.Timers.ElapsedEventArgs e
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private bool PassDownTaskInfoByTimer()
private void PassDownTaskInfo()
{
List<RealTaskInfo> realTasks = new List<RealTaskInfo>();
RealTaskInfo shellTask = _taskInfoService.GetTaskInfoByStoreCode(appConfig.shellStoreCode, 2);
RealTaskInfo linerTaks = _taskInfoService.GetTaskInfoByStoreCode(appConfig.linerStoreCode, 2);
if(shellTask != null && linerTaks != null)
{
if (shellTask.taskStatus != 2 && linerTaks.taskStatus != 2)
{
shellTask.taskStatus = 2;
linerTaks.taskStatus = 2;
realTasks.Add(shellTask);
realTasks.Add(linerTaks);
bool result = _taskInfoService.UpdateRangeTaskInfo(realTasks);
completedTasks = 0;
if (result)
//获取待执行的出库任务下发至PLC,并将任务状态改为执行中
var taskInfoList = GetAwaitSendTask();
if (taskInfoList.Count > 0)
{
GetAllRelese(m_SendTaskSem);
foreach (var item in realTasks)
taskAmount = taskInfoList.Count; //下发的任务数量默认2箱壳、内胆箱壳、内胆均执行完成后才会释放信号量
foreach (var item in taskInfoList)
{
//taskHandleBusiness.SendOutStoreTask(item);
PrintLogInfoMessage($"下发出库任务:{item.taskCode};仓库{item.storeCode};货道:{item.spaceCode}");
RefreshScanMateriaCodeEvent?.Invoke(item.materialCode, item.materialType, item.spaceName, item.storeCode);
taskHandleBusiness.SendOutStoreTask(item);
}
if (m_SendTaskSem.WaitOne(5000, false))
if (semaphore.Wait(TimeSpan.FromSeconds(20)))
{
// 收到反馈
PrintLogInfoMessage("收到反馈,继续执行");
}
else
{
return true;
PrintLogInfoMessage("超时未反馈");
}
//semaphore.Wait(); //一直堵塞直到信号量释放
}
else
{
return false;
PrintLogInfoMessage("未获取到需要下发的出库任务");
Thread.Sleep(5000);
}
}
/// <summary>
/// 获取待执行的出库任务
/// </summary>
/// <returns></returns>
private List<RealTaskInfo> GetAwaitSendTask()
{
List<RealTaskInfo> taskInfos = new List<RealTaskInfo>();
try
{
RealTaskInfo shellTaskInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.shellStoreCode,2);
if(shellTaskInfo != null)
{
//获取与箱壳任务匹配的内胆任务
RealTaskInfo linerTaskInfo = _taskInfoService.GetTaskInfoByTaskCode(shellTaskInfo.taskCode, appConfig.linerStoreCode);
taskInfos.Add(shellTaskInfo);
if (linerTaskInfo != null) taskInfos.Add(linerTaskInfo);
}
if(taskInfos.Count > 0)
{
taskInfos.ForEach(x => x.taskStatus = 2);
_taskInfoService.UpdateRangeTaskInfo(taskInfos);
}
}
catch(Exception ex)
{
PrintLogErrorMessage("获取待执行的出库任务异常", ex);
}
return taskInfos;
}
/// <summary>
/// 箱壳执行反馈
/// </summary>
private void ShellTaskFeedback()
{
Interlocked.Increment(ref completedTasks);
CheckCompletedTasks();
PrintLogInfoMessage("箱壳执行完成,自动释放信号量");
OutStoreFinish("", appConfig.shellStoreCode);
}
/// <summary>
/// 内胆执行反馈
/// </summary>
private void LinerTaskFeedback()
{
Interlocked.Increment(ref completedTasks);
CheckCompletedTasks();
PrintLogInfoMessage("内胆执行完成,自动释放信号量");
OutStoreFinish("", appConfig.linerStoreCode);
}
/// <summary>
/// 信号量释放,根据任务完成数量,执行完成后进行释放
/// </summary>
private void CheckCompletedTasks()
{
if (completedTasks == taskAmount)
{
// 释放信号量
semaphore.Release();
}
return false;
}
#endregion
@ -306,11 +379,11 @@ namespace Aucma.Scada.Business
/// <param name="storeCode"></param>
/// <param name="spaceCode"></param>
/// <param name="materialType"></param>
private void OutStoreFinish(string taskCode)
private void OutStoreFinish(string taskCode, string storeCode)
{
try
{
var taskInfo = _taskInfoService.GetTaskInfoByTaskCode(taskCode);
var taskInfo = _taskInfoService.GetTaskInfoByTaskCode(taskCode, storeCode);
if (taskInfo != null)
{
var spaceInfo = _spaceInfoService.GetSpaceInfoBySpaceCode(taskInfo.storeCode, taskInfo.spaceCode);
@ -324,7 +397,7 @@ namespace Aucma.Scada.Business
//读取PLC获取物料类型进行绑定
}
//清除任务信息
_taskInfoService.DeleteTaskInfo(taskCode);
_taskInfoService.DeleteTaskInfo(taskCode, storeCode);
}
}
@ -405,12 +478,15 @@ namespace Aucma.Scada.Business
logHelper.Error(message, ex);
}
/// <summary>
/// 手动释放信号量
/// </summary>
/// <param name="sph"></param>
private void GetAllRelese(Semaphore sph)
{
bool res = sph.WaitOne(1, false);
if (res)
{
// LogHelper.RfidLog("信号量手动释放");
GetAllRelese(sph);
}
}

@ -0,0 +1,11 @@
<HR COLOR=red>
异常时间2023-10-16 16:49:44,795 [6] <BR>
异常级别ERROR <BR>
异 常 类logerror [(null)] <BR>
【附加信息】 : 根据任务号获取任务信息异常<br>【异常类型】SqlSugarException <br>【异常信息】The SqlFunc.IIF(arg1,arg2,arg3) , ((x.storeCode == value(HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl+<>c__DisplayClass8_0).storeCode) AndAlso (x.taskCode == value(HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl+<>c__DisplayClass8_0).taskCode)) argument do not support <br>【堆栈调用】: at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)<br> at SqlSugar.MethodCallExpressionResolve.AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)<br> at SqlSugar.MethodCallExpressionResolve.AppendItem(ExpressionParameter parameter, String name, IEnumerable`1 args, MethodCallExpressionModel model, Expression item)<br> at SqlSugar.MethodCallExpressionResolve.Where(ExpressionParameter parameter, Nullable`1 isLeft, String name, IEnumerable`1 args, MethodCallExpressionModel model, List`1 appendArgs)<br> at SqlSugar.ConditionalExpressionResolve..ctor(ExpressionParameter parameter)<br> at SqlSugar.BaseResolve.Start()<br> at SqlSugar.LambdaExpressionResolve..ctor(ExpressionParameter parameter)<br> at SqlSugar.BaseResolve.Start()<br> at SqlSugar.ExpressionContext.Resolve(Expression expression, ResolveExpressType resolveType)<br> at SqlSugar.QueryBuilder.GetExpressionValue(Expression expression, ResolveExpressType resolveType)<br> at SqlSugar.QueryableProvider`1._Where(Expression expression)<br> at SqlSugar.QueryableProvider`1.First(Expression`1 expression)<br> at SqlSugar.SimpleClient`1.GetFirst(Expression`1 whereExpression)<br> at HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl.GetTaskInfoByTaskCode(String taskCode, String storeCode) in C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Repository\service\Impl\RealTaskInfoServiceImpl.cs:line 153 <BR>
<HR Size=1><HR COLOR=red>
异常时间2023-10-16 16:50:54,247 [6] <BR>
异常级别ERROR <BR>
异 常 类logerror [(null)] <BR>
【附加信息】 : 根据任务号获取任务信息异常<br>【异常类型】SqlSugarException <br>【异常信息】The SqlFunc.IIF(arg1,arg2,arg3) , ((x.storeCode == value(HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl+<>c__DisplayClass8_0).storeCode) AndAlso (x.taskCode == value(HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl+<>c__DisplayClass8_0).taskCode)) argument do not support <br>【堆栈调用】: at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)<br> at SqlSugar.MethodCallExpressionResolve.AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)<br> at SqlSugar.MethodCallExpressionResolve.AppendItem(ExpressionParameter parameter, String name, IEnumerable`1 args, MethodCallExpressionModel model, Expression item)<br> at SqlSugar.MethodCallExpressionResolve.Where(ExpressionParameter parameter, Nullable`1 isLeft, String name, IEnumerable`1 args, MethodCallExpressionModel model, List`1 appendArgs)<br> at SqlSugar.ConditionalExpressionResolve..ctor(ExpressionParameter parameter)<br> at SqlSugar.BaseResolve.Start()<br> at SqlSugar.LambdaExpressionResolve..ctor(ExpressionParameter parameter)<br> at SqlSugar.BaseResolve.Start()<br> at SqlSugar.ExpressionContext.Resolve(Expression expression, ResolveExpressType resolveType)<br> at SqlSugar.QueryBuilder.GetExpressionValue(Expression expression, ResolveExpressType resolveType)<br> at SqlSugar.QueryableProvider`1._Where(Expression expression)<br> at SqlSugar.QueryableProvider`1.First(Expression`1 expression)<br> at SqlSugar.SimpleClient`1.GetFirst(Expression`1 whereExpression)<br> at HighWayIot.Repository.service.Impl.RealTaskInfoServiceImpl.GetTaskInfoByTaskCode(String taskCode, String storeCode) in C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Repository\service\Impl\RealTaskInfoServiceImpl.cs:line 153 <BR>
<HR Size=1>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,49 @@
<-------------->
日志时间2023-10-16 13:38:43,670 [5]
日志级别INFO
日志内容通过PLC地址写入String类型数据XK_001失败
<-------------->
日志时间2023-10-16 13:38:43,686 [5]
日志级别INFO
日志内容开始通过PLC地址写入int32类型数据1
<-------------->
日志时间2023-10-16 13:38:43,697 [5]
日志级别INFO
日志内容通过PLC地址写入int32类型数据1失败
<-------------->
日志时间2023-10-16 13:38:43,699 [5]
日志级别INFO
日志内容通过PLC地址写入String类型数据17:18:23失败
<-------------->
日志时间2023-10-16 13:38:43,699 [5]
日志级别INFO
日志内容开始通过PLC地址写入int32类型数据1
<-------------->
日志时间2023-10-16 13:38:43,699 [5]
日志级别INFO
日志内容通过PLC地址写入int32类型数据1失败
<-------------->
日志时间2023-10-16 13:38:48,244 [5]
日志级别INFO
日志内容通过PLC地址写入String类型数据ND_001失败
<-------------->
日志时间2023-10-16 13:38:48,250 [5]
日志级别INFO
日志内容开始通过PLC地址写入int32类型数据1
<-------------->
日志时间2023-10-16 13:38:48,252 [5]
日志级别INFO
日志内容通过PLC地址写入int32类型数据1失败
<-------------->
日志时间2023-10-16 13:38:48,252 [5]
日志级别INFO
日志内容通过PLC地址写入String类型数据17:18:23失败
<-------------->
日志时间2023-10-16 13:38:48,252 [5]
日志级别INFO
日志内容开始通过PLC地址写入int32类型数据1
<-------------->
日志时间2023-10-16 13:38:48,253 [5]
日志级别INFO
日志内容通过PLC地址写入int32类型数据1失败

File diff suppressed because one or more lines are too long

@ -29,6 +29,9 @@ namespace Aucma.Scada.UI.viewModel.InStoreInfo
public InStoreInfoViewModel()
{
inStoreBusiness.RefreshInStoreTaskEvent += RefreshInStoreTask;
inStoreBusiness.RefreshScanMateriaCodeEvent += RefreshScanInfo;
inStoreBusiness.RefreshLogMessageEvent += PrintMessageToListBox;
QueryCommand = new RelayCommand(Query);
@ -38,9 +41,6 @@ namespace Aucma.Scada.UI.viewModel.InStoreInfo
Init();
inStoreBusiness.RefreshInStoreTaskEvent += RefreshInStoreTask;
inStoreBusiness.RefreshScanMateriaCodeEvent += RefreshScanInfo;
inStoreBusiness.RefreshLogMessageEvent += PrintMessageToListBox;
}
#region 参数定义

@ -185,7 +185,7 @@ namespace Aucma.Scada.UI.viewModel.OutStoreInfo
try
{
listItems.Add($"{DateTime.Now.ToString("HH:mm:ss")}==>{message}");
listItems.Add($"{DateTime.Now.ToString("HH:mm:ss.ss")}==>{message}");
LogInfoListBox = listItems.OrderByDescending(x => x);
}

@ -27,3 +27,4 @@ C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Log4net\obj\Debug\High
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Log4net\obj\Debug\HighWayIot.Log4net.csproj.CopyComplete
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Log4net\obj\Debug\HighWayIot.Log4net.dll
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Log4net\obj\Debug\HighWayIot.Log4net.pdb
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.Log4net\obj\Debug\HighWayIot.Log4net.csproj.AssemblyReference.cache

@ -34,7 +34,7 @@ namespace HighWayIot.Repository.service
/// 删除任务信息
/// </summary>
/// <param name="taskInfo"></param>
bool DeleteTaskInfo(string taskCode);
bool DeleteTaskInfo(string taskCode, string storeCode = null);
/// <summary>
/// 通过任务编号更新任务状态
@ -56,7 +56,7 @@ namespace HighWayIot.Repository.service
/// </summary>
/// <param name="taskCode"></param>
/// <returns></returns>
RealTaskInfo GetTaskInfoByTaskCode(string taskCode);
RealTaskInfo GetTaskInfoByTaskCode(string taskCode,string storeCode);
/// <summary>
/// 通过仓库编号获取任务

@ -39,12 +39,12 @@ namespace HighWayIot.Repository.service.Impl
/// 删除任务信息
/// </summary>
/// <param name="taskInfo"></param>
public bool DeleteTaskInfo(string taskCode)
public bool DeleteTaskInfo(string taskCode,string storeCode=null)
{
bool result = false;
try
{
RealTaskInfo taskInfo = GetTaskInfoByTaskCode(taskCode);
RealTaskInfo taskInfo = GetTaskInfoByTaskCode(taskCode,storeCode);
if(taskInfo != null)
{
result = _mesRepository.Delete(taskInfo);
@ -145,12 +145,12 @@ namespace HighWayIot.Repository.service.Impl
/// </summary>
/// <param name="taskCode"></param>
/// <returns></returns>
public RealTaskInfo GetTaskInfoByTaskCode(string taskCode)
public RealTaskInfo GetTaskInfoByTaskCode(string taskCode, string storeCode)
{
RealTaskInfo taskInfo = null;
try
{
taskInfo = _mesRepository.GetFirst(x => x.taskCode == taskCode);
taskInfo = _mesRepository.GetFirst(x => string.IsNullOrEmpty(storeCode) ? 1==1 : x.storeCode == storeCode && x.taskCode == taskCode);
}
catch (Exception ex)
{

@ -29,3 +29,4 @@ C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.TouchSocket\obj\Debug\
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.TouchSocket\obj\Debug\HighWayIot.TouchSocket.csproj.CopyComplete
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.TouchSocket\obj\Debug\HighWayIot.TouchSocket.dll
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.TouchSocket\obj\Debug\HighWayIot.TouchSocket.pdb
C:\项目代码\澳柯玛MES项目\Aucma.Scada\HighWayIot.TouchSocket\obj\Debug\HighWayIot.TouchSocket.csproj.AssemblyReference.cache

Loading…
Cancel
Save