2023-04-13 11:51:03 +08:00
|
|
|
using System.Diagnostics;
|
|
|
|
using System.Threading;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Aitex.Core.RT.Event;
|
|
|
|
using Aitex.Core.Util;
|
|
|
|
using MECF.Framework.RT.Core.IoProviders;
|
|
|
|
|
|
|
|
namespace Aitex.Core.RT.IOCore
|
|
|
|
{
|
|
|
|
public class DOAccessor : IOAccessor<bool>
|
|
|
|
{
|
|
|
|
private Task _tPulseGen;
|
|
|
|
|
|
|
|
public DOAccessor(string name, int index, bool[] values)
|
|
|
|
: base(name, index, values)
|
|
|
|
{
|
|
|
|
setter = SetValueSafe;
|
2023-08-10 16:44:46 +08:00
|
|
|
type = IOType.DO;
|
|
|
|
}
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
public bool SetValue(bool value, out string reason)
|
|
|
|
{
|
|
|
|
if (IO.CanSetDO(name, value, out reason))
|
|
|
|
{
|
|
|
|
IIoProvider provider = Singleton<IoProviderManager>.Instance.GetProvider(base.Provider);
|
|
|
|
if (provider != null && !provider.SetValue(this, value))
|
|
|
|
{
|
|
|
|
reason = "Write DO[" + base.Name + "] failed";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
values[index] = value;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool SetPulseValue(bool value, out string reason, bool holdValue, int delayMillisecond)
|
|
|
|
{
|
|
|
|
//Debug.Assert(_tPulseGen == null || _tPulseGen.IsCompleted, $"DO {name} The last pulse is not finished.");
|
|
|
|
|
|
|
|
if (IO.CanSetDO(name, value, out reason))
|
|
|
|
{
|
|
|
|
if (_tPulseGen is { IsCompleted: false })
|
|
|
|
{
|
|
|
|
// reason = $"{name} is busy generating pulse";
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
_tPulseGen = Task.Run(() =>
|
|
|
|
{
|
|
|
|
Value = value;
|
|
|
|
|
|
|
|
Thread.Sleep(delayMillisecond);
|
|
|
|
if (IO.CanSetDO(name, holdValue, out var reason))
|
|
|
|
{
|
|
|
|
Value = holdValue;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
EV.PostAlarmLog("", $"Unable to restore level of {Name}, {reason}");
|
|
|
|
});
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool Check(bool value, out string reason)
|
|
|
|
{
|
|
|
|
return IO.CanSetDO(name, value, out reason);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void SetValueSafe(int index, bool value)
|
|
|
|
{
|
|
|
|
if (IO.CanSetDO(name, value, out var _))
|
|
|
|
{
|
|
|
|
values[index] = value;
|
|
|
|
Singleton<IoProviderManager>.Instance.GetProvider(base.Provider)?.SetValue(this, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|