<add>[important]能点亮电子标签

This commit is contained in:
葛林强 2024-05-29 12:56:32 +08:00
parent 7023e6cefd
commit 46c9edc244
12 changed files with 483 additions and 27 deletions

View File

@ -0,0 +1,70 @@
using CirculateTool;
using WcsMain.Common;
using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity;
using WcsMain.ElTag.Atop;
using WcsMain.ElTag.Atop.Entity;
using WcsMain.Enum.TaskEnum;
namespace WcsMain.Business.CirculationTask.ElTag;
[Circulation]
public class LightElTag(AppElTagTaskDao tagTaskDao, ConnectOprServe connectOprServe)
{
private readonly AppElTagTaskDao _tagTaskDao = tagTaskDao;
private readonly ConnectOprServe _connectOprServe = connectOprServe;
/// <summary>
/// 点亮电子标签
/// </summary>
/// <returns></returns>
[Circulation("点亮电子标签")]
public bool Light()
{
List<AppElTagTask>? tasks = _tagTaskDao.Query(new AppElTagTask { TaskStatus = (int)ElTagTaskStatusEnum.NeedLight });
if (tasks == default)
{
ConsoleLog.Exception("【异常】查询 电子标签 任务失败,数据库连接异常");
Thread.Sleep(5000);
return true;
}
tasks.ForEach(LightTask);
return true;
}
/// <summary>
/// 执行点亮标签任务
/// </summary>
/// <param name="tagTask"></param>
public void LightTask(AppElTagTask tagTask)
{
if (CommonData.AppElTags == default || CommonData.AppElTags.Count < 1) return;
var tagInfo = CommonData.AppElTags.Find(f => f.Location == tagTask.Location);
if(tagInfo == default)
{
ConsoleLog.Warning($"【警告】电子标签:{tagTask.Location} 不存在,无法点亮");
_tagTaskDao.Update(new AppElTagTask
{
TaskId = tagTask.TaskId,
TaskStatus = (int)ElTagTaskStatusEnum.Error,
ConfirmTime = DateTime.Now,
Remark = "点位不存在"
});
return;
}
/* 点亮标签 */
var resultException = _connectOprServe.ShowMsg(tagInfo.ControllerDisplayName, tagInfo.TagId, tagTask.NeedNum);
if(resultException == default )
{
_tagTaskDao.Update(new AppElTagTask
{
TaskId = tagTask.TaskId,
TaskStatus = (int)ElTagTaskStatusEnum.Lighting,
LightTime = DateTime.Now,
});
}
}
}

View File

