using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using CyberX8_RT.Devices.Loader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.AXIS.CANOpen { public class LoaderSideVacuumLevelCheckRoutine : RoutineBase, IRoutine { private enum VacuumStep { WriteVacuum, End } #region 常量 private const string CRS_VACUUM = "CRSVacuum"; #endregion #region 内部变量 private int _timeout = 5000; private LoaderSideDevice _loaderSide; private bool _vacuum = false; private double _crsVacuumHighLimit = -550; private double _crsVacuumLowLimit = -480; #endregion /// /// 构造函数 /// /// public LoaderSideVacuumLevelCheckRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(VacuumStep.WriteVacuum, NullFun, CheckVacuum,_timeout) .End(VacuumStep.End,NullFun,100); return Runner.Status; } /// /// 检验Vacuum状态 /// /// private bool CheckVacuum() { bool result = false; if (_vacuum) { result= _loaderSide.SideData.CRSVacuumValue < 0 && _loaderSide.SideData.CRSVacuumValue < _crsVacuumHighLimit; if (!result) { if (_loaderSide.SideData.CRSVacuumValue >= _crsVacuumHighLimit) { NotifyError(Aitex.Core.RT.Log.eEvent.INFO_LOADER, $"vacuum value {_loaderSide.SideData.CRSVacuumValue} is over or equal {_crsVacuumHighLimit}", 0); return false; } if (_loaderSide.SideData.CRSVacuumValue >= 0) { NotifyError(Aitex.Core.RT.Log.eEvent.INFO_LOADER, $"vacuum value {_loaderSide.SideData.CRSVacuumValue} is over or equal 0", 0); return false; } } } else { result= _loaderSide.SideData.CRSVacuumValue > _crsVacuumLowLimit && _loaderSide.SideData.CRSVacuumValue < 0; if (_loaderSide.SideData.CRSVacuumValue <= _crsVacuumLowLimit) { NotifyError(Aitex.Core.RT.Log.eEvent.INFO_LOADER, $"vacuum value {_loaderSide.SideData.CRSVacuumValue} is less or equal {_crsVacuumLowLimit}", 0); return false; } if (_loaderSide.SideData.CRSVacuumValue >= 0) { NotifyError(Aitex.Core.RT.Log.eEvent.INFO_LOADER, $"vacuum value {_loaderSide.SideData.CRSVacuumValue} is over or equal 0", 0); return false; } } return result; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumTimeout")) { _timeout = SC.GetValue($"{ModuleName.Loader1}.LSVacuumTimeout"); } if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumHighLimit")) { _crsVacuumHighLimit = SC.GetValue($"{ModuleName.Loader1}.LSVacuumHighLimit"); } if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumLowLimit")) { _crsVacuumLowLimit = SC.GetValue($"{ModuleName.Loader1}.LSVacuumLowLimit"); } _vacuum = (bool)objs[0]; _loaderSide = DEVICE.GetDevice(Module); return Runner.Start(Module, "Vacuum Level Check"); } } }