|
|
|
|
using Aucma.Scada.Model.domain;
|
|
|
|
|
using HighWayIot.Config;
|
|
|
|
|
using HighWayIot.Log4net;
|
|
|
|
|
using HighWayIot.Plc;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace Aucma.Scada.Business
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 入库任务处理
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal sealed class InStoreTaskHandle
|
|
|
|
|
{
|
|
|
|
|
#region 单例实现
|
|
|
|
|
private static readonly Lazy<InStoreTaskHandle> lazy = new Lazy<InStoreTaskHandle>(() => new InStoreTaskHandle());
|
|
|
|
|
public static InStoreTaskHandle Instance
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return lazy.Value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 对象引用
|
|
|
|
|
private LogHelper logHelper = LogHelper.Instance;
|
|
|
|
|
|
|
|
|
|
private AppConfig appConfig = AppConfig.Instance;
|
|
|
|
|
|
|
|
|
|
private PlcConfig plcConfig = PlcConfig.Instance;
|
|
|
|
|
|
|
|
|
|
private PlcPool _pool = PlcPool.Instance;
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 私有变量
|
|
|
|
|
private Dictionary<string, IPlc> _plcDictionary = new Dictionary<string, IPlc>();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 泡后任务编号,PLC反馈后进行赋值
|
|
|
|
|
/// </summary>
|
|
|
|
|
private string foamTaskCode = string.Empty;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 委托事件
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 入库完成
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="taskCode"></param>
|
|
|
|
|
public delegate void InStoreFinsih( string taskCode);
|
|
|
|
|
public event InStoreFinsih InStoreFinsihEvent;
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
private InStoreTaskHandle()
|
|
|
|
|
{
|
|
|
|
|
_plcDictionary = _pool.GetAll();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 泡后入库任务下发处理
|
|
|
|
|
public bool SendFoamTask_InStore(RealTaskInfo taskInfo)
|
|
|
|
|
{
|
|
|
|
|
bool result = false;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
IPlc _plc = _plcDictionary[taskInfo.storeCode];
|
|
|
|
|
|
|
|
|
|
if (_plc != null)
|
|
|
|
|
{
|
|
|
|
|
if (_plc.IsConnected)
|
|
|
|
|
{
|
|
|
|
|
//写入货道号
|
|
|
|
|
_plc.writeStringByAddress(plcConfig.in_foam_spaceCode, taskInfo.spaceCode);
|
|
|
|
|
//写入应答字
|
|
|
|
|
_plc.writeInt32ByAddress(plcConfig.in_foam_answer, 1);
|
|
|
|
|
//写入任务号
|
|
|
|
|
_plc.writeStringByAddress(plcConfig.in_foam_task, taskInfo.taskCode);
|
|
|
|
|
|
|
|
|
|
//写入完成后读取应答字进行复位
|
|
|
|
|
ReadShellAnswer_InStore(taskInfo.taskCode);
|
|
|
|
|
|
|
|
|
|
result = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"仓库{taskInfo.storeCode};PLC未连接");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"PLC信息为空,通过{taskInfo.storeCode}未获取到该仓库对应的PLC信息");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logHelper.Error("泡后入库任务下发异常", ex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 读取泡后入库应答
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void ReadShellAnswer_InStore(string taskCode)
|
|
|
|
|
{
|
|
|
|
|
lock (string.Empty)
|
|
|
|
|
{
|
|
|
|
|
bool isFlag = true;
|
|
|
|
|
IPlc _plc = _plcDictionary[appConfig.foamStoreCode];
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
if (_plc != null)
|
|
|
|
|
{
|
|
|
|
|
if (_plc.IsConnected)
|
|
|
|
|
{
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
//读取PLC应答字为2时,上位机清空写入的入库内容
|
|
|
|
|
if (_plc.readInt32ByAddress(plcConfig.in_foam_answer) == 2)
|
|
|
|
|
{
|
|
|
|
|
//写入货道号
|
|
|
|
|
_plc.writeStringByAddress(plcConfig.in_foam_spaceCode, string.Empty);
|
|
|
|
|
//写入应答字
|
|
|
|
|
_plc.writeInt32ByAddress(plcConfig.in_foam_answer, 0);
|
|
|
|
|
//写入任务号
|
|
|
|
|
_plc.writeStringByAddress(plcConfig.in_foam_task, string.Empty);
|
|
|
|
|
isFlag = false;
|
|
|
|
|
|
|
|
|
|
ReadShellFinish_InStore(taskCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
} while (isFlag);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logHelper.Error("读取泡后入库应答字异常", ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 读取泡后入库完成
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void ReadShellFinish_InStore(string taskCode)
|
|
|
|
|
{
|
|
|
|
|
lock (string.Empty)
|
|
|
|
|
{
|
|
|
|
|
bool isFlag = true;
|
|
|
|
|
IPlc _plc = _plcDictionary[appConfig.foamStoreCode];
|
|
|
|
|
foamTaskCode = taskCode;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
if (_plc != null)
|
|
|
|
|
{
|
|
|
|
|
if (_plc.IsConnected)
|
|
|
|
|
{
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
//读取PLC入库任务完成
|
|
|
|
|
if (_plc.readInt32ByAddress(plcConfig.in_foam_finish) == 1)
|
|
|
|
|
{
|
|
|
|
|
_plc.writeInt32ByAddress(plcConfig.in_foam_finish, 0);
|
|
|
|
|
|
|
|
|
|
//string taskCode = _plc.readStringByAddress(plcConfig.out_foam_task, 10);
|
|
|
|
|
|
|
|
|
|
InStoreFinsihEvent?.Invoke(taskCode);
|
|
|
|
|
|
|
|
|
|
isFlag = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
} while (isFlag);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logHelper.Error("读取泡后入库完成异常", ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|