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 { /// /// 入库任务处理 /// internal sealed class InStoreTaskHandle { #region 单例实现 private static readonly Lazy lazy = new Lazy(() => 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 _plcDictionary = new Dictionary(); /// /// 泡后任务编号,PLC反馈后进行赋值 /// private string foamTaskCode = string.Empty; #endregion #region 委托事件 /// /// 入库完成 /// /// 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; } /// /// 读取泡后入库应答 /// 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(5000); } while (isFlag); } else { logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接"); } } else { logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息"); } }); } catch (Exception ex) { logHelper.Error("读取泡后入库应答字异常", ex); } } } /// /// 读取泡后入库完成 /// 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(5000); } while (isFlag); } else { logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接"); } } else { logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息"); } }); } catch (Exception ex) { logHelper.Error("读取泡后入库完成异常", ex); } } } #endregion } }