123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using ProjectBase.Data.BaseDAL;
- using ProjectBase.Data.Logs;
- using SIMDP.BLL;
- using SIMDP.Device;
- using SIMDP.Model;
- using ProjectBase.Util;
- using ACTMULTILib;
- namespace SIMDP.Project
- {
- public class AE2StockIS : PlcMXComponent
- {
- #region 重写父类函数
- public override void actionStart()
- {
- #if DEBUG
- testRunner = new TestRunner1(this);
- testRunner.run();
- #endif
- }
- public override void actionStop()
- { }
- public override void actionTimer()
- {
- try
- {
- HeartBeatSendAndCheck();
- // 轮询监控节点
- foreach (var p in monitorPoints)
- {
- if (!Read(p, out short value)) continue;
- if (!value.Equals(p.value))
- {
- p.value = value;
- if (p.proc != null)
- {
- if (p.proc.Name != "PLC心跳信号")
- LogHelper.log.Debug($"Invoke {p.proc.Name}(value={value})");
- p.proc.Invoke(this, new object[] { value });
- }
- }
- }
- redis.Publish<string>(SysEnvironment.OpcDataChannel, "");
- }
- catch (Exception ex)
- {
- LogHelper.log.Error("读取PLC信号发生异常:" + ex.Message);
- actEasyIF.Close();
- SetRedisPlcDisConnect();
- }
- }
- #endregion
- #region 数据定义
- /// <summary>
- /// 设备是否为自动状态(响应PLC请求)
- /// </summary>
- bool plc_working = true;
- /// <summary>
- /// 调试进程
- /// </summary>
- TestRunner1 testRunner = null;
- #endregion
- #region 信号回调函数
- public void PLC心跳信号(object value)
- {
- PlcHeartBeatMissing = 0;
- }
- public void 设备状态(object value)
- {
- int signal = Convert.ToInt32(value);
- plc_working = (signal == 1);
- }
- public void 入库请求(object value)
- {
- bool signal = Convert.ToBoolean(value);
- if (!plc_working)
- return;
- if (signal)
- Write("托盘放置位置", BLLFactory<BlAE2Stock>.Instance.StockIn());
- else
- Write("托盘放置位置", 0);
- Write("入库允许", signal);
- }
- public void 入库完成(object value)
- {
- bool signal = Convert.ToBoolean(value);
- if (!plc_working)
- return;
- if (signal)
- {
- LogHelper.log.Info($"托盘入库完成,返回{BLLFactory<BlAE2Stock>.Instance.StockInConfirm()}");
- Write("所有托盘当前位置", BLLFactory<BlAE2Stock>.Instance.AllStockStatus1());
- Write("所有托盘当前位置2", BLLFactory<BlAE2Stock>.Instance.AllStockStatus2());
- }
- Write("入库完成反馈", signal);
- }
- public void 出库请求(object value)
- {
- bool signal = Convert.ToBoolean(value);
- if (!plc_working)
- return;
- if (signal)
- Write("待取托盘位置", BLLFactory<BlAE2Stock>.Instance.StockOut());
- else
- Write("待取托盘位置", 0);
- Write("出库允许", signal);
- }
- public void 出库完成(object value)
- {
- bool signal = Convert.ToBoolean(value);
- if (!plc_working)
- return;
- if (signal)
- {
- LogHelper.log.Info($"托盘出库完成,返回{BLLFactory<BlAE2Stock>.Instance.StockOutConfirm()}");
- Write("所有托盘当前位置", BLLFactory<BlAE2Stock>.Instance.AllStockStatus1());
- Write("所有托盘当前位置2", BLLFactory<BlAE2Stock>.Instance.AllStockStatus2());
- }
- Write("出库完成反馈", signal);
- }
- #endregion
- #region 自定义函数
- /// <summary>
- /// PC心跳信号值
- /// </summary>
- private bool pcHeartBeat = false;
- private int plcHeartBeatTimeout = 5;
- private int PlcHeartBeatMissing = 0;
- /// <summary>
- /// 发送PC心跳并检测PLC心跳是否超时
- /// </summary>
- public void HeartBeatSendAndCheck()
- {
- pcHeartBeat = !pcHeartBeat;
- bool res1 = Write("PC心跳信号", pcHeartBeat);
- if (PlcHeartBeatMissing > plcHeartBeatTimeout)
- {
- LogHelper.log.Error("PLC心跳信号超时");
- }
- else
- {
- PlcHeartBeatMissing += 1;
- }
- }
- #endregion
- #region 调试模拟信号
- /// <summary>
- /// 小压溃调试用
- /// </summary>
- class TestRunner1
- {
- AE2StockIS parent;
- public TestRunner1(AE2StockIS _parent)
- {
- parent = _parent;
- }
- public void run()
- {
- Task.Run(() =>
- {
- TaskClearAll();
- Task1();
- });
- }
- private void TaskClearAll()
- {
- foreach (var p in parent.monitorPoints)
- {
- parent.Write(p.mo.DataPointName, false);
- }
- }
- private void Task1()
- {
- parent.Write("设备状态", true);
- parent.Write("入库请求", true);
- ReadUntil("入库允许", true);
- parent.Read("托盘放置位置", out short stockIn);
- LogHelper.log.Info($"入库允许,托盘放置位置={stockIn})");
- parent.Write("入库请求", false);
- Thread.Sleep(2000);
- parent.Write("入库完成", true);
- ReadUntil("入库完成反馈", true);
- parent.Read("所有托盘当前位置", out short stockStatus1);
- parent.Read("所有托盘当前位置", out short stockStatus2);
- LogHelper.log.Info($"入库完成,所有托盘状态={stockStatus1.ToString("X")},{stockStatus2.ToString("X")}");
- parent.Write("入库完成", false);
- Thread.Sleep(2000);
- parent.Write("出库请求", true);
- ReadUntil("出库允许", true);
- parent.Read("待取托盘位置", out short stockOut);
- LogHelper.log.Info($"出库允许,待取托盘位置={stockOut})");
- parent.Write("出库请求", false);
- Thread.Sleep(2000);
- parent.Write("出库完成", true);
- ReadUntil("出库完成反馈", true);
- parent.Read("所有托盘当前位置", out stockStatus1);
- parent.Read("所有托盘当前位置", out stockStatus2);
- LogHelper.log.Info($"入库完成,所有托盘状态={stockStatus1.ToString("X")},{stockStatus2.ToString("X")}");
- parent.Write("出库完成", false);
- }
- private void ReadUntil(string pointName, bool target)
- {
- while (true)
- {
- parent.Read(pointName, out bool value);
- if (value == target)
- break;
- else
- Thread.Sleep(1000);
- }
- }
- }
- }
- }
- #endregion
|