| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842 | using Aitex.Core.Common.DeviceData;using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.Event;using Aitex.Core.RT.IOCore;using Aitex.Core.RT.Log;using Aitex.Core.RT.OperationCenter;using Aitex.Core.RT.SCCore;using Aitex.Core.RT.Tolerance;using Aitex.Core.Util;using MECF.Framework.Common.Event;using System;using System.Collections.Generic;using System.Linq;using System.Xml;namespace Aitex.Core.RT.Device.Unit{    public class RfTuneItem    {        public float RangeFrom { get; set; }        public float RangeTo { get; set; }        public float Percent { get; set; }        public float Value { get; set; }    }    public class IoRf2 : BaseDevice, IDevice    {        public float PowerRange        {            get            {                return _scPowerRange == null ? 1000 : (float)_scPowerRange.IntValue;            }        }        public float ScaleFrequency        {            get            {                return 1000;            }        }        public string UnitPower        {            get            {                return "W";            }        }        public bool IsRfOn    //True:on        {            get            {                if (_diStatus != null)                    return _diStatus.Value;                return _doPowerOn.Value;            }        }        public float PowerSetPoint        {            get            {                float tuned = _isFloatAioType ? GetTuneValue(_aoPower.FloatValue, false) : GetTuneValue(_aoPower.Value, false);                float calibrated = CalibrationPower(tuned, false);                if (calibrated < 0)                    calibrated = 0;                return calibrated;            }            set            {                float tuned = GetTuneValue(value, true);                float calibrated = CalibrationPower(tuned, true);                if (calibrated < 0)                    calibrated = 0;                if (_isFloatAioType)                    _aoPower.FloatValue = calibrated;                else                    _aoPower.Value = (short)calibrated;            }        }        public float RFForwardPower        {            get            {                if (_aiForwardPower == null)                    return 0;                float tuned = _isFloatAioType                    ? GetTuneValue(_aiForwardPower.FloatValue, false)                    : GetTuneValue(_aiForwardPower.Value, false);                float calibrated = CalibrationPower(tuned, false);                if (calibrated < 0)                    calibrated = 0;                return calibrated;            }        }        public float RFReflectPower        {            get            {                return _aiReflectedPower == null ? 0 : (_isFloatAioType ? GetTuneValue(_aiReflectedPower.FloatValue, false) : GetTuneValue(_aiReflectedPower.Value, false));            }        }        public bool RFInterlock        {            get            {                return _diIntlk == null || _diIntlk.Value;            }        }        public bool MainPowerOnSetPoint        {            get            {                if (_doPowerOn != null)                    return _doPowerOn.Value;                return false;            }            set            {                if (_doPowerOn != null)                {                    if (!_doPowerOn.SetValue(value, out string reason))                    {                        LOG.Write(reason);                    }                }            }        }        private DateTime _powerOnStartTime;        private TimeSpan _powerOnElapsedTime;        public string PowerOnTime        {            get            {                if (IsRfOn)                    _powerOnElapsedTime = DateTime.Now - _powerOnStartTime;                return string.Format("{0}:{1}:{2}", ((int)_powerOnElapsedTime.TotalHours).ToString("00"),                    _powerOnElapsedTime.Minutes.ToString("00"), (_powerOnElapsedTime.Seconds > 0 ? (_powerOnElapsedTime.Seconds + 1) : 0).ToString("00"));            }        }        private AITRfData DeviceData        {            get            {                AITRfData data = new AITRfData()                {                    Module = Module,                    DeviceName = Name,                    DeviceSchematicId = DeviceID,                    DisplayName = Display,                    ForwardPower = RFForwardPower,                    ReflectPower = RFReflectPower,                    IsInterlockOk = RFInterlock,                    IsRfOn = IsRfOn,                    IsRfAlarm = _diAlarm.Value,                    PowerSetPoint = PowerSetPoint,                    ScalePower = PowerRange,                    UnitPower = UnitPower,                    PowerOnElapsedTime = PowerOnTime,                    EnablePulsing = false,                    EnableVoltageCurrent = false,                    IsToleranceError = !AlarmPowerToleranceAlarm.IsAcknowledged || !AlarmReflectPowerToleranceAlarm.IsAcknowledged,                    IsToleranceWarning = !AlarmPowerToleranceWarning.IsAcknowledged || !AlarmReflectPowerToleranceWarning.IsAcknowledged,                    WorkMode = (int)RfMode.ContinuousWaveMode,                };                return data;            }        }        private DIAccessor _diStatus = null;        private DIAccessor _diIntlk = null;        private DIAccessor _diAlarm;        private DOAccessor _doPowerOn = null;        private DOAccessor _doOn = null;        private AIAccessor _aiReflectedPower = null;        private AIAccessor _aiForwardPower = null;        private AOAccessor _aoPower = null;        //SC        private SCConfigItem _scEnablePowerAlarm;        private SCConfigItem _scPowerAlarmRange = null;        private SCConfigItem _scPowerAlarmTime = null;        private SCConfigItem _scPowerWarningRange = null;        private SCConfigItem _scPowerWarningTime = null;        private SCConfigItem _scEnableReflectPowerAlarm;        private SCConfigItem _scReflectPowerAlarmRange = null;        private SCConfigItem _scReflectPowerAlarmTime = null;        private SCConfigItem _scReflectPowerWarningRange = null;        private SCConfigItem _scReflectPowerWarningTime = null;        private SCConfigItem _scPowerRange;        private SCConfigItem _scCoefficient;        private SCConfigItem _scPowerOnTimeout;        private SCConfigItem _scPowerTuneEnable;        private SCConfigItem _scPowerTuneIsPercent;        private SCConfigItem _scPowerTuneTable;        private SCConfigItem[] _scPowerCalibrationTable;        private SCConfigItem _scPowerCalibrationEnable;        private F_TRIG _trigInterlock = new F_TRIG();        private R_TRIG _trigOn = new R_TRIG();        private R_TRIG _trigError = new R_TRIG();        readonly DeviceTimer _powerOnTimer = new DeviceTimer();        private const string RFHighReflect = "RFHighReflect";        private const string RFHardwareInterlock = "RFHardwareInterlock";        private const string RFOutOfTolerance = "RFOutOfTolerance";        public AlarmEventItem AlarmPowerOnFailed { get; set; }        public AlarmEventItem AlarmPowerToleranceWarning { get; set; }        public AlarmEventItem AlarmPowerToleranceAlarm { get; set; }        public AlarmEventItem AlarmReflectPowerToleranceWarning { get; set; }        public AlarmEventItem AlarmReflectPowerToleranceAlarm { get; set; }        public AlarmEventItem AlarmDeviceAlarm { get; set; }        private ToleranceChecker _checkerPowerWarning;        private ToleranceChecker _checkerPowerAlarm;        private ToleranceChecker _checkerReflectPowerWarning;        private ToleranceChecker _checkerReflectPowerAlarm;        private bool _isFloatAioType = false;        private List<RfTuneItem> _tuneTable;        //calibration        private List<CalbrationParas> _calibrationFormla;        private List<RFCalibrationItem> _rfCalibrationDatas = new List<RFCalibrationItem>();        private const int TenPoints = 10;        public IoRf2(string module, XmlElement node, string ioModule = "")        {            var attrModule = node.GetAttribute("module");            base.Module = string.IsNullOrEmpty(attrModule) ? module : attrModule;            base.Name = node.GetAttribute("id");            base.Display = node.GetAttribute("display");            base.DeviceID = node.GetAttribute("schematicId");            string scBasePath = node.GetAttribute("scBasePath");            if (string.IsNullOrEmpty(scBasePath))                scBasePath = $"{Module}.{Name}";            else            {                scBasePath = scBasePath.Replace("{module}", Module);            }            _isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float");            _diStatus = ParseDiNode("diOn", node, ioModule);            _diIntlk = ParseDiNode("diInterlock", node, ioModule);            _diAlarm = ParseDiNode("diAlarm", node, ioModule);            _doPowerOn = ParseDoNode("doPowerOn", node, ioModule);            _doOn = ParseDoNode("doOn", node, ioModule);            _aiReflectedPower = ParseAiNode("aiReflectPower", node, ioModule);            _aiForwardPower = ParseAiNode("aiForwardPower", node, ioModule);            _aoPower = ParseAoNode("aoPower", node, ioModule);            _scEnablePowerAlarm = ParseScNode("scEnablePowerAlarm", node, ioModule, $"{scBasePath}.{Name}.EnablePowerAlarm");            _scPowerAlarmRange = ParseScNode("scPowerAlarmRange", node, ioModule, $"{scBasePath}.{Name}.PowerAlarmRange");            _scPowerAlarmTime = ParseScNode("scPowerAlarmTime", node, ioModule, $"{scBasePath}.{Name}.PowerAlarmTime");            _scPowerWarningRange = ParseScNode("scPowerWarningRange", node, ioModule, $"{scBasePath}.{Name}.PowerWarningRange");            _scPowerWarningTime = ParseScNode("scPowerWarningTime", node, ioModule, $"{scBasePath}.{Name}.PowerWarningTime");            _scEnableReflectPowerAlarm = ParseScNode("scEnableReflectPowerAlarm", node, ioModule, $"{scBasePath}.{Name}.EnableReflectPowerAlarm");            _scReflectPowerAlarmRange = ParseScNode("scReflectPowerAlarmRange", node, ioModule, $"{scBasePath}.{Name}.ReflectPowerAlarmRange");            _scReflectPowerAlarmTime = ParseScNode("scReflectPowerAlarmTime", node, ioModule, $"{scBasePath}.{Name}.ReflectPowerAlarmTime");            _scReflectPowerWarningRange = ParseScNode("scReflectPowerWarningRange", node, ioModule, $"{scBasePath}.{Name}.ReflectPowerWarningRange");            _scReflectPowerWarningTime = ParseScNode("scReflectPowerWarningTime", node, ioModule, $"{scBasePath}.{Name}.ReflectPowerWarningTime");            _scPowerRange = ParseScNode("scPowerRange", node, ioModule, $"{scBasePath}.{Name}.PowerRange");            _scCoefficient = ParseScNode("scPowerCoefficient", node, ioModule, $"{scBasePath}.{Name}.PowerCoefficient");            _scPowerOnTimeout = ParseScNode("scPowerOnTimeout", node, ioModule, $"{scBasePath}.{Name}.PowerOnTimeout");            _scPowerTuneEnable = SC.GetConfigItem($"{scBasePath}.{Name}.PowerTuneEnable");            _scPowerTuneIsPercent = SC.GetConfigItem($"{scBasePath}.{Name}.PowerTuneIsPercent");            _scPowerTuneTable = SC.GetConfigItem($"{scBasePath}.{Name}.PowerTuneTable");            _scPowerCalibrationTable = new SCConfigItem[10];            for (int i = 0; i < _scPowerCalibrationTable.Length; i++)            {                _scPowerCalibrationTable[i] = SC.GetConfigItem($"{scBasePath}.{Name}.Rate{i + 1}MeterPower");            }            _scPowerCalibrationEnable = SC.GetConfigItem($"{scBasePath}.{Name}.PowerCalibrationEnable");                    }        public bool Initialize()        {            UpdateTuneTable();            InitializeCalalibration();            DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);            DATA.Subscribe($"{Module}.{Name}.PowerSetPoint", () => PowerSetPoint);            DATA.Subscribe($"{Module}.{Name}.ForwardPower", () => RFForwardPower);            DATA.Subscribe($"{Module}.{Name}.ReflectPower", () => RFReflectPower);            DATA.Subscribe($"{Module}.{Name}.IsRfOn", () => _diStatus.Value);            DATA.Subscribe($"{Module}.{Name}.IsInterlockOK", () => RFInterlock);            DATA.Subscribe($"{Module}.{Name}.RfOnSetPoint", () => _doOn.Value);            DATA.Subscribe($"{Module}.{Name}.IsAlarm", () => _diAlarm.Value);            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetPowerOnOff}", SetPowerOnOff);            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetPower}", SetPower);            AlarmPowerToleranceWarning = SubscribeAlarm($"{Module}.{Name}.PowerToleranceWarning", "", ResetPowerWarningChecker, EventLevel.Warning);            AlarmPowerToleranceAlarm = SubscribeAlarm($"{Module}.{Name}.PowerToleranceAlarm", "", ResetPowerAlarmChecker);            AlarmReflectPowerToleranceWarning = SubscribeAlarm($"{Module}.{Name}.ReflectPowerToleranceWarning", "", ResetReflectPowerWarningChecker, EventLevel.Warning);            AlarmReflectPowerToleranceAlarm = SubscribeAlarm($"{Module}.{Name}.ReflectPowerToleranceAlarm", "", ResetReflectPowerAlarmChecker);            AlarmPowerOnFailed = SubscribeAlarm($"{Module}.{Name}.PowerOnFailed", $"Failed turn {Display} on", null);            AlarmDeviceAlarm = SubscribeAlarm($"{Module}.{Name}.DeviceAlarm", $"{Display} alarmed", ResetDeviceAlarmChecker);            _checkerPowerWarning = new ToleranceChecker(_scPowerAlarmTime.IntValue);            _checkerPowerAlarm = new ToleranceChecker(_scReflectPowerAlarmTime.IntValue);            _checkerReflectPowerWarning = new ToleranceChecker(_scPowerAlarmTime.IntValue);            _checkerReflectPowerAlarm = new ToleranceChecker(_scReflectPowerAlarmTime.IntValue);            return true;        }        private bool SetPowerOnOff(out string reason, int time, object[] param)        {            return SetPowerOnOff(Convert.ToBoolean((string)param[0]), out reason);        }        public bool SetMainPowerOnOff(bool isOn, out string reason)        {            MainPowerOnSetPoint = isOn;            reason = string.Empty;            return true;        }        private bool SetPower(out string reason, int time, object[] param)        {            reason = string.Empty;            float power = (float)Convert.ToDouble((string)param[0]);            if (power < 0 || power > PowerRange)            {                reason = $"{Name} setpoint value {power} is out of power range, should between 0 and {PowerRange}";                EV.PostWarningLog(Module, reason);                return false;            }            PowerSetPoint = power;            reason = $"{Name} set power to {power}";            EV.PostInfoLog(Module, reason);            return true;        }        public void Stop()        {            string reason = String.Empty;            _aoPower.Value = 0;        }        public void Terminate()        {        }        public void Monitor()        {            try            {                if (_powerOnTimer.IsTimeout() && !_diStatus.Value)                {                    AlarmPowerOnFailed.Description =                        $"Can not turn {Display} power on in {(int)(_powerOnTimer.GetElapseTime() / 1000)} seconds";                    AlarmPowerOnFailed.Set();                    SetPowerOnOff(false, out string _);                    _powerOnTimer.Stop();                }                _trigOn.CLK = IsRfOn;                if (_trigOn.Q)                {                    _powerOnStartTime = DateTime.Now;                    _checkerPowerAlarm.Reset(_scPowerAlarmTime.IntValue);                    _checkerPowerWarning.Reset(_scPowerWarningTime.IntValue);                    _checkerReflectPowerAlarm.Reset(_scReflectPowerAlarmTime.IntValue);                    _checkerReflectPowerWarning.Reset(_scReflectPowerWarningTime.IntValue);                }                if (_trigOn.M)                {                    _checkerPowerWarning.Monitor(RFForwardPower, PowerSetPoint - _scPowerWarningRange.IntValue, PowerSetPoint + _scPowerWarningRange.IntValue, _scPowerWarningTime.IntValue);                    if (_checkerPowerWarning.Trig)                    {                        AlarmPowerToleranceWarning.Description = $"{Display} Forward power {RFForwardPower} out of range[{(PowerSetPoint - _scPowerWarningRange.IntValue)},{(PowerSetPoint + _scPowerWarningRange.IntValue)}] in {_scPowerWarningTime.IntValue} seconds";                        AlarmPowerToleranceWarning.Set();                    }                    _checkerPowerAlarm.Monitor(RFForwardPower, PowerSetPoint - _scPowerAlarmRange.IntValue, PowerSetPoint + _scPowerAlarmRange.IntValue, _scPowerAlarmTime.IntValue);                    if (_checkerPowerAlarm.Trig)                    {                        AlarmPowerToleranceAlarm.Description = $"{Display} Forward power {RFForwardPower} out of range[{(PowerSetPoint - _scPowerAlarmRange.IntValue)},{(PowerSetPoint + _scPowerAlarmRange.IntValue)}] in {_scPowerAlarmTime.IntValue} seconds";                        AlarmPowerToleranceAlarm.Set();                        SetPowerOnOff(false, out _);                    }                    _checkerReflectPowerWarning.Monitor(RFReflectPower, 0, _scReflectPowerWarningRange.IntValue, _scReflectPowerWarningTime.IntValue);                    if (_checkerReflectPowerWarning.Trig)                    {                        AlarmReflectPowerToleranceWarning.Description = $"{Display} reflect power {RFReflectPower} out of range[0,{_scReflectPowerWarningRange.IntValue}] in {_scReflectPowerWarningTime.IntValue} seconds";                        AlarmReflectPowerToleranceWarning.Set();                    }                    _checkerReflectPowerAlarm.Monitor(RFReflectPower, 0, _scReflectPowerAlarmRange.IntValue, _scReflectPowerAlarmTime.IntValue);                    if (_checkerReflectPowerAlarm.Trig)                    {                        AlarmReflectPowerToleranceAlarm.Description = $"{Display} reflect power {RFReflectPower} out of range[0,{_scReflectPowerAlarmRange.IntValue}] in {_scReflectPowerAlarmTime.IntValue} seconds";                        AlarmReflectPowerToleranceAlarm.Set();                        SetPowerOnOff(false, out _);                    }                }                _trigError.CLK = _diAlarm.Value;                if (_trigError.Q)                {                    AlarmDeviceAlarm.Set();                    SetPowerOnOff(false, out string _);                }            }            catch (Exception ex)            {                LOG.Write(ex);            }        }        public void Reset()        {            _trigInterlock.RST = true;            _trigError.RST = true;            _trigOn.RST = true;            AlarmDeviceAlarm.Reset();            AlarmPowerOnFailed.Reset();            AlarmPowerToleranceAlarm.Reset();            AlarmPowerToleranceWarning.Reset();            AlarmReflectPowerToleranceAlarm.Reset();            AlarmReflectPowerToleranceWarning.Reset();        }        public bool ResetDeviceAlarmChecker()        {            return !_diAlarm.Value;        }        public bool ResetPowerWarningChecker()        {            _checkerPowerWarning.Reset(_scPowerWarningTime.IntValue);            return true;        }        public bool ResetPowerAlarmChecker()        {            _checkerPowerAlarm.Reset(_scPowerAlarmTime.IntValue);            return true;        }        public bool ResetReflectPowerWarningChecker()        {            _checkerReflectPowerWarning.Reset(_scReflectPowerWarningTime.IntValue);            return true;        }        public bool ResetReflectPowerAlarmChecker()        {            _checkerReflectPowerAlarm.Reset(_scReflectPowerAlarmTime.IntValue);            return true;        }        public bool SetPowerOnOff(bool isOn, out string reason)        {            if (!_diIntlk.Value)            {                if (isOn)                {                    reason = $"{Name} interlock is not satisfied, can not be on";                    EV.PostWarningLog(Module, reason);                    return false;                }            }            if (!isOn)            {                PowerSetPoint = 0;            }            bool result = _doOn.SetValue(isOn, out reason);            if (result)            {                reason = $"Set {Name} power " + (isOn ? "On" : "Off");                EV.PostInfoLog(Module, reason);                if (isOn)                    _powerOnTimer.Start(Math.Min(Math.Max(2, _scPowerOnTimeout.IntValue), 30) * 1000);                else                    _powerOnTimer.Stop();            }            else            {                EV.PostAlarmLog(Module, reason);            }            return result;        }        public void UpdateTuneTable()        {            _tuneTable = new List<RfTuneItem>();            // 100#200#5#-6;            string scValue = _scPowerTuneTable.StringValue;            if (string.IsNullOrEmpty(scValue))                return;            string[] items = scValue.Split(';');            for (int i = 0; i < items.Length; i++)            {                string itemValue = items[i];                if (!string.IsNullOrEmpty(itemValue))                {                    string[] pairValue = itemValue.Split('#');                    if (pairValue.Length == 4)                    {                        if (int.TryParse(pairValue[0], out int rangeItem1)                            && int.TryParse(pairValue[1], out int rangeItem2)                            && int.TryParse(pairValue[2], out int setItem1)                            && int.TryParse(pairValue[3], out int setItem2))                        {                            _tuneTable.Add(new RfTuneItem()                            {                                Percent = setItem1,                                RangeFrom = rangeItem1,                                RangeTo = rangeItem2,                                Value = setItem2,                            });                        }                    }                }            }        }        public float GetTuneValue(float raw, bool isOutput)        {            if (_scPowerTuneEnable == null || !_scPowerTuneEnable.BoolValue)                return raw;            float tuned = raw;            foreach (var rfTuneItem in _tuneTable)            {                if (raw >= rfTuneItem.RangeFrom && raw <= rfTuneItem.RangeTo)                {                    if (isOutput)                    {                        double percent = rfTuneItem.Percent / 100.0;                        tuned = (float)(_scPowerTuneIsPercent.BoolValue ? (raw + raw * percent) : (raw + rfTuneItem.Value));                    }                    else                    {                        double percent = rfTuneItem.Percent / 100.0;                        percent = 1 + percent;                        if (Math.Abs(percent) < 0.01)                            percent = 1;                        tuned = (float)(_scPowerTuneIsPercent.BoolValue ? (raw / percent) : (raw - rfTuneItem.Value));                    }                }            }            if (tuned < 0)            {                tuned = 0;            }            if (tuned > PowerRange)            {                tuned = PowerRange;            }            return tuned;        }        public void InitializeCalalibration()        {            var records = new List<RFCalibrationItem>();            for (int i = 0; i < 10; i++)            {                records.Add(new RFCalibrationItem()                {                    Setpoint = (float)(PowerRange / 10 * (i + 1)),                    Meter = (float)_scPowerCalibrationTable[i].DoubleValue,                });            }            _calibrationFormla = new List<CalbrationParas>();            for (int i = 0; i < records.Count; i++)            {                if (i + 1 >= records.Count)                    break;                var para = Caculate(records[i], records[i + 1]);                _calibrationFormla.Add(para);            }            var para0 = new CalbrationParas()            {                upperLimit = (float)(PowerRange / 10),                lowerLimit = 0,                paraA = _calibrationFormla[0].paraA,                paraB = _calibrationFormla[0].paraB,            };            _calibrationFormla.Add(para0);            _calibrationFormla = _calibrationFormla.OrderBy(x => x.lowerLimit).ToList();        }        public void UpdateCalibrationInfo(List<float> meterList)        {            for (int i = 0; i < meterList.Count; i++)            {                _scPowerCalibrationTable[i].DoubleValue = meterList[i];            }            InitializeCalalibration();        }        private CalbrationParas Caculate(RFCalibrationItem record1, RFCalibrationItem record2)        {            var para = new CalbrationParas();            para.paraA = (record1.Setpoint - record2.Setpoint) / (record1.Meter - record2.Meter);            para.paraB = record1.Setpoint - record1.Meter * para.paraA;            para.upperLimit = record1.Setpoint > record2.Setpoint ? record1.Setpoint : record2.Setpoint;            para.lowerLimit = record1.Setpoint < record2.Setpoint ? record1.Setpoint : record2.Setpoint;            return para;        }        private float CalibrationPower(float power, bool output)        {            //default enable            if (_scPowerCalibrationEnable != null && !_scPowerCalibrationEnable.BoolValue)                return power;            float ret = power;            if (output)            {                if (_calibrationFormla != null && _calibrationFormla.Any())                {                    var para = _calibrationFormla.FirstOrDefault(x => x.lowerLimit <= power && x.upperLimit >= power);                    ret = ret * para.paraA + para.paraB;                }                return ret;            }            if (_calibrationFormla != null && _calibrationFormla.Any())            {                var para = _calibrationFormla.FirstOrDefault(x => x.lowerLimit <= power && x.upperLimit >= power);                if (para.paraA == 0 && para.paraB == 0 && power > 0)                    para = _calibrationFormla[_calibrationFormla.Count - 1];                ret = (ret - para.paraB) / para.paraA;            }            return ret < 0 || ret > float.MaxValue ? 0 : ret;        }        public void SaveRFCalibrationData()        {            if (_rfCalibrationDatas.Count != TenPoints)            {                EV.PostInfoLog(Module, $"Save Rf calibration data failed, for some points have not been calibrated.");                return;            }            _rfCalibrationDatas = _rfCalibrationDatas.OrderBy(x => x.Setpoint).ToList();            //RFCalibrationData data = new RFCalibrationData()            //{            //    Module = Module,            //    Name = Name,            //    Rate1Setpoint = _rfCalibrationDatas[0].Setpoint,            //    Rate1Feedback = _rfCalibrationDatas[0].Feedback,            //    Rate1Meter = _rfCalibrationDatas[0].Meter,            //    Rate2Setpoint = _rfCalibrationDatas[1].Setpoint,            //    Rate2Feedback = _rfCalibrationDatas[1].Feedback,            //    Rate2Meter = _rfCalibrationDatas[1].Meter,            //    Rate3Setpoint = _rfCalibrationDatas[2].Setpoint,            //    Rate3Feedback = _rfCalibrationDatas[2].Feedback,            //    Rate3Meter = _rfCalibrationDatas[2].Meter,            //    Rate4Setpoint = _rfCalibrationDatas[3].Setpoint,            //    Rate4Feedback = _rfCalibrationDatas[3].Feedback,            //    Rate4Meter = _rfCalibrationDatas[3].Meter,            //    Rate5Setpoint = _rfCalibrationDatas[4].Setpoint,            //    Rate5Feedback = _rfCalibrationDatas[4].Feedback,            //    Rate5Meter = _rfCalibrationDatas[4].Meter,            //    Rate6Setpoint = _rfCalibrationDatas[5].Setpoint,            //    Rate6Feedback = _rfCalibrationDatas[5].Feedback,            //    Rate6Meter = _rfCalibrationDatas[5].Meter,            //    Rate7Setpoint = _rfCalibrationDatas[6].Setpoint,            //    Rate7Feedback = _rfCalibrationDatas[6].Feedback,            //    Rate7Meter = _rfCalibrationDatas[6].Meter,            //    Rate8Setpoint = _rfCalibrationDatas[7].Setpoint,            //    Rate8Feedback = _rfCalibrationDatas[7].Feedback,            //    Rate8Meter = _rfCalibrationDatas[7].Meter,            //    Rate9Setpoint = _rfCalibrationDatas[8].Setpoint,            //    Rate9Feedback = _rfCalibrationDatas[8].Feedback,            //    Rate9Meter = _rfCalibrationDatas[8].Meter,            //    Rate10Setpoint = _rfCalibrationDatas[9].Setpoint,            //    Rate10Feedback = _rfCalibrationDatas[9].Feedback,            //    Rate10Meter = _rfCalibrationDatas[9].Meter,            //};            //RFCalibrationDataRecorder.Add(data);            for (int i = 0; i < _rfCalibrationDatas.Count; i++)            {                SC.SetItemValue($"{Module}.RF.Rate{i + 1}MeterPower", (double)_rfCalibrationDatas[i].Meter);            }            InitializeCalalibration();            EV.PostInfoLog(Module, $"Save RF calibration data successed.");        }        public void SaveRFCalibrationPoint(float setpoint, float meterValue)        {            if (_rfCalibrationDatas.Any(x => x.Setpoint == setpoint))            {                _rfCalibrationDatas.RemoveAll(x => x.Setpoint == setpoint);            }            var data = new RFCalibrationItem()            {                Setpoint = setpoint,                Meter = meterValue,                Feedback = RFForwardPower,            };            _rfCalibrationDatas.Add(data);        }        private struct CalbrationParas        {            //y = a*x + b, x is setpoint            public float paraA;            public float paraB;            public float upperLimit;            public float lowerLimit;        }        private class RFCalibrationItem        {            public float Setpoint { get; set; }            public float Feedback { get; set; }            public float Meter { get; set; }        }    }}
 |