using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.Routine; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using MECF.Framework.Common.IOCore; namespace CyberX8_RT.Devices.SRD { public class SrdCommonChuckVacuumRoutine : RoutineBase, IRoutine { #region 常量 private const string CHUCK_VACUUM = "ChuckVacuum"; #endregion private enum ChuckVacuumStep { ChuckVauum, End } #region 内部变量 private bool _chuckVacuum; private SrdCommonDevice _srdCommon; private int _timeout = 2000; private int _vacuumOnLimit; private int _vacuumOffLimit; #endregion /// /// 构造函数 /// /// public SrdCommonChuckVacuumRoutine(string module) : base(module) { } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(ChuckVacuumStep.ChuckVauum, ChuckVacuum, CheckVacuumStatus, _timeout) .End(ChuckVacuumStep.End, NullFun, 100); return Runner.Status; } private bool ChuckVacuum() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{CHUCK_VACUUM}"); return IOModuleManager.Instance.WriteIoValue(ioName, _chuckVacuum); } private bool CheckVacuumStatus() { if (_srdCommon.CommonData.ChuckVacuum == _chuckVacuum) { if(!_chuckVacuum) { LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is on, VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOnLimit}"); return _srdCommon.CommonData.VacuumValue < _vacuumOnLimit; } else { LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is off, VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}"); return _srdCommon.CommonData.VacuumValue > _vacuumOffLimit; } } else { LOG.WriteLog(eEvent.INFO_SRD, Module, $"Chuck Vacuum is no equal to _chuckVacuum"); return false; } } public RState Start(params object[] objs) { _chuckVacuum = (bool)objs[0]; _srdCommon = DEVICE.GetDevice($"{Module}.Common"); _vacuumOffLimit = SC.GetValue("SRD.ChuckVacuumOffLimit"); _vacuumOnLimit = SC.GetValue("SRD.ChuckVacuumOnLimit"); if (_chuckVacuum) { return Runner.Start(Module, "Chuck Vacuum Off"); } else { return Runner.Start(Module, "Chuck Vacuum On"); } } } }