change-提交520测试

master
liuwf 7 months ago
parent 75283b1895
commit c45080e27f

@ -156,6 +156,36 @@ namespace SlnMesnac.Business.@base
}
}
/// <summary>
/// 使用---根据RFID Key读取RFID信息
/// </summary>
/// <param name="rfidKey"></param>
/// <param name="epcStr"></param>
/// <exception cref="InvalidOperationException"></exception>
public string ReadEpcStrByRfidKey(string rfidKey)
{
try
{
string epcStr = string.Empty;
var rfidEquip = GetRfidByKey(rfidKey);
if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false)
{
return "";
}
List<TagInfo> tagInfoList = rfidEquip.GetRFID();
if (tagInfoList == null || tagInfoList.Count == 0) return "";
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
epcStr = epcStr.Replace(" ", "").Replace("\r\n", "").Replace("\0", "").Replace("\n", "");
return epcStr;
}
catch (Exception ex)
{
// throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}");
return "";
}
}
/// <summary>
/// 使用---根据RFID Key读取光电信号
/// 有物体返回true

@ -1,4 +1,5 @@
using SlnMesnac.Common;
using Microsoft.IdentityModel.Logging;
using SlnMesnac.Common;
using SlnMesnac.Model.dto;
using SlnMesnac.Rfid.Dto;
using SlnMesnac.Rfid.Enum;
@ -229,6 +230,65 @@ namespace SlnMesnac.Rfid.Factory
}
}
public override List<TagInfo> GetRFID(int timeout = 3000)
{
byte[] u16byte = new byte[2];
byte[] bCRC = new byte[4];
try
{
#region 指令封装
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[8];
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x02;
pMessagePack.m_pData[3] = 0x02;
//1s
pMessagePack.m_pData[4] = 0x03;
pMessagePack.m_pData[5] = 0xE8;
//2s
//pMessagePack.m_pData[4] = 0x07;
//pMessagePack.m_pData[5] = 0xD0;
//3s
//pMessagePack.m_pData[4] = 0x0B;
//pMessagePack.m_pData[5] = 0xA0;
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4);
pMessagePack.m_pData[6] = _stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[7] = 0x0D;
#endregion 指令封装
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if (response.Data != null && response.Data.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
}
return false;
}
});
// 使用同步方法发送数据并获取响应
byte[] reciveBuffer = waitClient.SendThenReturn(pMessagePack.m_pData, timeout);
byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length);
List<TagInfo> tagInfoList = Device_DealTagInfoList(resultBuffer);
return tagInfoList;
}
catch (Exception e)
{
throw new InvalidOperationException($"按时间段盘点异常:{e.Message}");
}
}
/// <summary>
/// 使用--异步获取光电状态
/// </summary>

@ -79,6 +79,8 @@ namespace SlnMesnac.Rfid
/// <exception cref="InvalidOperationException"></exception>
public abstract Task<List<TagInfo>> GetRFIDAsync(int timeout = 5000);
public abstract List<TagInfo> GetRFID(int timeout = 3000);
/// <summary>
/// 使用--异步获取光电状态
/// </summary>

@ -87,6 +87,7 @@ namespace SlnMesnac.WCS
public void Start()
{
StartCheckStatus();
GetAgvStatus();
DeleteTaskLogic();
//根据条件创建任务
@ -164,6 +165,7 @@ namespace SlnMesnac.WCS
//实时获取agv状态
MessageSynchronousLogic(agvEquipList);
//色粉库位有未取走色粉声光报警
ListeningTonerLocation();
}
catch (Exception ex)
@ -175,6 +177,30 @@ namespace SlnMesnac.WCS
});
}
/// <summary>
/// 获取agv状态
/// </summary>
private void GetAgvStatus()
{
List<WcsBaseEquip> agvEquipList = SqlSugarClient.Queryable<WcsBaseEquip>().Where(it => it.EquipType == 1).ToList();
Task.Run(async () =>
{
while (true)
{
try
{
//实时获取agv状态
MessageSynchronousLogic(agvEquipList);
}
catch (Exception ex)
{
_logger.Error($"获取agv状态异常:{ex.Message}");
}
await Task.Delay(1000 * 30);
}
});
}
#endregion
/// <summary>