@ -10,11 +10,6 @@ namespace WcsMain.Common;
/// </summary> /// </summary>
public static class CommonData public static class CommonData
{ {
/// <summary>
/// IOC
/// </summary>
[NotNull]
public static IContainer? Container { get; set; }
/// <summary> /// <summary>
/// 系统设置项,加载于 appsettings.json /// 系统设置项,加载于 appsettings.json
@ -40,6 +35,11 @@ public static class CommonData
[NotNull] [NotNull]
public static List<AppLocation>? AppLocations { get; set; } public static List<AppLocation>? AppLocations { get; set; }
/// <summary>
/// 电子标签基础资料
/// </summary>
[NotNull]
public static List<AppElTagBase>? AppElTags { get; set; }
/// <summary> /// <summary>

View File

@ -0,0 +1,43 @@
using WcsMain.Common;
using WcsMain.DataBase.TableEntity;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.DataBase.Dao;
[Component]
public class AppElTagBaseDao
{
/// <summary>
/// 条件查询
/// </summary>
/// <param name="queryData"></param>
/// <returns></returns>
public List<AppElTagBase>? Query(AppElTagBase queryData)
{
try
{
var sqlFuc = CommonTool.DbServe.Queryable<AppElTagBase>()
.WhereIF(queryData.Location != default, w => w.Location == queryData.Location)
.WhereIF(queryData.TagName != default, w => w.TagName == queryData.TagName)
.WhereIF(queryData.TagId != default, w => w.TagId == queryData.TagId)
.WhereIF(queryData.TagType != default, w => w.TagType == queryData.TagType)
.WhereIF(queryData.ControllerDisplayName != default, w => w.ControllerDisplayName == queryData.ControllerDisplayName)
.WhereIF(queryData.Area != default, w => w.Area == queryData.Area)
.WhereIF(queryData.LedStatus != default, w => w.LedStatus == queryData.LedStatus)
.WhereIF(queryData.Remark != default, w => w.Remark == queryData.Remark);
return sqlFuc.ToList();
}
catch(Exception ex)
{
_ = ex;
return default;
}
}
/// <summary>
/// 查询所有
/// </summary>
/// <returns></returns>
public List<AppElTagBase>? Query() => Query(new AppElTagBase());
}

View File

@ -0,0 +1,66 @@
using WcsMain.Common;
using WcsMain.DataBase.TableEntity;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.DataBase.Dao;
[Component]
public class AppElTagTaskDao
{
/// <summary>
/// 条件查询
/// </summary>
/// <param name="queryData"></param>
/// <returns></returns>
public List<AppElTagTask>? Query(AppElTagTask queryData)
{
try
{
var sqlFuc = CommonTool.DbServe.Queryable<AppElTagTask>()
.WhereIF(queryData.TaskId != default, w => w.TaskId == queryData.TaskId)
.WhereIF(queryData.Location != default, w => w.Location == queryData.Location)
.WhereIF(queryData.OrderId != default, w => w.OrderId == queryData.OrderId)
.WhereIF(queryData.VehicleNo != default, w => w.VehicleNo == queryData.VehicleNo)
.WhereIF(queryData.GoodsId != default, w => w.GoodsId == queryData.GoodsId)
.WhereIF(queryData.GoodsName != default, w => w.GoodsName == queryData.GoodsName)
.WhereIF(queryData.TaskStatus != default, w => w.TaskStatus == queryData.TaskStatus)
.WhereIF(queryData.NeedNum != default, w => w.NeedNum == queryData.NeedNum)
.WhereIF(queryData.PickNum != default, w => w.PickNum == queryData.PickNum)
.WhereIF(queryData.Remark != default, w => w.Remark == queryData.Remark);
return sqlFuc.ToList();
}
catch(Exception ex)
{
_ = ex;
return default;
}
}
/// <summary>
/// 全部查询
/// </summary>
/// <returns></returns>
public List<AppElTagTask>? Query() => Query(new AppElTagTask());
/// <summary>
/// 根据主键更新
/// </summary>
/// <param name="updateData"></param>
/// <returns></returns>
public int Update(AppElTagTask updateData)
{
try
{
var sqlFuc = CommonTool.DbServe.Updateable(updateData).IgnoreColumns(ignoreAllNullColumns: true);
return sqlFuc.ExecuteCommand();
}
catch (Exception ex)
{
_ = ex;
return 0;
}
}
}

View File

@ -0,0 +1,88 @@
using SqlSugar;
namespace WcsMain.DataBase.TableEntity;
[SugarTable("tbl_app_eltag_task")]
public class AppElTagTask
{
/// <summary>
/// 任务号
/// </summary>
[SugarColumn(ColumnName = "task_id", IsPrimaryKey = true)]
public string? TaskId { get; set; }
/// <summary>
/// 点位
/// </summary>
[SugarColumn(ColumnName = "location")]
public string? Location { get; set; }
/// <summary>
/// 订单号
/// </summary>
[SugarColumn(ColumnName = "order_id")]
public string? OrderId { get; set; }
/// <summary>
/// 载具号
/// </summary>
[SugarColumn(ColumnName = "vehicle_no")]
public string? VehicleNo { get; set; }
/// <summary>
/// 物料编号
/// </summary>
[SugarColumn(ColumnName = "goods_id")]
public string? GoodsId { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(ColumnName = "goods_name")]
public string? GoodsName { get; set; }
/// <summary>
/// 任务状态
/// </summary>
[SugarColumn(ColumnName = "task_status")]
public int? TaskStatus { get; set; }
/// <summary>
/// 需求数量
/// </summary>
[SugarColumn(ColumnName = "need_num")]
public int? NeedNum { get; set; }
/// <summary>
/// 拣选数量
/// </summary>
[SugarColumn(ColumnName = "pick_num")]
public int? PickNum { get; set; }
/// <summary>
/// 任务创建时间
/// </summary>
[SugarColumn(ColumnName = "create_time")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 点亮时间
/// </summary>
[SugarColumn(ColumnName = "light_time")]
public DateTime? LightTime { get; set; }
/// <summary>
/// 确认时间
/// </summary>
[SugarColumn(ColumnName = "confirm_time")]
public DateTime? ConfirmTime { get; set;}
/// <summary>
/// 备注
/// </summary>
[SugarColumn(ColumnName = "remark")]
public string? Remark { get; set; }
}

View File

@ -1,7 +1,12 @@
using WcsMain.Common; using LedSimple;
using System.Xml.Linq;
using WcsMain.Common;
using WcsMain.DataBase.Dao; using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity; using WcsMain.DataBase.TableEntity;
using WcsMain.ElTag.Atop.AtopEnum;
using WcsMain.ElTag.Atop.Entity;
using WcsMain.Enum.General; using WcsMain.Enum.General;
using WcsMain.Enum.TaskEnum;
using WcsMain.Enum.Tcp; using WcsMain.Enum.Tcp;
using WcsMain.Tcp.Entity; using WcsMain.Tcp.Entity;
using WcsMain.WcsAttribute.AutoFacAttribute; using WcsMain.WcsAttribute.AutoFacAttribute;
@ -26,7 +31,7 @@ public class ConnectOprServe(AppTcpDao tcpDao, BaseOprDataHandler baseOprDataHan
CommonTool.OprTcpClient = new OprTcpClient(); CommonTool.OprTcpClient = new OprTcpClient();
CommonTool.OprTcpClient.SetConnecting((tcpData) => ConsoleLog.Info($"电子标签:{tcpData} 正在连接")); CommonTool.OprTcpClient.SetConnecting((tcpData) => ConsoleLog.Info($"电子标签:{tcpData} 正在连接"));
CommonTool.OprTcpClient.SetConnectFailAction((tcpData, ex) => ConsoleLog.Warning($"电子标签:{tcpData} 连接失败,参考信息:{ex.Message}")); CommonTool.OprTcpClient.SetConnectFailAction((tcpData, ex) => ConsoleLog.Warning($"电子标签:{tcpData} 连接失败,参考信息:{ex.Message}"));
CommonTool.OprTcpClient.SetConnectSuccess((tcpData) => ConsoleLog.Success($"电子标签:{tcpData} 连接成功")); CommonTool.OprTcpClient.SetConnectSuccess(ConnectSuccess);
CommonTool.OprTcpClient.SetConnectOffline((tcpData) => ConsoleLog.Warning($"电子标签:{tcpData} 失去连接")); CommonTool.OprTcpClient.SetConnectOffline((tcpData) => ConsoleLog.Warning($"电子标签:{tcpData} 失去连接"));
CommonTool.OprTcpClient.SetGetData(GetData); CommonTool.OprTcpClient.SetGetData(GetData);
} }
@ -52,6 +57,66 @@ public class ConnectOprServe(AppTcpDao tcpDao, BaseOprDataHandler baseOprDataHan
}, TaskCreationOptions.LongRunning); }, TaskCreationOptions.LongRunning);
} }
/// <summary>
/// 连接成功的事件 ---- 重置标签
/// </summary>
/// <param name="tcpServe"></param>
public void ConnectSuccess(TcpServeConnectionData tcpServe)
{
ConsoleLog.Success($"电子标签:{tcpServe.TcpServe!.TcpIp} 连接成功");
if (CommonData.AppElTags == default || CommonData.AppElTags.Count < 1) return;
var tagInfos = CommonData.AppElTags.FindAll(f => f.ControllerDisplayName == tcpServe.DisplayName);
if (tagInfos == default) return;
foreach (var tagInfo in tagInfos)
{
//CommonTool.OprTcpClient.Send(TagSendInfo.SetTagModel(Convert.ToByte(tagInfo.TagId), TagMode.Picking), tagInfo.ControllerDisplayName!);
//CommonTool.OprTcpClient.Send(TagSendInfo.(Convert.ToByte(tagInfo.TagId)), tagInfo.ControllerDisplayName!);
}
for (int i = 0; i < 5; i++)
{
foreach (var tagInfo in tagInfos)
{
CommonTool.OprTcpClient.Send(TagSendInfo.ShowTagId(Convert.ToByte(tagInfo.TagId)), tagInfo.ControllerDisplayName!);
//CommonTool.OprTcpClient.Send(TagSendInfo.LedColor(Convert.ToByte(tagInfo.TagId), LedColor.Green), tagInfo.ControllerDisplayName!);
//ShowMsg(tagInfo.ControllerDisplayName, tagInfo.TagId, 999, ledStatus: LedStatus.LEDOn);
}
Thread.Sleep(200);
foreach (var tagInfo in tagInfos)
{
CommonTool.OprTcpClient.Send(TagSendInfo.TurnOffTag(Convert.ToByte(tagInfo.TagId)), tagInfo.ControllerDisplayName!);
}
Thread.Sleep(200);
}
}
/// <summary>
/// 向标签发送一个显示值
/// </summary>
/// <param name="controllerDisplayName"></param>
/// <param name="tagId"></param>
/// <param name="value"></param>
/// <param name="ledColor"></param>
/// <param name="ledStatus"></param>
/// <returns></returns>
public Exception? ShowMsg(string? controllerDisplayName, int? tagId, int? value, LedColor ledColor = LedColor.Green, LedStatus ledStatus = LedStatus._0_5secblinking)
{
if(controllerDisplayName == default || tagId == default || value == default)
{
return new Exception("必须的值为空,无法发送电子标签");
}
if (value > 999) value = 999;
byte[] elTagData = TagSendInfo.ShowValue(Convert.ToByte(tagId), value.ToString()!);
var sendResult = CommonTool.OprTcpClient.Send(elTagData, controllerDisplayName); // 显示字符
CommonTool.OprTcpClient.Send(TagSendInfo.LedColor(Convert.ToByte(tagId), ledColor), controllerDisplayName); // 显示颜色
CommonTool.OprTcpClient.Send(TagSendInfo.LedStatus(Convert.ToByte(tagId), ledStatus), controllerDisplayName); // 显示闪烁频率
if (sendResult.Success) return default;
return sendResult.Exception;
}
@ -62,6 +127,31 @@ public class ConnectOprServe(AppTcpDao tcpDao, BaseOprDataHandler baseOprDataHan
/// <param name="datas"></param> /// <param name="datas"></param>
public void GetData(TcpServeConnectionData tcpServe, byte[] datas) public void GetData(TcpServeConnectionData tcpServe, byte[] datas)
{ {
TagReturnInfo returnInfo = new()
{
ControllerDisplayName = tcpServe.DisplayName,
Ip = tcpServe.TcpServe!.TcpIp,
Port = Convert.ToInt32(datas[2]) == 0x60 ? 1 : 2,
SubCommand = Convert.ToInt32(datas[6]),
TagId = datas.Length > 7 ? Convert.ToInt32(datas[7]) : 0
};
if (returnInfo.SubCommand == 6 || returnInfo.SubCommand == 7)
{
if (datas[8] >= 160) returnInfo.SubCommand = 8;
List<string> returnData = [];
for (int i = 8; i < datas.Length; i++)
{
if (i == 8 && datas[8] >= 160)
{
returnData.Add(datas[8] == 160 ? Convert.ToString(Convert.ToChar(32)) : Convert.ToString(Convert.ToChar(datas[8] - 128)));
continue;
}
if (datas[i] > 0) returnData.Add(Convert.ToString(Convert.ToChar(datas[i])));
}
returnInfo.Data = string.Join("", returnData);
}
ConsoleLog.Info($"电子标签获取返回值:{returnInfo}");
} }

View File

@ -2,6 +2,10 @@
public class TagReturnInfo public class TagReturnInfo
{ {
/// <summary>
/// 控制器别称
/// </summary>
public string? ControllerDisplayName { get; set; }
/// <summary> /// <summary>
/// 按下的按键类型 /// 按下的按键类型
@ -36,8 +40,10 @@ public class TagReturnInfo
public string? Ip { get; set; } public string? Ip { get; set; }
/// <summary>
public int Abbr { get; set; } /// 标签 ID
/// </summary>
public int TagId { get; set; }
/// <summary> /// <summary>
/// 传回消息的端口 ---- 注意不是控制器端口 /// 传回消息的端口 ---- 注意不是控制器端口
@ -48,4 +54,11 @@ public class TagReturnInfo
/// 返回的数据 /// 返回的数据
/// </summary> /// </summary>
public string? Data { get; set; } public string? Data { get; set; }
public override string ToString()
{
return $"控制器别称:{ControllerDisplayName}标签Id{TagId},提交方式:{SubCommand},提交数据:{Data}";
}
} }

View File

@ -8,6 +8,38 @@ namespace WcsMain.ElTag.Atop.Entity;
/// </summary> /// </summary>
public class TagSendInfo public class TagSendInfo
{ {
/// <summary>
/// 标签自检 ????
/// </summary>
/// <returns></returns>
public static byte[] CheckAllTag()
{
byte[] data = new byte[7];
data[0] = 7;
data[1] = 0;
data[2] = 0x60;
data[6] = 0x09;
return data;
}
/// <summary>
/// 设置标签模式
/// </summary>
/// <param name="tagId"></param>
/// <param name="tagMode"></param>
/// <returns></returns>
public static byte[] SetTagModel(byte tagId, TagMode tagMode)
{
byte[] data = new byte[8];
data[0] = 8;
data[1] = 0;
data[2] = 0x60;
data[6] = tagMode == TagMode.Stock ? (byte)0x19 : (byte)0x1A;
data[7] = tagId;
return data;
}
/// <summary> /// <summary>
/// 展示标签的ID /// 展示标签的ID
/// </summary> /// </summary>
@ -73,7 +105,7 @@ public class TagSendInfo
data[6] = 0x1F; data[6] = 0x1F;
data[7] = tagId; data[7] = tagId;
data[8] = 0; data[8] = 0;
data[9] = (byte)ledColor; data[9] = Convert.ToByte(ledColor);
return data; return data;
} }
@ -92,7 +124,39 @@ public class TagSendInfo
data[6] = 0x1F; data[6] = 0x1F;
data[7] = tagId; data[7] = tagId;
data[8] = 4; data[8] = 4;
data[9] = (byte)ledStatus; data[9] = Convert.ToByte(ledStatus);
return data;
}
/// <summary>
/// 展示字符串
/// </summary>
/// <param name="tagId"></param>
/// <param name="value"></param>
/// <returns></returns>
public static byte[] ShowValue(byte tagId, string? value)
{
if(string.IsNullOrEmpty(value)) value = string.Empty;
if(value.Length < 6)
{
value = value.PadLeft(6, '0');
}
else
{
value = value.Substring(value.Length - 6, 6);
}
byte[] data = new byte[15];
data[0] = 0x0f;
data[1] = 0;
data[2] = 0x60;
data[6] = 0x00;
data[7] = tagId;
for (int i = 0; i < value.Length; i++)
{
data[8 + i] = Convert.ToByte(value[i]);
}
data[14] = 0x00;
return data; return data;
} }
} }

