Sic04/FrameworkLocal/RTEquipmentLibrary/Unit/IoPressureMeter.cs

153 lines
4.1 KiB
C#
Raw Normal View History

2022-09-19 09:16:33 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using Aitex.Core.Common.DeviceData;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.IOCore;
using Aitex.Core.RT.SCCore;
using Aitex.Core.RT.Tolerance;
using Aitex.Core.Util;
namespace Aitex.Core.RT.Device.Unit
{
public interface IPressureMeter
{
}
public class IoPressureMeter : BaseDevice, IDevice, IPressureMeter
{
public enum UnitType
{
Torr,
Pascal,
Mbar,
Pascal972B,
}
public double Value
{
get
{
if (unitType == UnitType.Torr)
return GetTorr();
else if (unitType == UnitType.Pascal)
return GetPascal();
else if (unitType == UnitType.Pascal972B)
return GetPascal972B();
else
return GetMbar();
}
}
public string Unit { get; set; }
private AIAccessor ai = null;
//private SCConfigItem _scMinFlow;
//private SCConfigItem _scMaxFlow;
private RD_TRIG _trigValveOpenClose = new RD_TRIG();
private UnitType unitType = UnitType.Pascal;
//
private double rangeMin = Int16.MinValue * 0.1;
private double rangeMax = Int16.MaxValue * 0.9;
private double min = Int16.MinValue * 0.1;
private double max = Int16.MaxValue * 0.9;
public IoPressureMeter(string module, XmlElement node, string ioModule = "")
{
var attrModule = node.GetAttribute("module");
base.Module = string.IsNullOrEmpty(attrModule) ? module : attrModule;
Name = node.GetAttribute("id");
Display = node.GetAttribute("display");
DeviceID = node.GetAttribute("schematicId");
Unit = node.GetAttribute("unit");
ai = ParseAiNode("aiValue", node, ioModule);
string[] range = node.GetAttribute("range").Split(',');
double.TryParse(range[0], out rangeMin);
double.TryParse(range[1], out rangeMax);
//Full Scale 0-10V
//this.min = Int16.MaxValue * min / 10.0;
//this.max = Int16.MaxValue * max / 10.0;
}
public bool Initialize()
{
DATA.Subscribe($"{Module}.{Name}.Value", () => Value);
return true;
}
public void Terminate()
{
}
public void Monitor()
{
}
public void Reset()
{
}
public static double Voltage(double pressure)
{
double logic = 4.0 + Math.Log10(pressure);
double min = Int16.MaxValue * 1 / 10.0;
double max = Int16.MaxValue * 9 / 10.0;
return Converter.Logic2Phy(logic, 1, 9, min, max);
}
public static double Voltage2(double pressure)
{
return Converter.Logic2Phy(pressure, 0, 1333 * 100, 0x0000, 0x5B6D);
}
private double GetPascal()
{
double voltage = Converter.Phy2Logic(ai.Value, rangeMin, rangeMax, min, max);
return Math.Pow(10.0, voltage - 4.0); //pascal
}
private double GetPascal972B()
{
double voltage = Converter.Phy2Logic(ai.Value, rangeMin, rangeMax, min, max);
return Math.Pow(10.0, 2 * voltage - 9); //pascal
}
private double GetMbar()
{
double voltage = Converter.Phy2Logic(ai.Value, rangeMin, rangeMax, min, max);
return Math.Pow(10.0, voltage - 6.0); //mbar
}
private double GetTorr()
{
double voltage = Converter.Phy2Logic(ai.Value, rangeMin, rangeMax, min, max);
return Math.Pow(10.0, voltage - 6.125); //torr
}
private double GetAIScale()
{
return Converter.Phy2Logic(ai.Value, 0, 1333, 0x0000, 0x7fff);
}
}
}