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
- }
- }
|