View File

@ -13,15 +13,4 @@ public class OprTcpClient : BaseTcpClient
{ {
/// <summary>
/// 连接电子标签客户端
/// </summary>
public void Send()
{
}
} }

View File

@ -0,0 +1,14 @@
namespace WcsMain.Enum.TaskEnum;
/// <summary>
/// 电子标签任务状态枚举
/// </summary>
public enum ElTagTaskStatusEnum
{
NeedLight = 0, // 待点亮
Lighting = 1, // 点亮种
Confirm = 2, // 已确认
Error = 9, // 发生异常
}

View File

@ -19,7 +19,7 @@ namespace WcsMain.StartAction;
[Component] [Component]
public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs, SocketOperation socketOperation, public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs, SocketOperation socketOperation,
AppStackerDao appStackerDao, AppLocationDao appLocationDao, AppConfigDao appConfigDao, ConnectPlcServe connectPlcServe, AppStackerDao appStackerDao, AppLocationDao appLocationDao, AppConfigDao appConfigDao, ConnectPlcServe connectPlcServe,
ConnectOprServe connectOprServe) ConnectOprServe connectOprServe, AppElTagBaseDao appElTagBaseDao)
{ {
private readonly AppConfigDao _appconfigDao = appConfigDao; private readonly AppConfigDao _appconfigDao = appConfigDao;
private readonly AppLocationDao _applocationDao = appLocationDao; private readonly AppLocationDao _applocationDao = appLocationDao;
@ -29,6 +29,7 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
private readonly WcsCirculation _wcsCirculation = wcsCirculation; private readonly WcsCirculation _wcsCirculation = wcsCirculation;
private readonly ConnectPlcServe _connectPlcServe = connectPlcServe; private readonly ConnectPlcServe _connectPlcServe = connectPlcServe;
private readonly ConnectOprServe _connectOprServe = connectOprServe; private readonly ConnectOprServe _connectOprServe = connectOprServe;
private readonly AppElTagBaseDao _appElTagBaseDao = appElTagBaseDao;
private static string _errMsg = string.Empty; private static string _errMsg = string.Empty;
@ -40,6 +41,7 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
LoadingConfig(); // 加载数据库中的配置项 (config 表) LoadingConfig(); // 加载数据库中的配置项 (config 表)
LoadingStackerData(); // 加载数据库中的堆垛机信息 LoadingStackerData(); // 加载数据库中的堆垛机信息
LoadingLocationData(); // 加载数据库中的库位信息 LoadingLocationData(); // 加载数据库中的库位信息
LoadElTagBase(); // 加载电子标签基础资料
if (!string.IsNullOrEmpty(_errMsg)) if (!string.IsNullOrEmpty(_errMsg))
{ {
@ -195,4 +197,20 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
CommonData.AppLocations = appLocations; CommonData.AppLocations = appLocations;
} }
/// <summary>
/// 加载电子标签基础资料
/// </summary>
public void LoadElTagBase()
{
if (!string.IsNullOrEmpty(_errMsg)) return;
ConsoleLog.Info("正在加载库位信息...");
List<AppElTagBase>? eltags = _appElTagBaseDao.Query();
if (eltags == default)
{
_errMsg = "加载电子标签基础信息失败,请检查数据库服务器连接是否正常";
CommonData.AppElTags = [];
return;
}
CommonData.AppElTags = eltags;
}
} }