@ -478,6 +478,7 @@ namespace SlnMesnac.WCS.WCS
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0);
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false);
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true);
_logger.Agv($"agv取走料{task.PalletInfoCode}3#忙碌状态清0");
}
}
}
@ -489,8 +490,6 @@ namespace SlnMesnac.WCS.WCS
return;
}
//workShop3Plc.writeStringByAddress(StaticData.GetPlcAddress("3#小料箱下料点机台号"), "", 6);
//workShop3Plc.writeStringByAddress(StaticData.GetPlcAddress("3#小料箱下料点RFID号"), "", 12);
//解锁起始库位忙碌状态
WcsBaseEquip? startEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(it => it.AgvPositionCode == task.CurrPointNo);
sqlSugarClient.AsTenant().BeginTran();
@ -616,6 +615,7 @@ namespace SlnMesnac.WCS.WCS
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#取完成"), true);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#接驳位到位信号"), false);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#缓存空进AGV任务反馈"), false);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出接驳位信号"), false);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出一个空托盘信号"), false);
}
}
@ -696,7 +696,15 @@ namespace SlnMesnac.WCS.WCS
}
else if (outFlag == 1)
{ //托盘已经离开wcs通知agv离开
await ContinueTaskHandle(task);
bool result = await ContinueTaskHandle(task);
if (result)
{
//从下料点直接取清空RFID及机台号条码等信息--ok
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0);
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0);
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false);
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true);
}
}
}
else if (task.TaskStatus == 10) //任务完成wcs复位3#接驳位信号,删除任务
@ -738,21 +746,16 @@ namespace SlnMesnac.WCS.WCS
}
else if (task.TaskStatus == 2) //取完料箱前往目的地
{
//解锁起始库位
WcsBaseEquip? baseEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(t => t.AgvPositionCode == task.CurrPointNo);
if (baseEquip != null)
{
sqlSugarClient.AsTenant().BeginTran();
try
{
baseEquip.EquipStatus = 0;
baseEquip.ContainerCode = null;
task.TaskStatus = 3;
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = task.TaskStatus;
}
sqlSugarClient.Updateable(baseEquip).ExecuteCommand();
sqlSugarClient.Updateable(task).ExecuteCommand();
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
sqlSugarClient.AsTenant().CommitTran();
@ -782,6 +785,14 @@ namespace SlnMesnac.WCS.WCS
busyFlag = workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"));
if (busyFlag == 0)
{
//解锁起始库位
WcsBaseEquip? baseEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(t => t.AgvPositionCode == task.CurrPointNo);
if (baseEquip != null)
{
baseEquip.EquipStatus = 0;
baseEquip.ContainerCode = null;
sqlSugarClient.Updateable(baseEquip).ExecuteCommand();
}
//抢占线体状态agv进入接驳位
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1);
await ContinueTaskHandle(task);

@ -44,7 +44,10 @@ namespace SlnMesnac.WCS.WCS
CreateTaskByReadPlcSignal();
//监听2#计量室旋转移栽plc信号处理相关流程
ListeningWorkShop2TransplantingMachine();
var CreateProductTaskByLocationCodeThread = new Thread(ListeningWorkShop2TransplantingMachine);
CreateProductTaskByLocationCodeThread.IsBackground = true;
CreateProductTaskByLocationCodeThread.Name = "监听1#2#计量室旋转移栽plc信号处理连廊箱体旋转相关流程";
CreateProductTaskByLocationCodeThread.Start();
}
/// <summary>
@ -135,8 +138,6 @@ namespace SlnMesnac.WCS.WCS
/// 监听2#计量室旋转移栽plc信号处理连廊箱体旋转相关流程
/// </summary>
private void ListeningWorkShop2TransplantingMachine()
{
Task.Run(async () =>
{
while (true)
{
@ -152,7 +153,6 @@ namespace SlnMesnac.WCS.WCS
//2#接驳位色粉派送至色粉存放点任务
if (workShop2Plc != null && workShop2Plc.IsConnected)
{
_logger.Info("22222=============");
bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"));
int busy2Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"));
int Amount = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#缓存链条线库存数"));
@ -160,15 +160,17 @@ namespace SlnMesnac.WCS.WCS
bool anyTonerPallet = HasAnyTonerInLine();
if (returnJudgeSignal && busy2Flag == 0 && (Amount < 3 || anyTonerPallet))
{
string rfid = await ReadEpcStrByRfidKeyAsync("2#Transplant");
string rfid = ReadEpcStrByRfidKey("2#Transplant");
if (string.IsNullOrEmpty(rfid))
{//二次读取
rfid = await ReadEpcStrByRfidKeyAsync("2#Transplant");
rfid = ReadEpcStrByRfidKey("2#Transplant");
}
if (!string.IsNullOrEmpty(rfid))
{
//让其他线程
Thread.Sleep(4000);
busy2Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"));
if (!string.IsNullOrEmpty(rfid) && busy2Flag == 0)
if (busy2Flag == 0)
{
// 判断有无色粉, 如果没有色粉wcs给 旋转移栽方向信号 写2plc将料箱运到 缓存皮带线。
WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().First(it => it.PalletInfoCode == rfid);
@ -180,6 +182,7 @@ namespace SlnMesnac.WCS.WCS
if (createResult)
{
//3色粉上提升机移栽等待
_logger.Info($"2#移栽===={rfid}携带色粉去往色粉库位");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 3);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
@ -187,6 +190,7 @@ namespace SlnMesnac.WCS.WCS
else
{ //色粉库位无空闲位置,空转一圈
//2空箱转运
_logger.Info($"2#移栽===={rfid}携带色粉,色粉库位无空闲位置,空转一圈");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
@ -195,6 +199,7 @@ namespace SlnMesnac.WCS.WCS
else if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 0) //携带满料
{
//2空箱转运
_logger.Info($"2#移栽===={rfid}携带满料,空转一圈");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
@ -204,6 +209,7 @@ namespace SlnMesnac.WCS.WCS
if (Amount < 3)
{
//1上提升机去缓存线
_logger.Info($"2#移栽===={rfid}空箱,去缓存区");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 1);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
@ -211,15 +217,18 @@ namespace SlnMesnac.WCS.WCS
else
{
//2空箱转运
_logger.Info($"2#移栽===={rfid}空箱,空箱转运");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
}
}
}
}
else
{
//没读到2空箱转运
// _logger.Info($"1#移栽====没读到,空箱转运");
//workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
//workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2);
//workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false);
@ -233,31 +242,39 @@ namespace SlnMesnac.WCS.WCS
if (workShop2Plc != null && workShop2Plc.IsConnected)
{
_logger.Info("11111=============");
bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"));
int busy1Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("1#提升机忙碌状态"));
if (returnJudgeSignal && busy1Flag == 0)
{
//test
string rfid = await ReadEpcStrByRfidKeyAsync("1#MetrologyRoom");
string rfid = ReadEpcStrByRfidKey("1#MetrologyRoom");
if (string.IsNullOrEmpty(rfid))
{
rfid = await ReadEpcStrByRfidKeyAsync("1#MetrologyRoom");
rfid = ReadEpcStrByRfidKey("1#MetrologyRoom");
}
if (!string.IsNullOrEmpty(rfid))
{
// 判断有无料, 如果没有料wcs下发空箱旋转信号有料通知plc上提升机计量室
WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().First(it => it.PalletInfoCode == rfid);
if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 1) //携带色粉
{
//2空箱转运
_logger.Info($"1#移栽===={rfid}携带色粉,空箱转运");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false);
}
if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 0) //携带满料
{
//1#移栽平台任务1上提升机,2空箱转运
_logger.Info($"1#移栽===={rfid}携带满料,去提升机计量室");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 1);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false);
}
else if (wmsPalletInfo != null && wmsPalletInfo.Amount == 0)
{
//1#移栽平台任务1上提升机,2空箱转运
_logger.Info($"1#移栽===={rfid}空箱,空箱转运");
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2);
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false);
}
@ -266,6 +283,7 @@ namespace SlnMesnac.WCS.WCS
{
//没读到,当成空箱子旋转一圈
//1#移栽平台任务1上提升机,2空箱转运
// _logger.Info($"1#移栽====没读到,空箱转运");
//workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2);
//workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false);
}
@ -326,10 +344,9 @@ namespace SlnMesnac.WCS.WCS
}
finally
{
await Task.Delay(1000 * 2);
Thread.Sleep(1000 * 2);
}
}
});
}
#region 任务流程

@ -121,6 +121,7 @@ namespace SlnMesnac.WPF.ViewModel
private void Init()
{
StartCheckStatus();
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Tick += Timer_Tick;

Loading…
Cancel
Save