<add>[important]添加注册口逻辑

This commit is contained in:
葛林强 2024-06-12 07:29:44 +08:00
parent 1cf596f729
commit a3b103a279
23 changed files with 583 additions and 89 deletions

View File

@ -0,0 +1,33 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WcsMain.ApiServe.ControllerFilter.ExceptionFilter;
using WcsMain.ApiServe.Controllers.Dto;
using WcsMain.ApiServe.Factory;
using WcsMain.DataBase.TableEntity;
namespace WcsMain.ApiServe.Controllers.WcsController;
[Route("api/wcs/conveyTask")]
[ApiController]
[WcsExceptionFilter]
public class ConveyTaskController : ControllerBase
{
/// <summary>
/// 分页查询箱式线任务
/// </summary>
/// <returns></returns>
[HttpPost("queryConveyTaskWithPage")]
public WcsApiResponse<int, List<AppConveyTask>> QueryConveyTaskWithPage()
{
// TODO
return WcsApiResponseFactory.Fail<int, List<AppConveyTask>>();
}
}

View File

@ -0,0 +1,66 @@
using CirculateTool;
using WcsMain.Business.Convey.HistoryDataHandler;
using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity;
using WcsMain.Enum.General;
using WcsMain.EquipOperation.Convey;
namespace WcsMain.Business.CirculationTask.Convey;
/// <summary>
/// 箱式线读取扫码信息
/// </summary>
[Circulation]
public class ReadScanCode(AppRouterMethodDao routerMethodDao, ConveyOperation conveyOperation, HistoryConveyDataHander historyConveyDataHander)
{
private readonly ConveyOperation _conveyOperation = conveyOperation;
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
private readonly HistoryConveyDataHander _historyConveyDataHander = historyConveyDataHander;
private static List<AppRouterMethod>? routers;
/// <summary>
/// 读取扫码数据
/// </summary>
/// <returns></returns>
[Circulation("读取扫码数据", 300)]
public bool ReadData()
{
if(routers == default)
{
routers = _routerMethodDao.Query(new AppRouterMethod() { RouterStatus = (int)TrueFalseEnum.TRUE });
return true;
}
List<Task> tasks = [];
foreach(AppRouterMethod router in routers)
{
(var readErrText, var scanOk, var code) = _conveyOperation.ReadScanInfo(router.Area);
if(!string.IsNullOrEmpty(readErrText))
{
ConsoleLog.Exception($"【异常】读取扫码:{router.Area} 数据异常,信息:{readErrText}");
Thread.Sleep(5000);
return true; // 不读了,估计网断了
}
if(scanOk != (int)TrueFalseEnum.TRUE) { continue; }
tasks.Add(Task.Factory.StartNew(() =>
{
_historyConveyDataHander.GetData("-", code, router.Area ?? "");
string clearErrText = _conveyOperation.ClearScanStatus(router.Area);
if(!string.IsNullOrEmpty(clearErrText))
{
ConsoleLog.Exception($"【异常】扫码:{router.Area} 清理读码信号异常,信息:{clearErrText}");
}
}));
}
Task.WaitAll([.. tasks]);
return true;
}
}

View File

@ -1,5 +1,6 @@
using System.Reflection;
using WcsMain.Business.Convey.DataHandler.GetRouter;
using Autofac;
using System.Reflection;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity;
using WcsMain.Tcp.Entity.Convey;
@ -11,11 +12,12 @@ namespace WcsMain.Business.Convey.DataHandler;
/// 输送线收到的数据处理基础类
/// </summary>
[Component]
public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
{
private readonly IComponentContext _componentContext = componentContext;
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
private Dictionary<string, BaseGetRouter?>? methodConfig;
private Dictionary<string, IBaseGetRouter?>? methodConfig;
/// <summary>
/// 处理 PLC 请求分拣路向逻辑
@ -44,7 +46,7 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
}
if(routerData.Code == "NoRead")
{
instance.NoRead(routerData, displayName, msg);
instance.ReadFail(routerData, displayName, msg);
}
else
{
@ -64,7 +66,7 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
if (appRouters == default) return;
methodConfig = [];
// 扫描创建继承 BaseGetRouter 的类的实例
Dictionary<string, BaseGetRouter> classInstances = [];
Dictionary<string, IBaseGetRouter> classInstances = [];
var assembly = Assembly.GetExecutingAssembly();
var assTypes = assembly.GetTypes();
foreach (var assType in assTypes)
@ -72,10 +74,10 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
var interfaces = assType.GetInterfaces();
foreach (var inteface in interfaces)
{
if (inteface.GetType() != typeof(BaseGetRouter)) continue;
if (inteface.GetType() != typeof(IBaseGetRouter)) continue;
var instance = Activator.CreateInstance(inteface.GetType());
if (instance == default) continue;
classInstances.Add(assType.Name, (BaseGetRouter)instance);
classInstances.Add(assType.Name, (IBaseGetRouter)instance);
}
}
// 将实例和请求点位绑定

