change-修改入库出库应答字逻辑

collectionStore
liuwf 1 year ago
parent 3de61d612e
commit 02f2ca4c96

@ -261,8 +261,8 @@ namespace Aucma.Scada.Business
if (taskInfo != null)
{
PrintLogInfoMessage($"下发箱壳入库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (taskHandle.SendShellTask_InStore(taskInfo))
int result = taskHandle.SendShellTask_InStore(taskInfo);
if (result==1)
{
PrintLogInfoMessage($"箱壳入库任务:{taskInfo.taskCode}下发成功等待PLC执行反馈");
@ -276,11 +276,14 @@ namespace Aucma.Scada.Business
RefreshInStoreTaskEvent?.Invoke(taskInfo);
}
else if (result == 2)
{
PrintLogInfoMessage("箱壳入库任务下发失败PLC接收任务未就绪");
}
else
{
PrintLogInfoMessage($"箱壳入库任务:{taskInfo.taskCode}下发失败请排查PLC连接");
PrintLogInfoMessage($"箱壳入库任务:{taskInfo.taskCode};下发失败,请排PLC连接");
}
}
else
{
@ -303,8 +306,8 @@ namespace Aucma.Scada.Business
if (taskInfo != null)
{
PrintLogInfoMessage($"下发内胆入库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (taskHandle.SendLinerTask_InStore(taskInfo))
int result = taskHandle.SendLinerTask_InStore(taskInfo);
if (result==1)
{
PrintLogInfoMessage($"内胆入库任务:{taskInfo.taskCode}下发成功等待PLC执行反馈");
@ -318,9 +321,13 @@ namespace Aucma.Scada.Business
RefreshInStoreTaskEvent?.Invoke(taskInfo);
}
else if (result == 2)
{
PrintLogInfoMessage("箱壳入库任务下发失败PLC接收任务未就绪");
}
else
{
PrintLogInfoMessage($"内胆入库任务:{taskInfo.taskCode}下发失败请排除PLC连接");
PrintLogInfoMessage($"箱壳入库任务:{taskInfo.taskCode}下发失败请排除PLC连接");
}
}
else
@ -394,18 +401,18 @@ namespace Aucma.Scada.Business
if (spaceInfo != null)
{
taskHandle.WritePlc(spaceInfo.storeCode, spaceInfo.spaceCode, true);
//spaceInfo.materialType = taskInfo.materialType;
// taskHandle.WritePlc(spaceInfo.storeCode, spaceInfo.spaceCode, true);
spaceInfo.materialType = taskInfo.materialType;
spaceInfo.spaceStock = spaceInfo.spaceStock + 1;
spaceInfo.onRouteAmount -= 1;
// spaceInfo.spaceStock = spaceInfo.spaceStock + 1;
// spaceInfo.onRouteAmount -= 1;
//读取PLC获取货道信息存放数量、在途数量,
#region Add By wenjy 2023-10-30 13:44:00 通过PLC获取货道信息
var item = taskHandle.ReadSpaceInfoByPlc(spaceInfo);
spaceInfo.spaceStock = item.spaceStock;
spaceInfo.onRouteAmount = item.onRouteAmount;
spaceInfo.spaceStatus = item.spaceStatus;
// spaceInfo.spaceStatus = item.spaceStatus;
#endregion
_spaceInfoService.UpdateSpaceInfo(spaceInfo);

@ -2,6 +2,7 @@
using HighWayIot.Config;
using HighWayIot.Log4net;
using HighWayIot.Plc;
using HighWayIot.Repository.service;
using System;
using System.Collections.Generic;
using System.Linq;
@ -56,8 +57,8 @@ namespace Aucma.Scada.Business
/// <summary>
/// 已下传的任务信息
/// </summary>
private List<RealTaskInfo> shellTaskInfos = new List<RealTaskInfo>();
private List<RealTaskInfo> linerTaskInfos = new List<RealTaskInfo>();
// private List<RealTaskInfo> shellTaskInfos = new List<RealTaskInfo>();
// private List<RealTaskInfo> linerTaskInfos = new List<RealTaskInfo>();
#endregion
#region 委托事件
@ -78,17 +79,112 @@ namespace Aucma.Scada.Business
public event InStoreAnswer InStoreAnswerEvent;
#endregion
/// <summary>
/// 实时任务
/// </summary>
private IRealTaskInfoService _taskInfoService;
private RegisterServices registerServices = RegisterServices.Instance;
private InStoreTaskHandle()
{
_taskInfoService = registerServices.GetService<IRealTaskInfoService>();
_plcDictionary = _pool.GetAll();
RealReadFinish();
}
#region 判断箱壳,内胆入库是否完成
/// <summary>
/// 实时读取箱壳,内胆入库完成信号
/// </summary>
private void RealReadFinish()
{
// 箱壳线程
Task.Run(() =>
{
while (true)
{
if (_plcDictionary.Count > 0)
{
IPlc _plc = _plcDictionary[appConfig.shellStoreCode];
if (_plc != null && _plc.IsConnected)
{
List<RealTaskInfo> taskList = _taskInfoService.GetTaskInfosForInstore(appConfig.shellStoreCode, appConfig.instoreTaskType, 2);
if (taskList != null && taskList.Count > 0)
{
foreach (RealTaskInfo taskInfo in taskList)
{
SpaceAddress spaceAddress = spaceConfig.GetSpaceAddress(appConfig.shellStoreCode, taskInfo.spaceCode);
JudgeIsFinish(taskInfo, _plc, spaceAddress, appConfig.shellStoreCode);
}
}
}
else
{
logHelper.Info($"PLC信息为空或连接失败通过{appConfig.shellStoreCode}未获取到该仓库对应的PLC信息");
}
}
Thread.Sleep(1000);
};
});
//内胆线程
Task.Run(() =>
{
while (true)
{
if (_plcDictionary.Count > 0)
{
IPlc _plc = _plcDictionary[appConfig.linerStoreCode];
if (_plc != null && _plc.IsConnected)
{
// 修改这个方法
List<RealTaskInfo> taskList = _taskInfoService.GetTaskInfosForInstore(appConfig.linerStoreCode, appConfig.instoreTaskType, 2);
if (taskList != null && taskList.Count > 0)
{
foreach (RealTaskInfo taskInfo in taskList)
{
SpaceAddress spaceAddress = spaceConfig.GetSpaceAddress(appConfig.linerStoreCode, taskInfo.spaceCode);
JudgeIsFinish(taskInfo, _plc, spaceAddress, appConfig.linerStoreCode);
}
}
}
else
{
logHelper.Info($"PLC信息为空或连接失败通过{appConfig.linerStoreCode}未获取到该仓库对应的PLC信息");
}
}
Thread.Sleep(1000);
};
});
}
RealReadPlcSpace();
/// <summary>
/// 判断该任务对应的货道是否有完成信号
/// </summary>
/// <param name="taskInfo"></param>
/// <returns></returns>
public void JudgeIsFinish(RealTaskInfo taskInfo, IPlc _plc, SpaceAddress spaceAddress,string storeCode)
{
//读取入库完成反馈信号
if (_plc.readInt32ByAddress(spaceAddress.inStoreFinish) == 1)
{
_plc.writeInt32ByAddress(spaceAddress.inStoreFinish, 0);
InStoreFinsihEvent?.Invoke(storeCode, taskInfo.taskCode);
}
}
#endregion
#region 箱壳入库任务下发处理
public bool SendShellTask_InStore(RealTaskInfo taskInfo)
public int SendShellTask_InStore(RealTaskInfo taskInfo)
{
bool result = false;
int result = 0;
try
{
IPlc _plc = _plcDictionary[taskInfo.storeCode];
@ -97,17 +193,24 @@ namespace Aucma.Scada.Business
{
if (_plc.IsConnected)
{
//写入货道号
_plc.writeStringByAddress(plcConfig.in_shell_spaceCode, taskInfo.spaceCode);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.in_shell_answer, 1);
//写入任务号
_plc.writeStringByAddress(plcConfig.in_shell_task, taskInfo.taskCode);
//写入完成后读取应答字进行复位
ReadShellAnswer_InStore(taskInfo);
result = true;
if (_plc.readInt32ByAddress(plcConfig.in_shell_answer) == 1)
{
logHelper.Info("箱壳入库应答字为1货道号:" + plcConfig.in_shell_spaceCode + ";写" + short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入货道号
_plc.writeInt32ByAddress(plcConfig.in_shell_spaceCode, short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入完成后读取应答字进行复位
ReadShellAnswer_InStore(taskInfo);
//写入应答字
// _plc.writeInt32ByAddress(plcConfig.in_shell_answer, 1);
//写入任务号
// _plc.writeStringByAddress(plcConfig.in_shell_task, taskInfo.taskCode);
result = 1;
}
else
{
result = 2;
logHelper.PlcLog("应答字为2下发新任务plc未就绪");
}
}
else
{
@ -149,22 +252,18 @@ namespace Aucma.Scada.Business
//读取PLC应答字为2时上位机清空写入的入库内容
if (_plc.readInt32ByAddress(plcConfig.in_shell_answer) == 2)
{
logHelper.PlcLog("内胆入库应答字为2货道号:" + plcConfig.in_shell_spaceCode + ";复位写0");
//写入货道号
_plc.writeStringByAddress(plcConfig.in_shell_spaceCode, string.Empty);
_plc.writeInt32ByAddress(plcConfig.in_shell_spaceCode, 0);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.in_shell_answer, 0);
//写入任务号
_plc.writeStringByAddress(plcConfig.in_shell_task, string.Empty);
// _plc.writeInt32ByAddress(plcConfig.in_foam_answer, 0);
isFlag = false;
WritePlc(taskInfo.storeCode, taskInfo.spaceCode, false);
//ReadShellFinish_InStore(taskCode);
InStoreAnswerEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode);
shellTaskInfos.Add(taskInfo);
// shellTaskInfos.Add(taskInfo);
}
Thread.Sleep(1000);
Thread.Sleep(500);
} while (isFlag);
}
else
@ -191,9 +290,9 @@ namespace Aucma.Scada.Business
/// 内胆入库任务下发
/// </summary>
/// <param name="taskInfo"></param>
public bool SendLinerTask_InStore(RealTaskInfo taskInfo)
public int SendLinerTask_InStore(RealTaskInfo taskInfo)
{
bool result = false;
int result = 0;
try
{
IPlc _plc = _plcDictionary[appConfig.linerStoreCode];
@ -202,17 +301,27 @@ namespace Aucma.Scada.Business
{
if (_plc.IsConnected)
{
//写入货道号
_plc.writeStringByAddress(plcConfig.in_liner_spaceCode, taskInfo.spaceCode);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.in_liner_answer, 1);
//写入任务号
_plc.writeStringByAddress(plcConfig.in_liner_task, taskInfo.taskCode);
//写入完成后读取应答字进行复位
ReadLinerAnswer_InStore(taskInfo);
result = true;
if (_plc.readInt32ByAddress(plcConfig.in_liner_answer) == 1)
{
logHelper.PlcLog("内胆入库应答字为1货道号:" + plcConfig.in_liner_spaceCode + ";写" + short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入货道号
_plc.writeInt32ByAddress(plcConfig.in_liner_spaceCode, short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入应答字
// _plc.writeInt32ByAddress(plcConfig.in_foam_answer, 1);
//写入任务号
// _plc.writeStringByAddress(plcConfig.in_foam_task, taskInfo.taskCode);
//写入完成后读取应答字进行复位
ReadLinerAnswer_InStore(taskInfo);
result = 1;
}
else
{
result = 2;
logHelper.PlcLog("内胆应答字为2下发新任务plc未就绪");
}
}
else
{
@ -254,20 +363,21 @@ namespace Aucma.Scada.Business
//读取PLC应答字为2时上位机清空写入的入库内容
if (_plc.readInt32ByAddress(plcConfig.in_liner_answer) == 2)
{
logHelper.PlcLog("内胆入库应答字为2货道号:" + plcConfig.in_liner_spaceCode + ";复位写0");
//写入货道号
_plc.writeStringByAddress(plcConfig.in_liner_spaceCode, string.Empty);
_plc.writeInt32ByAddress(plcConfig.in_liner_spaceCode, 0);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.in_liner_answer, 0);
//写入任务号
_plc.writeStringByAddress(plcConfig.in_liner_task, string.Empty);
isFlag = false;
// _plc.writeInt32ByAddress(plcConfig.in_foam_answer, 0);
isFlag = false;
InStoreAnswerEvent?.Invoke(appConfig.linerStoreCode, taskInfo.taskCode);
//ReadLinerFinish_InStore(taskCode);
// WritePlc(taskInfo.storeCode, taskInfo.spaceCode, false);
InStoreAnswerEvent?.Invoke(appConfig.linerStoreCode, taskInfo.taskCode);
linerTaskInfos.Add(taskInfo);
// linerTaskInfos.Add(taskInfo);
}
Thread.Sleep(1000);
@ -292,7 +402,7 @@ namespace Aucma.Scada.Business
}
#endregion
#region 读取PLC入库完成 Delete By Wenjy 2023-11-08 15:05:00经讨论入库完成改为监测在途数量变化
#region 读取PLC入库完成 Delete By Wenjy 2023-11-08 15:05:00经讨论入库完成改为监测在途数量变化
/// <summary>
/// 读取箱壳入库完成
/// </summary>
@ -398,139 +508,142 @@ namespace Aucma.Scada.Business
}
}
}*/
#endregion
#region 监测PLC在途数量变化完成入库任务
private void RealReadPlcSpace()
{
Thread.Sleep(1000);
Task.Run(() =>
{
while (true)
{
RealReadShellPlcSpace();
Thread.Sleep(500);
}
});
Task.Run(() =>
{
while (true)
{
RealReadLinerPlcSpace();
Thread.Sleep(500);
}
});
}
/// <summary>
/// 读取箱壳已下发任务的货道信息读取后将货道编号及在途数量写入Dictionary进行比较在途数减少则入库完成
/// </summary>
private void RealReadShellPlcSpace()
{
if (shellTaskInfos != null)
{
List<string> spaceCodes = shellTaskInfos.Select(x => x.spaceCode).Distinct().ToList();
for (int i = 0; i < spaceCodes.Count; i++)
{
string spaceCode = spaceCodes[i];
BaseSpaceInfo spaceInfo = new BaseSpaceInfo() { storeCode = appConfig.shellStoreCode, spaceCode = spaceCode };
spaceInfo = ReadSpaceInfoByPlc(spaceInfo);
if (shellKeyValuePairs.ContainsKey(spaceInfo.spaceCode))
{
shellKeyValuePairs.TryGetValue(spaceInfo.spaceCode, out int value);
//判断前次读取的数据和当前数据,如果前次数据大于当前数据则代表入库完成,然后筛选任务中对应货道的首个任务进行完成
//如果前次数据不大于当前数据则更新字典中存放的数据
if (value > spaceInfo.onRouteAmount)
{
//筛选任务
var list = shellTaskInfos.Where(x => x.spaceCode == spaceInfo.spaceCode).ToList();
if (list.Count > 0)
{
RealTaskInfo taskInfo = list.OrderBy(x => x.createTime).First();
InStoreFinsihEvent?.Invoke(taskInfo.storeCode, taskInfo.taskCode);
shellTaskInfos.Remove(taskInfo);
}
shellKeyValuePairs.Remove(spaceInfo.spaceCode);
}
else
{
shellKeyValuePairs[spaceInfo.spaceCode] = spaceInfo.onRouteAmount;
}
}
else
{
shellKeyValuePairs.Add(spaceInfo.spaceCode, spaceInfo.onRouteAmount);
}
}
}
}
/// <summary>
/// 读取内胆已下发任务的货道信息读取后将货道编号及在途数量写入Dictionary进行比较在途数减少则入库完成
/// </summary>
private void RealReadLinerPlcSpace()
{
if (linerTaskInfos != null)
{
List<string> spaceCodes = linerTaskInfos.Select(x => x.spaceCode).Distinct().ToList();
for (int i = 0; i < spaceCodes.Count; i++)
{
string spaceCode = spaceCodes[i];
BaseSpaceInfo spaceInfo = new BaseSpaceInfo() { storeCode = appConfig.linerStoreCode, spaceCode = spaceCode };
spaceInfo = ReadSpaceInfoByPlc(spaceInfo);
if (linerKeyValuePairs.ContainsKey(spaceInfo.spaceCode))
{
linerKeyValuePairs.TryGetValue(spaceInfo.spaceCode, out int value);
//判断前次读取的数据和当前数据,如果前次数据大于当前数据则代表入库完成,然后筛选任务中对应货道的首个任务进行完成
//如果前次数据不大于当前数据则更新字典中存放的数据
if (value > spaceInfo.onRouteAmount)
{
//筛选任务
var list = linerTaskInfos.Where(x => x.spaceCode == spaceInfo.spaceCode).ToList();
if (list.Count > 0)
{
RealTaskInfo taskInfo = list.OrderBy(x => x.createTime).First();
InStoreFinsihEvent?.Invoke(taskInfo.storeCode, taskInfo.taskCode);
linerTaskInfos.Remove(taskInfo);
}
linerKeyValuePairs.Remove(spaceInfo.spaceCode);
}
else
{
linerKeyValuePairs[spaceInfo.spaceCode] = spaceInfo.onRouteAmount;
}
}
else
{
linerKeyValuePairs.Add(spaceInfo.spaceCode, spaceInfo.onRouteAmount);
}
}
#endregion
}
}
#region 监测PLC在途数量变化完成入库任务 delete by liuwf 2024-01-06,入库完成改成根据每个货道完成信号完成任务
//private void RealReadPlcSpace()
//{
// Thread.Sleep(1000);
// Task.Run(() =>
// {
// while (true)
// {
// RealReadShellPlcSpace();
// Thread.Sleep(500);
// }
// });
// Task.Run(() =>
// {
// while (true)
// {
// RealReadLinerPlcSpace();
// Thread.Sleep(500);
// }
// });
//}
///// <summary>
///// 读取箱壳已下发任务的货道信息读取后将货道编号及在途数量写入Dictionary进行比较在途数减少则入库完成
///// </summary>
//private void RealReadShellPlcSpace()
//{
// if (shellTaskInfos != null)
// {
// List<string> spaceCodes = shellTaskInfos.Select(x => x.spaceCode).Distinct().ToList();
// for (int i = 0; i < spaceCodes.Count; i++)
// {
// string spaceCode = spaceCodes[i];
// BaseSpaceInfo spaceInfo = new BaseSpaceInfo() { storeCode = appConfig.shellStoreCode, spaceCode = spaceCode };
// spaceInfo = ReadSpaceInfoByPlc(spaceInfo);
// if (shellKeyValuePairs.ContainsKey(spaceInfo.spaceCode))
// {
// shellKeyValuePairs.TryGetValue(spaceInfo.spaceCode, out int value);
// //判断前次读取的数据和当前数据,如果前次数据大于当前数据则代表入库完成,然后筛选任务中对应货道的首个任务进行完成
// //如果前次数据不大于当前数据则更新字典中存放的数据
// if (value > spaceInfo.onRouteAmount)
// {
// //筛选任务
// var list = shellTaskInfos.Where(x => x.spaceCode == spaceInfo.spaceCode).ToList();
// if (list.Count > 0)
// {
// RealTaskInfo taskInfo = list.OrderBy(x => x.createTime).First();
// InStoreFinsihEvent?.Invoke(taskInfo.storeCode, taskInfo.taskCode);
// shellTaskInfos.Remove(taskInfo);
// }
// shellKeyValuePairs.Remove(spaceInfo.spaceCode);
// }
// else
// {
// shellKeyValuePairs[spaceInfo.spaceCode] = spaceInfo.onRouteAmount;
// }
// }
// else
// {
// shellKeyValuePairs.Add(spaceInfo.spaceCode, spaceInfo.onRouteAmount);
// }
// }
// }
//}
///// <summary>
///// 读取内胆已下发任务的货道信息读取后将货道编号及在途数量写入Dictionary进行比较在途数减少则入库完成
///// </summary>
//private void RealReadLinerPlcSpace()
//{
// if (linerTaskInfos != null)
// {
// List<string> spaceCodes = linerTaskInfos.Select(x => x.spaceCode).Distinct().ToList();
// for (int i = 0; i < spaceCodes.Count; i++)
// {
// string spaceCode = spaceCodes[i];
// BaseSpaceInfo spaceInfo = new BaseSpaceInfo() { storeCode = appConfig.linerStoreCode, spaceCode = spaceCode };
// spaceInfo = ReadSpaceInfoByPlc(spaceInfo);
// if (linerKeyValuePairs.ContainsKey(spaceInfo.spaceCode))
// {
// linerKeyValuePairs.TryGetValue(spaceInfo.spaceCode, out int value);
// //判断前次读取的数据和当前数据,如果前次数据大于当前数据则代表入库完成,然后筛选任务中对应货道的首个任务进行完成
// //如果前次数据不大于当前数据则更新字典中存放的数据
// if (value > spaceInfo.onRouteAmount)
// {
// //筛选任务
// var list = linerTaskInfos.Where(x => x.spaceCode == spaceInfo.spaceCode).ToList();
// if (list.Count > 0)
// {
// RealTaskInfo taskInfo = list.OrderBy(x => x.createTime).First();
// InStoreFinsihEvent?.Invoke(taskInfo.storeCode, taskInfo.taskCode);
// linerTaskInfos.Remove(taskInfo);
// }
// linerKeyValuePairs.Remove(spaceInfo.spaceCode);
// }
// else
// {
// linerKeyValuePairs[spaceInfo.spaceCode] = spaceInfo.onRouteAmount;
// }
// }
// else
// {
// linerKeyValuePairs.Add(spaceInfo.spaceCode, spaceInfo.onRouteAmount);
// }
// }
// }
//}
#endregion
/// <summary>
/// 通过PLC获取货道信息
/// </summary>
@ -547,7 +660,7 @@ namespace Aucma.Scada.Business
{
spaceInfo.spaceStock = _plc.readInt32ByAddress(spaceAddress.onStore);
spaceInfo.onRouteAmount = _plc.readInt32ByAddress(spaceAddress.onRoute);
spaceInfo.spaceStatus = _plc.readInt32ByAddress(spaceAddress.spaceStatus);
// spaceInfo.spaceStatus = _plc.readInt32ByAddress(spaceAddress.spaceStatus);
}
}

@ -356,8 +356,8 @@ namespace Aucma.Scada.Business
if(taskInfo != null)
{
PrintLogInfoMessage($"下发箱壳出库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (taskHandleBusiness.SendShellTask_OutStore(taskInfo))
int result = taskHandleBusiness.SendShellTask_OutStore(taskInfo);
if (result==1)
{
PrintLogInfoMessage($"箱壳出库任务:{taskInfo.taskCode}下发成功等待PLC执行反馈");
@ -371,6 +371,10 @@ namespace Aucma.Scada.Business
RefreshScanMateriaCodeEvent?.Invoke(taskInfo.materialCode, taskInfo.materialType, taskInfo.spaceName, taskInfo.storeCode);
}
else if (result == 2)
{
PrintLogInfoMessage("箱壳出库任务下发失败PLC接收任务未就绪");
}
else
{
PrintLogInfoMessage($"箱壳出库任务:{taskInfo.taskCode}下发失败请排除PLC连接");
@ -397,8 +401,8 @@ namespace Aucma.Scada.Business
if (taskInfo != null)
{
PrintLogInfoMessage($"下发内胆出库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}");
if (taskHandleBusiness.SendLinerTask_OutStore(taskInfo))
int result = taskHandleBusiness.SendLinerTask_OutStore(taskInfo);
if (result==1)
{
PrintLogInfoMessage($"内胆出库任务:{taskInfo.taskCode}下发成功等待PLC执行反馈");
@ -412,6 +416,10 @@ namespace Aucma.Scada.Business
RefreshScanMateriaCodeEvent?.Invoke(taskInfo.materialCode, taskInfo.materialType, taskInfo.spaceName, taskInfo.storeCode);
}
else if (result == 2)
{
PrintLogInfoMessage("内胆出库任务下发失败PLC接收任务未就绪");
}
else
{
PrintLogInfoMessage($"内胆出库任务:{taskInfo.taskCode}下发失败请排除PLC连接");
@ -877,7 +885,7 @@ namespace Aucma.Scada.Business
var spaceInfo = taskHandleBusiness.ReadSpaceInfoByPlc(item);
item.spaceStock = spaceInfo.spaceStock;
item.onRouteAmount = spaceInfo.onRouteAmount;
item.spaceStatus = spaceInfo.spaceStatus;
// item.spaceStatus = spaceInfo.spaceStatus;
PrintLogInfoMessage($"通过PLC读取货道信息货道{spaceInfo.spaceName};在库数量:{item.spaceStock};货道状态:{item.spaceStatus}");
}

@ -105,9 +105,9 @@ namespace Aucma.Scada.Business
/// 箱壳出库任务下发
/// </summary>
/// <param name="taskInfo"></param>
public bool SendShellTask_OutStore(RealTaskInfo taskInfo)
public int SendShellTask_OutStore(RealTaskInfo taskInfo)
{
bool result = false;
int result = 0;
try
{
IPlc _plc = _plcDictionary[appConfig.shellStoreCode];
@ -116,19 +116,25 @@ namespace Aucma.Scada.Business
{
if (_plc.IsConnected)
{
//写入货道号
_plc.writeStringByAddress(plcConfig.out_shell_spaceCode, taskInfo.spaceCode);
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_shell_amount, taskInfo.planAmount);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.out_shell_answer, 1);
//写入任务号
_plc.writeStringByAddress(plcConfig.out_shell_task, taskInfo.taskCode);
//写入完成后读取应答字进行复位
ReadShellAnswer_OutStore(taskInfo);
result = true;
if (_plc.readInt32ByAddress(plcConfig.out_shell_answer) == 1)
{
logHelper.Info("箱壳出库应答字为1货道号:" + plcConfig.out_shell_spaceCode + ";写" + short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入货道号
_plc.writeInt32ByAddress(plcConfig.out_shell_spaceCode, short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_shell_amount, taskInfo.planAmount);
//写入完成后读取应答字进行复位
ReadShellAnswer_OutStore(taskInfo);
result = 1;
}
else
{
result = 2;
logHelper.Info("应答字为2下发新任务plc未就绪");
}
}
else
{
@ -168,23 +174,18 @@ namespace Aucma.Scada.Business
//读取PLC应答字为2时上位机清空写入的出库内容
if (_plc.readInt32ByAddress(plcConfig.out_shell_answer) == 2)
{
logHelper.Info("出库应答字为2货道号:" + plcConfig.out_shell_spaceCode + ";复位写0");
//写入货道号
_plc.writeStringByAddress(plcConfig.out_shell_spaceCode, string.Empty);
_plc.writeInt32ByAddress(plcConfig.out_shell_spaceCode, 0);
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_shell_amount, 0);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.out_shell_answer, 0);
isFlag = false;
//ReadShellFinish_OutStore(taskInfo.taskCode);
OutStoreAnswerEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode);
OutStoreAnswerEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode);
}
Thread.Sleep(500);
Thread.Sleep(1000);
} while (isFlag);
}
else
@ -262,9 +263,9 @@ namespace Aucma.Scada.Business
/// 内胆出库任务下发
/// </summary>
/// <param name="taskInfo"></param>
public bool SendLinerTask_OutStore(RealTaskInfo taskInfo)
public int SendLinerTask_OutStore(RealTaskInfo taskInfo)
{
bool result = false;
int result = 0;
try
{
IPlc _plc = _plcDictionary[appConfig.linerStoreCode];
@ -273,19 +274,26 @@ namespace Aucma.Scada.Business
{
if (_plc.IsConnected)
{
//写入货道号
_plc.writeStringByAddress(plcConfig.out_liner_spaceCode, taskInfo.spaceCode);
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_liner_amount, taskInfo.planAmount);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.out_liner_answer, 1);
//写入任务号
_plc.writeStringByAddress(plcConfig.out_liner_task, taskInfo.taskCode);
//写入完成后读取应答字进行复位
ReadLinerAnswer_OutStore(taskInfo);
result = true;
if (_plc.readInt32ByAddress(plcConfig.out_liner_answer) == 1)
{
logHelper.Info("内胆出库应答字为1货道号:" + plcConfig.out_shell_spaceCode + ";写" + short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入货道号
_plc.writeInt32ByAddress(plcConfig.out_liner_spaceCode, short.Parse(taskInfo.spaceCode.Substring(5, 1)));
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_liner_amount, taskInfo.planAmount);
//写入完成后读取应答字进行复位
ReadLinerAnswer_OutStore(taskInfo);
result = 1;
}
else
{
result = 2;
logHelper.Info("内胆应答字为2下发新任务plc未就绪");
}
}
else
{
@ -322,26 +330,23 @@ namespace Aucma.Scada.Business
{
do
{
//读取PLC应答字为2时上位机清空写入的出库内容
if (_plc.readInt32ByAddress(plcConfig.out_liner_answer) == 2)
{
logHelper.Info("出库应答字为2货道号:" + plcConfig.out_liner_spaceCode + ";复位写0");
//写入货道号
_plc.writeStringByAddress(plcConfig.out_liner_spaceCode, string.Empty);
_plc.writeInt32ByAddress(plcConfig.out_liner_spaceCode, 0);
//写入出库数量
_plc.writeInt32ByAddress(plcConfig.out_liner_amount, 0);
//写入应答字
_plc.writeInt32ByAddress(plcConfig.out_liner_answer, 0);
//写入任务号
_plc.writeStringByAddress(plcConfig.out_liner_task, string.Empty);
isFlag = false;
//ReadLinerFinish_OutStore(taskCode);
OutStoreAnswerEvent?.Invoke(appConfig.linerStoreCode, taskInfo.taskCode);
//linerTaskInfos.Add(taskInfo);
}
Thread.Sleep(1000);
Thread.Sleep(500);
} while (isFlag);
}
else
@ -360,7 +365,6 @@ namespace Aucma.Scada.Business
logHelper.Error("读取内胆出库应答字异常", ex);
}
}
/// <summary>
/// 读取内胆出库完成
/// </summary>
@ -542,7 +546,7 @@ namespace Aucma.Scada.Business
{
spaceInfo.spaceStock = _plc.readInt32ByAddress(spaceAddress.onStore);
spaceInfo.onRouteAmount = _plc.readInt32ByAddress(spaceAddress.onRoute);
spaceInfo.spaceStatus = _plc.readInt32ByAddress(spaceAddress.spaceStatus);
// spaceInfo.spaceStatus = _plc.readInt32ByAddress(spaceAddress.spaceStatus);
}
}

@ -1,87 +1,64 @@
#箱壳库货道信息
#箱壳库货道信息 是否已满=D7221 货道状态=D7231 仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
[XKJCK-001_XK_001]
在库数量=D7201
在途数量=D7211
是否已满=D7221
货道状态=D7231
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7021
出库完成=D7240
[XKJCK-001_XK_002]
在库数量=D7202
在途数量=D7212
是否已满=D7222
货道状态=D7232
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7022
出库完成=D7240
[XKJCK-001_XK_003]
在库数量=D7203
在途数量=D7213
是否已满=D7223
货道状态=D7233
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7023
出库完成=D7240
[XKJCK-001_XK_004]
在库数量=D7204
在途数量=D7214
是否已满=D7224
货道状态=D7234
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7024
出库完成=D7240
[XKJCK-001_XK_005]
在库数量=D7205
在途数量=D7215
是否已满=D7225
货道状态=D7235
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7025
出库完成=D7240
[XKJCK-001_XK_006]
在库数量=D7206
在途数量=D7216
是否已满=D7226
货道状态=D7236
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7026
出库完成=D7240
#内胆库货道信息
[NDJCK-001_ND_001]
在库数量=D7201
在途数量=D7211
是否已满=D7221
货道状态=D7231
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7021
出库完成=D7240
[NDJCK-001_ND_002]
在库数量=D7202
在途数量=D7212
是否已满=D7222
货道状态=D7232
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7022
出库完成=D7240
[NDJCK-001_ND_003]
在库数量=D7203
在途数量=D7213
是否已满=D7223
货道状态=D7233
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7023
出库完成=D7240
[NDJCK-001_ND_004]
在库数量=D7204
在途数量=D7214
是否已满=D7224
货道状态=D7234
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7024
出库完成=D7240
[NDJCK-001_ND_005]
在库数量=D7205
在途数量=D7215
是否已满=D7225
货道状态=D7235
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7025
出库完成=D7240
[NDJCK-001_ND_006]
在库数量=D7206
在途数量=D7216
是否已满=D7226
货道状态=D7236
仓库状态=D7300 #设备状态字,0未启动状态,1已自动运行,2维修调试状态,禁止启动
入库完成=D7026
出库完成=D7240

@ -32,12 +32,14 @@ namespace HighWayIot.Config
SpaceAddress spaceAddress = new SpaceAddress();
spaceAddress.onStore = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "在库数量");
spaceAddress.onRoute = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "在途数量");
spaceAddress.isFull = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "是否已满");
spaceAddress.spaceStatus = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "货道状态");
spaceAddress.storeStatus = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "仓库状态");
spaceAddress.alarmInfo = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "报警信息");
spaceAddress.outStoreFinish = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "入库完成");
spaceAddress.outStoreFinish = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "出库完成");
return spaceAddress;
// spaceAddress.isFull = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "是否已满");
// spaceAddress.spaceStatus = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "货道状态");
// spaceAddress.storeStatus = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "仓库状态");
// spaceAddress.alarmInfo = iniHelper.IniReadValue($"{storeCode}_{spaceCode}", "报警信息");
}
}
@ -47,15 +49,19 @@ namespace HighWayIot.Config
public string onRoute { get; set; }
public string isFull { get; set; }
public string inStoreFinish { get; set; }
public string spaceStatus { get; set; }
public string outStoreFinish { get; set; }
public string storeStatus { get; set; }
// public string isFull { get; set; }
// public string spaceStatus { get; set; }
// public string storeStatus { get; set; }
// public string alarmInfo { get; set; }
public string alarmInfo { get; set; }
public string outStoreFinish { get; set; }
}
}

