| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 | using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.Device;using Aitex.Core.RT.Event;using Aitex.Core.RT.Log;using Aitex.Core.RT.OperationCenter;using Aitex.Core.RT.Routine;using Aitex.Core.RT.SCCore;using Aitex.Core.Util;using MECF.Framework.Common.Beckhoff.ModuleIO;using MECF.Framework.Common.CommonData.Transporter;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.ToolLayout;using MECF.Framework.Common.TwinCat;using CyberX8_Core;using CyberX8_RT.Devices.AXIS;using CyberX8_RT.Devices.AXIS.CANOpen;using System;using System.Collections.Generic;using System.Linq;using System.Net.NetworkInformation;using System.Reflection;using System.Text;using System.Threading.Tasks;using CyberX8_RT.Devices.BarcodeReader;using MECF.Framework.Common.IOCore;namespace CyberX8_RT.Devices.TransPorter{        public class TransporterCommon : BaseDevice, IDevice    {        private enum TransporterCommonOperation        {            None=0,            Lock=1,            Unlock=2,            Retract=3,            Extend=4        }        #region 常量        private const string UNLOCK = "Unlock";        private const string LOCKED1 = "Locked1";        private const string LOCKED2 = "Locked2";        private const string UNLOCKED1 = "Unlocked1";        private const string UNLOCKED2 = "Unlocked2";        private const string IMMOBILIZE_ACTIVE = "ImmobilizeActive";        private const string IMMOBILIZE_ACTIVE2 = "ImmobilizeActive2";        private const string IMMOBILIZE_RETRACTED1 = "ImmobilizeRetracted1";        private const string IMMOBILIZE_RETRACTED2 = "ImmobilizeRetracted2";        private const string IMMOBILIZE_EXTEND1 = "ImmobilizeExtended1";        private const string IMMOBILIZE_EXTEND2= "ImmobilizeExtended2";        private const string READY_TO_LOCK1 = "ReadyToLock1";        private const string READY_TO_LOCK2 = "ReadyToLock2";        private const string WH_PRESENT1 = "WhPresent1";        private const string WH_PRESENT2 = "WhPresent2";        private const string TRANSPORTER_DATA = "TransporterData";        #endregion        #region 内部变量        private TransporterData _transporterData = new TransporterData();        /// <summary>        /// 状态        /// </summary>        private RState _status;        /// <summary>        /// 当前操作        /// </summary>        private TransporterCommonOperation _currentOperation;        /// <summary>        /// unlock后自动lock时长        /// </summary>        private int _unlockTimerLockInterval = 20;        /// <summary>        /// unlock时间        /// </summary>        private DateTime _unlockDateTime = DateTime.Now;        #region Routine        /// <summary>        /// lock routine        /// </summary>        private TransporterLockRoutine _lockRoutine;        /// <summary>        /// Unlock Routine        /// </summary>        private TransporterUnlockRoutine _unlockRoutine;        /// <summary>        /// Retract Routine        /// </summary>        private TransporterRetractRoutine _retractRoutine;        /// <summary>        /// Extend Routine        /// </summary>        private TransporterExtendRoutine _extendRoutine;        /// <summary>        /// barcodeReaderName        /// </summary>        private string _barcodeReaderName;        /// <summary>        /// 条码读取器        /// </summary>        private BarcodeReaderController _barcodeReader;        #endregion        #endregion        #region 属性        /// <summary>        /// 数据        /// </summary>        public TransporterData TransporterData { get { return _transporterData; } }        #endregion                /// <summary>        /// 构造函数        /// </summary>        /// <param name="moduleName"></param>        public TransporterCommon(string moduleName) : base(moduleName, "Common", "Common", "Common")        {            TransporterItem transporterItem = TransporterItemManager.Instance.GetTransporterItem(moduleName);            if(transporterItem != null)            {                _barcodeReaderName =transporterItem.BarcodeReader;            }        }        /// <summary>        /// 初始化        /// </summary>        /// <returns></returns>        public bool Initialize()        {            InitializeData();            SubscribeValueAction();            InitializeRoutine();            InitializeOperation();            return true;        }        /// <summary>        /// 初始化数据        /// </summary>        private void InitializeData()        {            DATA.Subscribe($"{Module}.{TRANSPORTER_DATA}", () => _transporterData, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.BarcodeReader", () => _barcodeReaderName, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.WSPresent1", ()=>_transporterData.WhPresent1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.WSPresent2", () => _transporterData.WhPresent2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeActive1", () => _transporterData.ImmobilizeActive, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeActive2", () => _transporterData.ImmobilizeActive2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeRetracted1", () => _transporterData.ImmobilizeRetracted1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeRetracted2", () => _transporterData.ImmobilizeRetracted2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeExtended1", () => _transporterData.ImmobilizeExtended1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ImmobilizeExtended2", () => _transporterData.ImmobilizeExtended2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.Locked1", () => _transporterData.Locked1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.Locked2", () => _transporterData.Locked2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ReadyToLock1", () => _transporterData.ReadyToLock1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.ReadyToLock2", () => _transporterData.ReadyToLock2, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.Unlocked1", () => _transporterData.Unlocked1, SubscriptionAttribute.FLAG.IgnoreSaveDB);            DATA.Subscribe($"{Module}.Unlocked2", () => _transporterData.Unlocked2, SubscriptionAttribute.FLAG.IgnoreSaveDB);        }        /// <summary>        /// 订阅变量数值发生变化        /// </summary>        private void SubscribeValueAction()        {            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCK, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LOCKED1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LOCKED2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCKED1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCKED2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_ACTIVE, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_ACTIVE2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_RETRACTED1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_RETRACTED2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_EXTEND1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_EXTEND2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", READY_TO_LOCK1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", READY_TO_LOCK2, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WH_PRESENT1, UpdateVariableValue);            IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WH_PRESENT2, UpdateVariableValue);        }        /// <summary>        /// 初始化操作        /// </summary>        private void InitializeOperation()        {            OP.Subscribe($"{Module}.Lock", LockOperation);            OP.Subscribe($"{Module}.Unlock", UnlockOperation);            OP.Subscribe($"{Module}.Retract", RetractOperation);            OP.Subscribe($"{Module}.Extend", ExtendOperation);        }        /// <summary>        /// 更新变量数值        /// </summary>        /// <param name="variable"></param>        /// <param name="value"></param>        private void UpdateVariableValue(string variable, object value)        {            PropertyInfo property = TransporterData.GetType().GetProperty(variable);            if (property != null)            {                property.SetValue(TransporterData, value);            }            if(TransporterData.Unlock)            {                _unlockDateTime = DateTime.Now;            }        }        /// <summary>        /// 初始化Routine        /// </summary>        private void InitializeRoutine()        {            _lockRoutine = new TransporterLockRoutine(Module);            _unlockRoutine= new TransporterUnlockRoutine(Module);            _retractRoutine= new TransporterRetractRoutine(Module);            _extendRoutine=new TransporterExtendRoutine(Module);        }        #region 指令         /// <summary>        /// Lock 操作        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        private bool LockOperation(string cmd, object[] args)        {            return StartRoutine(TransporterCommonOperation.Lock,_lockRoutine,null);        }        /// <summary>        /// Unlock 操作        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        private bool UnlockOperation(string cmd, object[] args)        {            return StartRoutine(TransporterCommonOperation.Unlock, _unlockRoutine, null);        }        /// <summary>        /// Retract 操作        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        private bool RetractOperation(string cmd , object[] args)        {            JetAxisBase elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");            if (elevatorAxis!=null && !elevatorAxis.CurrentStation.Contains("UP"))            {                LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module}.Elevator is not in 'UP' Postion,Can not do Retract Action");                return false;            }            return StartRoutine(TransporterCommonOperation.Retract, _retractRoutine, null);        }        /// <summary>        /// Extend 操作        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        private bool ExtendOperation(string cmd , object[] args)        {            JetAxisBase elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");            if (elevatorAxis != null && !elevatorAxis.CurrentStation.Contains("UP"))            {                LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module}.Elevator is not in 'UP' Postion,Can not do Extend Action");                return false;            }            return StartRoutine(TransporterCommonOperation.Extend, _extendRoutine, null);        }        /// <summary>        /// 启动Routine        /// </summary>        /// <param name="operation"></param>        /// <param name="obj"></param>        /// <returns></returns>        private bool StartRoutine(TransporterCommonOperation operation,IRoutine routine,object obj)        {            if (!JudgeRunningState(operation))            {                _currentOperation = operation;                _status = routine.Start(obj);                return true;            }            else            {                return false;            }        }        /// <summary>        /// 判定运行状态        /// </summary>        /// <returns></returns>        private bool JudgeRunningState(TransporterCommonOperation operation)        {            if (_status == RState.Running)            {                LOG.WriteLog(eEvent.ERR_TRANSPORTER,Module, $"{Module} current execute {_currentOperation},cannot {operation}");                return true;            }            return false;        }        #endregion        /// <summary>        /// 读取条码        /// </summary>        /// <returns></returns>        public string ReaderBarcode()        {            _barcodeReader = DEVICE.GetDevice<BarcodeReaderController>(_barcodeReaderName);            if (_barcodeReader != null)            {                return _barcodeReader.ReadBarcode();            }            return "";        }        /// <summary>        /// 定时器        /// </summary>        /// <returns></returns>        public bool OnTimer()        {            if (_status == RState.Running)            {                if (_currentOperation != TransporterCommonOperation.None)                {                    IRoutine routine = GetCurrentRoutine(_currentOperation);                    if (routine != null)                    {                        CheckRoutineState(routine, _currentOperation);                    }                    else                    {                        EndOperation();                    }                }            }            if (SC.ContainsItem($"Transporter.{Module}.UnlockTimerLock"))            {                _unlockTimerLockInterval = SC.GetValue<int>($"Transporter.{Module}.UnlockTimerLock") * 1000;            }            if(TransporterData.Unlock)            {                if(DateTime.Now.Subtract(_unlockDateTime).TotalMilliseconds>=_unlockTimerLockInterval)                {                    string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{UNLOCK}");                    if (!string.IsNullOrEmpty(ioName))                    {                        IOModuleManager.Instance.WriteIoValue(ioName, false);                    }                }            }            return true;        }        /// <summary>        /// 获取当前操作对应的Routine        /// </summary>        /// <param name="currentOperation"></param>        /// <returns></returns>        private IRoutine GetCurrentRoutine(TransporterCommonOperation currentOperation)        {            switch (currentOperation)            {                case TransporterCommonOperation.Lock:                    return _lockRoutine;                case TransporterCommonOperation.Unlock:                    return _unlockRoutine;                case TransporterCommonOperation.Retract:                    return _retractRoutine;                case TransporterCommonOperation.Extend:                    return _extendRoutine;                default:                    return null;            }        }        /// <summary>        /// 检验Routine状态        /// </summary>        /// <param name="routine"></param>        /// <param name="currentOperation"></param>        private void CheckRoutineState(IRoutine routine, TransporterCommonOperation currentOperation)        {            RState state = routine.Monitor();            if (state == RState.End)            {                EndOperation();            }            else if (state == RState.Failed || state == RState.Timeout)            {                LOG.WriteLog(eEvent.ERR_TRANSPORTER, $"{Module}.{Name}", $"{currentOperation} error");                EndOperation();            }        }        /// <summary>        /// 结束操作        /// </summary>        private void EndOperation()        {            _status = RState.End;            _currentOperation = TransporterCommonOperation.None;        }        #region 设备接口        public void Monitor()        {        }        public void Reset()        {        }        public void Terminate()        {        }        #endregion    }}
 |