View File

@ -1,8 +1,20 @@
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
/// <summary>
/// 发货获取路向
/// </summary>
public class DeliverGetRouter : BaseGetRouter
public class DeliverGetRouter : IBaseGetRouter
{
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
}

View File

@ -1,8 +1,8 @@
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
namespace WcsMain.Business.Convey.DataHandler.GetRouter.I;
public class BaseGetRouter
public interface IBaseGetRouter
{
/// <summary>
/// 读码失败
@ -11,10 +11,7 @@ public class BaseGetRouter
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <exception cref="NotImplementedException"></exception>
public virtual void NoRead(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
void ReadFail(GetRouterData routerData, string? disPlayName, string msg);
/// <summary>
/// 不是读码失败
@ -23,8 +20,5 @@ public class BaseGetRouter
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <exception cref="NotImplementedException"></exception>
public virtual void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg);
}

View File

@ -1,9 +1,20 @@
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
/// <summary>
/// 注册口获取路向
/// </summary>
public class LoginGetRouter : BaseGetRouter
public class LoginGetRouter : IBaseGetRouter
{
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
}

View File

@ -1,8 +1,20 @@
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
/// <summary>
/// 拣选请求获取路向
/// </summary>
public class PickGetRouter : BaseGetRouter
public class PickGetRouter : IBaseGetRouter
{
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
}

View File

@ -1,8 +1,20 @@
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
/// <summary>
/// 复核获取路向
/// </summary>
public class RecheckGetRouter : BaseGetRouter
public class RecheckGetRouter : IBaseGetRouter
{
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
}

View File

@ -1,8 +1,20 @@
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
/// <summary>
/// 补货获取路向
/// </summary>
public class ReplenishGetRouter : BaseGetRouter
public class ReplenishGetRouter : IBaseGetRouter
{
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,3 @@

该文件夹是给 TCP 通讯的 PLC 预留的功能

View File

@ -0,0 +1,28 @@
using WcsMain.DataBase.TableEntity;
using WcsMain.Tcp.Entity.Convey;
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
/// <summary>
/// 传统读码方式
/// </summary>
public interface IBaseGetData
{
/// <summary>
/// 读码失败
/// </summary>
/// <param name="area"></param>
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <param name="routerMethodData"></param>
void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData );
/// <summary>
/// 读码成功
/// </summary>
/// <param name="area"></param>
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <param name="routerMethodData"></param>
void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData);
}

View File

