<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>
public static class CommonData
{
/// <summary>
/// IOC
/// </summary>
[NotNull]
public static IContainer? Container { get; set; }
/// <summary>
/// 系统设置项,加载于 appsettings.json
@ -40,6 +35,11 @@ public static class CommonData
[NotNull]
public static List<AppLocation>? AppLocations { get; set; }
/// <summary>
/// 电子标签基础资料
/// </summary>
[NotNull]
public static List<AppElTagBase>? AppElTags { get; set; }
/// <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.TableEntity;
using WcsMain.ElTag.Atop.AtopEnum;
using WcsMain.ElTag.Atop.Entity;
using WcsMain.Enum.General;
using WcsMain.Enum.TaskEnum;
using WcsMain.Enum.Tcp;
using WcsMain.Tcp.Entity;
using WcsMain.WcsAttribute.AutoFacAttribute;
@ -26,7 +31,7 @@ public class ConnectOprServe(AppTcpDao tcpDao, BaseOprDataHandler baseOprDataHan
CommonTool.OprTcpClient = new OprTcpClient();
CommonTool.OprTcpClient.SetConnecting((tcpData) => ConsoleLog.Info($"电子标签:{tcpData} 正在连接"));
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.SetGetData(GetData);
}
@ -52,6 +57,66 @@ public class ConnectOprServe(AppTcpDao tcpDao, BaseOprDataHandler baseOprDataHan
}, 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>
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
{
/// <summary>
/// 控制器别称
/// </summary>
public string? ControllerDisplayName { get; set; }
/// <summary>
/// 按下的按键类型
@ -36,8 +40,10 @@ public class TagReturnInfo
public string? Ip { get; set; }
public int Abbr { get; set; }
/// <summary>
/// 标签 ID
/// </summary>
public int TagId { get; set; }
/// <summary>
/// 传回消息的端口 ---- 注意不是控制器端口
@ -48,4 +54,11 @@ public class TagReturnInfo
/// 返回的数据
/// </summary>
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>
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>
/// 展示标签的ID
/// </summary>
@ -73,7 +105,7 @@ public class TagSendInfo
data[6] = 0x1F;
data[7] = tagId;
data[8] = 0;
data[9] = (byte)ledColor;
data[9] = Convert.ToByte(ledColor);
return data;
}
@ -92,7 +124,39 @@ public class TagSendInfo
data[6] = 0x1F;
data[7] = tagId;
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;
}
}

View File

@ -11,17 +11,6 @@ namespace WcsMain.ElTag.Atop;
/// </summary>
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]
public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs, SocketOperation socketOperation,
AppStackerDao appStackerDao, AppLocationDao appLocationDao, AppConfigDao appConfigDao, ConnectPlcServe connectPlcServe,
ConnectOprServe connectOprServe)
ConnectOprServe connectOprServe, AppElTagBaseDao appElTagBaseDao)
{
private readonly AppConfigDao _appconfigDao = appConfigDao;
private readonly AppLocationDao _applocationDao = appLocationDao;
@ -29,6 +29,7 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
private readonly WcsCirculation _wcsCirculation = wcsCirculation;
private readonly ConnectPlcServe _connectPlcServe = connectPlcServe;
private readonly ConnectOprServe _connectOprServe = connectOprServe;
private readonly AppElTagBaseDao _appElTagBaseDao = appElTagBaseDao;
private static string _errMsg = string.Empty;
@ -40,6 +41,7 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
LoadingConfig(); // 加载数据库中的配置项 (config 表)
LoadingStackerData(); // 加载数据库中的堆垛机信息
LoadingLocationData(); // 加载数据库中的库位信息
LoadElTagBase(); // 加载电子标签基础资料
if (!string.IsNullOrEmpty(_errMsg))
{
@ -195,4 +197,20 @@ public class ServiceStart(WcsCirculation wcsCirculation, ConnectPLCs connectPLCs
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);
if (readLength > 0)
{
bytes = bytes.Take(readLength).ToArray();
serveData.RecvMsgTime = DateTime.Now;
_getData?.BeginInvoke(serveData, bytes, null, null);
_getMessage?.BeginInvoke(serveData, Encoding.ASCII.GetString(bytes), null, null);
_getData?.Invoke(serveData, bytes);
_getMessage?.Invoke(serveData, Encoding.ASCII.GetString(bytes));
continue;
}
_connectOffline?.Invoke(serveData);
@ -173,10 +174,10 @@ public class BaseTcpClient
}
if (tcpServe.TcpClient == default) return;
// 尝试发送消息
var networkStream = tcpServe.TcpClient.GetStream();
byte[] bytes = [];
try
{
var networkStream = tcpServe.TcpClient.GetStream();
byte[] bytes = [];
networkStream.Write(bytes);
}
catch