View File

@ -108,9 +108,10 @@ public class BaseTcpClient
int readLength = await networkStream.ReadAsync(bytes); int readLength = await networkStream.ReadAsync(bytes);
if (readLength > 0) if (readLength > 0)
{ {
bytes = bytes.Take(readLength).ToArray();
serveData.RecvMsgTime = DateTime.Now; serveData.RecvMsgTime = DateTime.Now;
_getData?.BeginInvoke(serveData, bytes, null, null); _getData?.Invoke(serveData, bytes);
_getMessage?.BeginInvoke(serveData, Encoding.ASCII.GetString(bytes), null, null); _getMessage?.Invoke(serveData, Encoding.ASCII.GetString(bytes));
continue; continue;
} }
_connectOffline?.Invoke(serveData); _connectOffline?.Invoke(serveData);
@ -173,10 +174,10 @@ public class BaseTcpClient
} }
if (tcpServe.TcpClient == default) return; if (tcpServe.TcpClient == default) return;
// 尝试发送消息 // 尝试发送消息
var networkStream = tcpServe.TcpClient.GetStream();
byte[] bytes = [];
try try
{ {
var networkStream = tcpServe.TcpClient.GetStream();
byte[] bytes = [];
networkStream.Write(bytes); networkStream.Write(bytes);
} }
catch catch