@ -0,0 +1,72 @@
using WcsMain.ApiClient.DataEntity.WmsEntity;
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.Common;
using WcsMain.DataBase.TableEntity;
using WcsMain.ExtendMethod;
using WcsMain.Plugins;
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
/// <summary>
/// 注册口逻辑
/// </summary>
public class LoginGetData(WmsWebApiPost wmsWebApiPost) : IBaseGetData
{
private readonly WmsWebApiPost _wmsWebApiPost = wmsWebApiPost;
/// <summary>
/// 读码失败
/// </summary>
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <param name="area"></param>
/// <param name="routerMethodData"></param>
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
ConsoleLog.Warning($"【警告】注册口:{area} 读码失败");
}
/// <summary>
/// 读码成功
/// </summary>
/// <param name="disPlayName"></param>
/// <param name="msg"></param>
/// <param name="area"></param>
/// <param name="routerMethodData"></param>
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
(string code, string direction) = msg.FormatDir();
/* 判断方向是否正确 */
string? routerDirection = routerMethodData.AllowDirection;
if(!string.IsNullOrEmpty(routerDirection))
{
string[] dirs = routerDirection.Split(',');
if(!dirs.Contains(direction))
{
ConsoleLog.Warning($"【警告】注册口:{area} 箱码:{code} 方向:{direction} 方向不正确,允许的方向为:{routerDirection}");
return;
}
}
/* 发送 WMS 请求入库 */
ApplyInRequest applyInRequest = new()
{
Point = area,
VehicleNo = code,
CodeMessage = msg
};
var postResult = _wmsWebApiPost.HttpPost<ApplyInRequest, WmsResponse>(applyInRequest, CommonData.AppConfig.ApplyEnterApiAddress ?? "");
if(!postResult.IsSend || postResult.ResponseEntity == default)
{
ConsoleLog.Exception($"【异常】注册口:{area} 箱码:{msg} 请求入库发生异常,异常信息:{postResult.RequestException}");
return;
}
if( postResult.ResponseEntity.Code == 0)
{
ConsoleLog.Success($"注册口:{area} 箱码:{msg} 请求入库成功 {postResult.ResponseEntity.Message}");
return;
}
ConsoleLog.Warning($"【警告】注册口:{area} 箱码:{msg} 请求入库失败,信息:{postResult.ResponseEntity.Message}");
return;
}
}

View File

@ -0,0 +1,20 @@
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.DataBase.TableEntity;
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
/// <summary>
/// 拣选站台的逻辑
/// </summary>
public class PickStandGetData : IBaseGetData
{
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
}

View File

@ -0,0 +1,20 @@
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.DataBase.TableEntity;
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
/// <summary>
/// 入库异常异常口判定 ---- 卡特专用 ---- 苏州卡特
/// </summary>
public class StackerInErr : IBaseGetData
{
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
}

View File

@ -0,0 +1,23 @@
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.DataBase.TableEntity;
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
/// <summary>
/// 入库分流 ---- 卡特专用 ---- 苏州卡特
/// </summary>
/// <remarks>
/// R2
/// </remarks>
public class StackerInSpliter : IBaseGetData
{
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
{
}
}

View File