@ -5,6 +5,17 @@ namespace HighWayIot.Repository.service
{
public interface IRealTaskInfoService
{
/// <summary>
/// 获取指定状态的货道去重的按时间排序任务列表
/// </summary>
/// <param name="storeCode"></param>
/// <param name="taskType"></param>
/// <param name="taskStatus"></param>
/// <returns></returns>
List<RealTaskInfo> GetTaskInfosForInstore(string storeCode, int taskType, int taskStatus);
/// <summary>
/// 添加任务信息
/// </summary>

@ -15,6 +15,44 @@ namespace HighWayIot.Repository.service.Impl
private LogHelper logHelper = LogHelper.Instance;
/// <summary>
/// 获取指定状态的货道去重的按时间排序任务列表
/// </summary>
/// <param name="storeCode"></param>
/// <param name="taskType"></param>
/// <param name="taskStatus"></param>
/// <returns></returns>
public List<RealTaskInfo> GetTaskInfosForInstore(string storeCode, int taskType, int taskStatus)
{
List<RealTaskInfo> realTaskInfos = null;
List<RealTaskInfo> filteredList = null;
try
{
Expression<Func<RealTaskInfo, bool>> exp = s1 => true;
exp = exp.And(x => x.taskType == taskType && storeCode.Contains(x.storeCode));
exp = exp.And(x => x.taskStatus == taskStatus);
realTaskInfos = _mesRepository.GetList(exp);
if (realTaskInfos == null || realTaskInfos.Count == 0) return null;
filteredList = realTaskInfos.GroupBy(rti => rti.spaceCode) // 按照 spaceCode 进行分组
.Select(group => group.OrderBy(rti => rti.createTime).First())
.ToList();
}
catch (Exception ex)
{
logHelper.Error("获取指定状态的任务信息异常", ex);
}
return filteredList;
}
/// <summary>
/// 添加任务信息
/// </summary>

Loading…
Cancel
Save