@ -0,0 +1,132 @@
using Autofac;
using System.Collections.Generic;
using System.Reflection;
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity;
using WcsMain.Tcp.Entity.Convey;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.Business.Convey.HistoryDataHandler;
/// <summary>
/// 传统版本的箱式线数据处理
/// </summary>
/// <param name="routerMethodDao"></param>
[Component]
public class HistoryConveyDataHander(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
{
private readonly IComponentContext _componentContext = componentContext;
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
private Dictionary<string, IBaseGetData?>? methodConfig;
private Dictionary<string, AppRouterMethod?>? areaBaseData;
/// <summary>
/// 处理 PLC 请求分拣路向逻辑
/// </summary>
/// <param name="displayName"></param>
/// <param name="msg"></param>
/// <param name="area"></param>
public void GetData(string? displayName, string msg, string area)
{
LoadingMethodConfig(); // 加载配置信息,仅第一次加载
if (methodConfig == default || areaBaseData == default)
{
ConsoleLog.Warning("路由处理参数尚未加载,可能是和数据库服务连接存在异常");
return;
}
var getInstance = methodConfig.TryGetValue(area ?? "", out var instance);
if (!getInstance || instance == default)
{
ConsoleLog.Warning($"点位:{area} 未配置处理逻辑或者处理逻辑不可用");
return;
}
var areaInfo = areaBaseData.TryGetValue(area ?? "", out AppRouterMethod? routerMethodData);
if(!areaInfo || routerMethodData == default)
{
ConsoleLog.Warning($"点位:{area} 无可用配置信息");
return;
}
if (msg == "NoRead")
{
instance.ReadFail(displayName, msg, area, routerMethodData);
}
else
{
instance.ReadSuccess(displayName, msg, area, routerMethodData);
}
}
/*************************/
private static readonly object loadLock = new();
/// <summary>
/// 加载获取路由的参数
/// </summary>
private void LoadingMethodConfig()
{
lock (loadLock)
{
if (methodConfig != default && areaBaseData != default) return;
List<AppRouterMethod>? appRouters = _routerMethodDao.Query();
if (appRouters == default) return;
methodConfig = [];
areaBaseData = [];
// 扫描创建继承 BaseGetRouter 的类的实例
Dictionary<string, IBaseGetData> classInstances = [];
var assembly = Assembly.GetExecutingAssembly();
var assTypes = assembly.GetTypes();
foreach (var assType in assTypes)
{
var interfaces = assType.GetInterfaces();
foreach (var inteface in interfaces)
{
var type = inteface.GetType();
if (type != typeof(IBaseGetData)) continue;
var instance = CreateInstance(type);
if (instance == default) continue;
classInstances.Add(assType.Name, (IBaseGetData)instance);
}
}
// 将实例和请求点位绑定
foreach (var appRouter in appRouters)
{
if (string.IsNullOrEmpty(appRouter.ClassName)) continue;
bool isGetInstance = classInstances.TryGetValue(appRouter.ClassName, out var inst);
if (!isGetInstance) continue;
methodConfig.TryAdd(appRouter.Area ?? "", inst);
areaBaseData.TryAdd(appRouter.Area ?? "", appRouter);
}
}
}
/// <summary>
/// 创建实例。自动注入参数
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private object? CreateInstance(Type type)
{
var constructors = type.GetConstructors();
var constructorList = constructors.ToList();
constructorList = [.. constructorList.OrderByDescending(s => s.GetParameters().Length)];
foreach (var constructor in constructorList)
{
var parameters = constructor.GetParameters();
if (parameters.Length == 0) return Activator.CreateInstance(type);
List<object> arguments = [];
foreach (var parameter in parameters)
{
object par = _componentContext.Resolve(parameter.ParameterType);
arguments.Add(par);
}
return Activator.CreateInstance(type, [.. arguments]);
}
return Activator.CreateInstance(type);
}
}

View File

@ -0,0 +1,3 @@

该文件夹是传统扫码方式的处理逻辑 0001NoRead

View File

@ -18,9 +18,13 @@ public class AppRouterMethodDao
try
{
var sqlFuc = CommonTool.DbServe.Queryable<AppRouterMethod>()
.WhereIF(routerMethod.Area == default, w => w.Area == routerMethod.Area)
.WhereIF(routerMethod.ClassName == default, w => w.ClassName == routerMethod.ClassName)
.WhereIF(routerMethod.Remark == default, w => w.Remark == routerMethod.Remark);
.WhereIF(routerMethod.Area != default, w => w.Area == routerMethod.Area)
.WhereIF(routerMethod.ClassName != default, w => w.ClassName == routerMethod.ClassName)
.WhereIF(routerMethod.RouterStatus != default, w => w.RouterStatus == routerMethod.RouterStatus)
.WhereIF(routerMethod.ReadFailRouter != default, w => w.ReadFailRouter == routerMethod.ReadFailRouter)
.WhereIF(routerMethod.ErrRouter != default, w => w.ErrRouter == routerMethod.ErrRouter)
.WhereIF(routerMethod.AllowDirection != default, w => w.AllowDirection == routerMethod.AllowDirection)
.WhereIF(routerMethod.Remark != default, w => w.Remark == routerMethod.Remark);
return sqlFuc.ToList();
}
catch(Exception ex)

View File

@ -75,6 +75,12 @@ public class AppConveyTask
[SugarColumn(ColumnName = "complete_time")]
public DateTime? CompleteTime { get; set; }
/// <summary>
/// 备注信息
/// </summary>
[SugarColumn(ColumnName = "remark")]
public string? Remark { get; set; }

View File

@ -5,6 +5,10 @@ namespace WcsMain.DataBase.TableEntity;
/// <summary>
/// tbl_app_router_method
/// </summary>
/// <remarks>
///
/// 箱式线每个请求点位的处理逻辑
/// </remarks>
[SugarTable("tbl_app_router_method")]
public class AppRouterMethod
{
@ -20,6 +24,30 @@ public class AppRouterMethod
[SugarColumn(ColumnName = "class_name")]
public string? ClassName { get; set; }
/// <summary>
/// 路由状态
/// </summary>
[SugarColumn(ColumnName = "router_status")]
public int? RouterStatus { get; set; }
/// <summary>
/// 读码失败时的路向
/// </summary>
[SugarColumn(ColumnName = "read_fail_router")]
public int? ReadFailRouter { get; set; }
/// <summary>
/// 异常时的路向
/// </summary>
[SugarColumn(ColumnName = "err_router")]
public int? ErrRouter { get; set; }
/// <summary>
/// 允许的方向
/// </summary>
[SugarColumn(ColumnName = "allow_direction")]
public string? AllowDirection { get; set; }
/// <summary>
/// 备注
/// </summary>

View File

@ -63,6 +63,48 @@ public class ConveyOperation
}
/// <summary>
/// 读取扫码点信息
/// </summary>
/// <param name="scanId"></param>
/// <returns></returns>
public (string? errText, short scanOk, string code) ReadScanInfo(string? scanId)
{
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return ("PLC尚未连接。", 0, "");
var readResult = CommonTool.Siemens.ReadByteWithName($"扫码读取{scanId}", 22);
if (!readResult.Success || readResult.Value == default) return (readResult.Message, 0, "");// 读取失败
try
{
var readData = readResult.Value;
short status = Convert.ToInt16(CommonTool.Siemens.Trans<short>(readData, 0)); // PLC 返回任务状态
string code = Regex.Replace(Encoding.ASCII.GetString(readData, 2, 20), "\\W", "");
return (string.Empty, status, code);
}
catch (Exception ex)
{
return (ex.Message, 0, "");
}
}
/// <summary>
/// 清除扫码状态
/// </summary>
/// <param name="scanId"></param>
/// <returns></returns>
public string ClearScanStatus(string? scanId)
{
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return "PLC尚未连接。";
var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName($"扫码读取{scanId}", (short)0);
if (!writeResult.Success) return writeResult.Message ?? "写入失败";
return string.Empty;
}
@ -207,61 +249,5 @@ public class ConveyOperation
}
/// <summary>
/// 读取扫码点信息
/// </summary>
/// <param name="scanId"></param>
/// <returns></returns>
public (string? errText, short scanOk, string code) ReadScanInfo(string scanId)
{
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default)
{
// 未连接PLC
return ("PLC尚未连接。", 0, "");
}
var readResult = CommonTool.Siemens.ReadByteWithName($"扫码读取{scanId}", 22);
if (!readResult.Success || readResult.Value == default) // 读取失败
{
return (readResult.Message, 0, "");
}
try
{
var readData = readResult.Value;
short status = Convert.ToInt16(CommonTool.Siemens.Trans<short>(readData, 0)); // PLC 返回任务状态
string code = Regex.Replace(Encoding.ASCII.GetString(readData, 2, 20), "\\W", "");
return (string.Empty, status, code);
}
catch (Exception ex)
{
return (ex.Message, 0, "");
}
}
/// <summary>
/// 清除扫码状态
/// </summary>
/// <param name="scanId"></param>
/// <returns></returns>
public string ClearScanStatus(string scanId)
{
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default)
{
// 未连接PLC
return "PLC尚未连接。";
}
var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName($"扫码读取{scanId}", (short)0);
if (!writeResult.Success) // 读取失败
{
return writeResult.Message ?? "写入失败";
}
try
{
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
}

View File

@ -1,4 +1,5 @@
using System.Text.RegularExpressions;
using HslCommunication;
using System.Text.RegularExpressions;
namespace WcsMain.ExtendMethod;
@ -58,6 +59,21 @@ public static partial class StringExtendMethod
}
}
/// <summary>
/// 格式化条码,返回条码和方位码
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static (string code, string direction) FormatDir(this string? value)
{
if (string.IsNullOrEmpty(value)) return (string.Empty, string.Empty);
string[] vals = value.Split('-');
if (vals.Length < 2) return (value, string.Empty);
string direction = vals[^1];
string code = value.RemoveLast(direction.Length + 1);
return (code, direction);
}
/// <summary>

View File

@ -40,7 +40,6 @@
<Folder Include="ApiServe\Controllers\Dto\CommonEntity\" />
<Folder Include="ApiServe\Service\TestService\" />
<Folder Include="Business\CirculationTask\Container\" />
<Folder Include="Business\CirculationTask\Convey\" />
<Folder Include="Business\CirculationTask\Shuttle\" />
<Folder Include="Business\Stacker\" />
<Folder Include="Business\StackerConvey\" />