示例#1
0
 /// <summary>
 /// Config the ADC Trigger.
 /// </summary>
 /// <param name="channelEnabled"></param>
 // ReSharper disable once MemberCanBePrivate.Global
 public void ConfigAdcTrigger(ADCChannels channelEnabled)
 {
     lock (_lockController)
     {
         Send(new CommandConfigADCTrigger(channelEnabled));
     }
 }
        public bool DoBlindSearch(BlindSearchArgsF HArgsF, BlindSearchArgsF VArgsF, ADCChannels AdcUsed, out List <Point3D> ScanResults)
        {
            ScanResults = new List <Point3D>();
            int XAxisNo = HArgsF.AxisNoBaseZero;
            int YAxisNo = VArgsF.AxisNoBaseZero;

            if (XAxisNo > MAX_AXIS - MIN_AXIS || XAxisNo < 0 || YAxisNo > MAX_AXIS - MIN_AXIS || YAxisNo < 0)
            {
                return(false);
            }

            var HArgs = new BlindSearchArgs()
            {
                Interval = (ushort)(HArgsF.Interval * AxisArgsList[XAxisNo].GainFactor),
                Speed    = HArgsF.Speed,
                Gap      = (ushort)(HArgsF.Gap * AxisArgsList[XAxisNo].GainFactor),
                Unit     = HArgsF.AxisNoBaseZero + UnitID.U1,
                Range    = (uint)(HArgsF.Range * AxisArgsList[XAxisNo].GainFactor),
            };

            var VArgs = new BlindSearchArgs()
            {
                Interval = (ushort)(VArgsF.Interval * AxisArgsList[YAxisNo].GainFactor),
                Speed    = VArgsF.Speed,
                Gap      = (ushort)(VArgsF.Gap * AxisArgsList[YAxisNo].GainFactor),
                Unit     = VArgsF.AxisNoBaseZero + UnitID.U1,
                Range    = (uint)(VArgsF.Range * AxisArgsList[YAxisNo].GainFactor),
            };

            _controller.StartBlindSearch(HArgs, VArgs, AdcUsed, out ScanResults);
            return(true);
        }
 /// <summary>
 /// Read the voltage of the force of the contact sensors.
 /// </summary>
 private double ReadVoltage(ADCChannels Ch)
 {
     try
     {
         var volts = Controller.ReadAN(Ch);
         return(volts[0]);
     }
     catch (Exception ex)
     {
         return(0);
     }
 }
示例#4
0
        public ADCValues(ADCChannels EnabeldCH, byte[] Data)
        {
            using (MemoryStream stream = new MemoryStream(Data))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    Values = new List <short>();

                    foreach (var ch in Enum.GetValues(typeof(ADCChannels)))
                    {
                        if (EnabeldCH.HasFlag((ADCChannels)ch))
                        {
                            Values.Add(reader.ReadInt16());
                        }
                    }
                }
            }
        }
示例#5
0
        /// <summary>
        /// Read the values of the specified channels of the inner ADC.
        /// </summary>
        /// <param name="channelEnabled">Concat multiple channels with `|` operator.</param>
        /// <returns></returns>
        public double[] ReadAdc(ADCChannels channelEnabled)
        {
            RxPackage package;

            lock (_lockController)
            {
                Send(new CommandReadADC(channelEnabled));
                Read(out package, CancellationToken.None);
            }

            var adc = new ADCValues(channelEnabled, package.Payload);

            // convert adc raw-data to mV.
            var valConv = new List <double>();

            foreach (var v in adc.Values)
            {
                valConv.Add(ConvertAdcRawTomV(v));
            }

            return(valConv.ToArray());
        }
示例#6
0
        /// <summary>
        /// Perform blind-search alignment.
        /// </summary>
        /// <param name="HAxis"></param>
        /// <param name="VAxis"></param>
        /// <param name="Range"></param>
        /// <param name="Gap"></param>
        /// <param name="Interval"></param>
        /// <param name="Speed"></param>
        /// <param name="AnalogCapture"></param>
        /// <param name="ScanResults"></param>
        public void StartBlindSearch(IAxis HAxis, IAxis VAxis, double Range, double Gap, double Interval, int Speed, ADCChannels AnalogCapture, out List <Point3D> ScanResults)
        {
            ScanResults = null;

            if (HAxis.GetType() != typeof(IrixiM12Axis) || VAxis.GetType() != typeof(IrixiM12Axis))
            {
                throw new Exception("The axis you specified does not support the Blind-Search function.");
            }

            var hUnit = ((IrixiM12Axis)HAxis).ID;
            var vUnit = ((IrixiM12Axis)VAxis).ID;

            // limit the speed to the maximum value defined in the config file.
            var horiSpeed = Speed * HAxis.MaxSpeed / 100;

            if (horiSpeed == 0)
            {
                horiSpeed = 1;
            }
            else if (horiSpeed > 100)
            {
                horiSpeed = 100;
            }

            // limit the speed to the maximum value defined in the config file.
            var vertSpeed = Speed * VAxis.MaxSpeed / 100;

            if (vertSpeed == 0)
            {
                vertSpeed = 1;
            }
            else if (vertSpeed > 100)
            {
                vertSpeed = 100;
            }

            BlindSearchArgs horiArgs = new BlindSearchArgs(
                hUnit,
                (uint)HAxis.UnitHelper.ConvertDistanceToSteps(Range),
                (uint)HAxis.UnitHelper.ConvertDistanceToSteps(Gap),
                (ushort)HAxis.UnitHelper.ConvertDistanceToSteps(Interval),
                (byte)horiSpeed);

            BlindSearchArgs veriArgs = new BlindSearchArgs(
                vUnit,
                (uint)VAxis.UnitHelper.ConvertDistanceToSteps(Range),
                (uint)VAxis.UnitHelper.ConvertDistanceToSteps(Gap),
                (ushort)VAxis.UnitHelper.ConvertDistanceToSteps(Interval),
                (byte)vertSpeed);


            _m12.StartBlindSearch(horiArgs, veriArgs, AnalogCapture, out ScanResults);
        }
示例#7
0
        /// <summary>
        /// Perform Fast-1D alignment with dual-adc-channel-capture.
        /// </summary>
        /// <param name="Axis"></param>
        /// <param name="Range"></param>
        /// <param name="Interval"></param>
        /// <param name="Speed"></param>
        /// <param name="AnalogCapture"></param>
        /// <param name="ScanResult"></param>
        public void StartFast1D(IAxis Axis, double Range, double Interval, int Speed, ADCChannels AnalogCapture, out List <Point2D> ScanResult, ADCChannels AnalogCapture2, out List <Point2D> ScanResult2)
        {
            ScanResult  = null;
            ScanResult2 = null;

            if (Axis.GetType() != typeof(IrixiM12Axis))
            {
                throw new Exception("The axis you specified does not support the fast alignment function.");
            }

            var unit = ((IrixiM12Axis)Axis).ID;

            var rangeInStep    = Axis.UnitHelper.ConvertDistanceToSteps(Range);
            var intervalInStep = (ushort)Axis.UnitHelper.ConvertDistanceToSteps(Interval);

            // limit the speed to the maximum value defined in the config file.
            var cSpeed = (byte)(Speed * Axis.MaxSpeed / 100);

            if (cSpeed == 0)
            {
                cSpeed = 1;
            }
            else if (cSpeed > 100)
            {
                cSpeed = 100;
            }

            _m12.StartFast1D(unit, rangeInStep, intervalInStep, cSpeed, AnalogCapture, out ScanResult, AnalogCapture2, out ScanResult2);
        }
示例#8
0
 /// <summary>
 /// Perform Fast-1D alignment with single-adc-channel-capture.
 /// </summary>
 /// <param name="Axis"></param>
 /// <param name="Range"></param>
 /// <param name="Interval"></param>
 /// <param name="Speed"></param>
 /// <param name="AnalogCapture"></param>
 /// <param name="ScanResult"></param>
 public void StartFast1D(IAxis Axis, double Range, double Interval, int Speed, ADCChannels AnalogCapture, out List <Point2D> ScanResult)
 {
     StartFast1D(Axis, Range, Interval, Speed, AnalogCapture, out ScanResult, 0, out List <Point2D> ss);
 }
示例#9
0
        /// <summary>
        /// Perform the blind-search.
        /// </summary>
        /// <param name="horizontalArgs">The arguments of the horizontal axis.</param>
        /// <param name="verticalArgs">The arguments of the vertical axis.</param>
        /// <param name="adcUsed">Note: only one ADC channel can be used to sample.</param>
        /// <param name="scanResults">Return the intensity-to-position points.</param>
        /// <param name="progressReportHandle"></param>
        public void StartBlindSearch(BlindSearchArgs horizontalArgs, BlindSearchArgs verticalArgs, ADCChannels adcUsed,
                                     out List <Point3D> scanResults, IProgress <BlindSearchProgressReport> progressReportHandle = null)
        {
            //! The memory is cleared automatically, you don't have to clear it manually.

            // arguments checking.
            if (GlobalDefinition.NumberOfSetBits((int)adcUsed) != 1)
            {
                throw new ArgumentException("only 1 analog capture channel can be activated.", nameof(adcUsed));
            }

            if (horizontalArgs.Gap < horizontalArgs.Interval)
            {
                throw new ArgumentException($"the capture interval of {horizontalArgs.Unit} should be less than the gap.");
            }

            if (verticalArgs.Gap < verticalArgs.Interval)
            {
                throw new ArgumentException($"the capture interval of {verticalArgs.Unit} should be less than the gap.");
            }

            scanResults = new List <Point3D>();

            ConfigAdcTrigger(adcUsed);

            // report progress.
            progressReportHandle?.Report(new BlindSearchProgressReport(BlindSearchProgressReport.ProgressStage.SCAN, 0));

            lock (_lockController)
            {
                Send(new CommandBlindSearch(horizontalArgs, verticalArgs));
            }

            var err = WaitBySystemState(200, 120000, new List <UnitID>()
            {
                horizontalArgs.Unit, verticalArgs.Unit
            });

            if (err.Error != Errors.ERR_NONE)
            {
                throw new SystemErrorException(err);
            }
            else
            {
                //var values = new List<double>(new double[100000]);
                // read the sampling points from the memory.
                var adcValues = ReadMemoryAll(new Progress <MemoryReadProgressReport>(e =>
                {
                    // report transmission progress.
                    progressReportHandle?.Report(new BlindSearchProgressReport(BlindSearchProgressReport.ProgressStage.TRANS, e.Complete));
                })).ToList();

                var    indexOfAdcValues = 0;
                var    cycle = 0;
                double x = 0, y = 0;

                // rebuild the relationship between the position and the intensity.
                while (true)
                {
                    var seq = cycle % 4;

                    BlindSearchArgs activeParam;
                    int             moveDirection;
                    switch (seq)
                    {
                    case 0:         // move horizontal axis (x) to positive direction (right)
                        activeParam   = horizontalArgs;
                        moveDirection = 1;
                        break;

                    case 1:
                        activeParam   = verticalArgs;
                        moveDirection = 1;
                        break;

                    case 2:
                        activeParam   = horizontalArgs;
                        moveDirection = -1;
                        break;

                    case 3:
                        activeParam   = verticalArgs;
                        moveDirection = -1;
                        break;

                    default:
                        throw new InvalidOperationException("unknown sequence in the blind search.");
                    }

                    var steps = moveDirection * (activeParam.Gap * (cycle / 2 + 1));

                    if (Math.Abs(steps) > activeParam.Range)
                    {
                        break;
                    }

                    // for the horizontal axis.
                    if (activeParam == horizontalArgs)
                    {
                        var originPos = x;

                        while (true)
                        {
                            scanResults.Add(indexOfAdcValues > (adcValues.Count - 1)
                                ? new Point3D(x, y, 0)
                                : new Point3D(x, y, adcValues[indexOfAdcValues++]));

                            x += moveDirection * activeParam.Interval;

                            if (!(Math.Abs(x - originPos) >= Math.Abs(steps)))
                            {
                                continue;
                            }

                            x = originPos + steps;
                            break;
                        }
                    }
                    else if (activeParam == verticalArgs)
                    {
                        var originPos = y;

                        while (true)
                        {
                            scanResults.Add(indexOfAdcValues > (adcValues.Count - 1)
                                ? new Point3D(x, y, 0)
                                : new Point3D(x, y, adcValues[indexOfAdcValues++]));

                            y += moveDirection * activeParam.Interval;

                            if (!(Math.Abs(y - originPos) >= Math.Abs(steps)))
                            {
                                continue;
                            }

                            y = originPos + steps;
                            break;
                        }
                    }

                    cycle++;
                }

                //// output debug data.
                //StringBuilder sb = new StringBuilder();
                //foreach(var point in ScanResults)
                //{
                //    sb.Append($"{point.X}\t{point.Y}\t{point.Z}\r\n");
                //}

                if (scanResults.Count != adcValues.Count)
                {
                    throw new ADCSamplingPointMissException(scanResults.Count, adcValues.Count);
                }
            }
        }
示例#10
0
 public M12AnalogInputUpdatedArgs(ADCChannels Channel, double Value)
 {
     this.InputChannel = Channel;
     this.AnalogValue  = Value;
 }
示例#11
0
        /// <summary>
        /// Perform the blind-search.
        /// </summary>
        /// <param name="HorizontalArgs">The arguments of the horizontal axis.</param>
        /// <param name="VerticalArgs">The arguments of the vertical axis.</param>
        /// <param name="AdcUsed">Note: only one ADC channel can be used to sample.</param>
        /// <param name="ScanResults">Return the intensity-to-position points.</param>
        public void StartBlindSearch(BlindSearchArgs HorizontalArgs, BlindSearchArgs VerticalArgs, ADCChannels AdcUsed, out List <Point3D> ScanResults)
        {
            //! The memory is cleared automatically, you don't have to clear it manually.

            // check argments.
            if (GlobalDefinition.NumberOfSetBits((int)AdcUsed) != 1)
            {
                throw new ArgumentException($"specify ONLY one channel of the ADC to capture the analog signal.");
            }

            if (HorizontalArgs.Gap < HorizontalArgs.Interval)
            {
                throw new ArgumentException($"the trigger interval of {HorizontalArgs.Unit} shoud be less than the value of the gap.");
            }

            if (VerticalArgs.Gap < VerticalArgs.Interval)
            {
                throw new ArgumentException($"the trigger interval of {VerticalArgs.Unit} shoud be less than the value of the gap.");
            }

            ScanResults = new List <Point3D>();

            ConfigADCTrigger(AdcUsed);

            lock (lockController)
            {
                Send(new CommandBlindSearch(HorizontalArgs, VerticalArgs));
            }

            var err = WaitBySystemState(200, 120000);

            if (err.Error != Errors.ERR_NONE)
            {
                throw new SystemErrorException(err);
            }
            else
            {
                //var values = new List<double>(new double[100000]);
                // read the sampling points from the memory.
                var adcValues = ReadMemoryAll();

                int             indexOfAdcValues = 0;
                int             cycle = 0;
                double          x = 0, y = 0;
                BlindSearchArgs activeParam   = null;
                int             moveDirection = 1;

                // rebuild the relationship between the position and the intensity.
                while (true)
                {
                    var seq = cycle % 4;

                    switch (seq)
                    {
                    case 0:         // move horizontal axis (x) to positive direction (right)
                        activeParam   = HorizontalArgs;
                        moveDirection = 1;
                        break;

                    case 1:
                        activeParam   = VerticalArgs;
                        moveDirection = 1;
                        break;

                    case 2:
                        activeParam   = HorizontalArgs;
                        moveDirection = -1;
                        break;

                    case 3:
                        activeParam   = VerticalArgs;
                        moveDirection = -1;
                        break;
                    }

                    var steps = moveDirection * (activeParam.Gap * (cycle / 2 + 1));

                    if (Math.Abs(steps) > activeParam.Range)
                    {
                        break;
                    }

                    // for the horizontal axis.
                    if (activeParam == HorizontalArgs)
                    {
                        var originPos = x;

                        while (true)
                        {
                            if (indexOfAdcValues > (adcValues.Count - 1))
                            {
                                ScanResults.Add(new Point3D(x, y, 0));
                            }
                            else
                            {
                                ScanResults.Add(new Point3D(x, y, adcValues[indexOfAdcValues++]));
                            }

                            x += moveDirection * activeParam.Interval;

                            if (Math.Abs(x - originPos) >= Math.Abs(steps))
                            {
                                x = originPos + steps;
                                break;
                            }
                        }
                    }
                    else if (activeParam == VerticalArgs)
                    {
                        var originPos = y;

                        while (true)
                        {
                            if (indexOfAdcValues > (adcValues.Count - 1))
                            {
                                ScanResults.Add(new Point3D(x, y, 0));
                            }
                            else
                            {
                                ScanResults.Add(new Point3D(x, y, adcValues[indexOfAdcValues++]));
                            }

                            y += moveDirection * activeParam.Interval;

                            if (Math.Abs(y - originPos) >= Math.Abs(steps))
                            {
                                y = originPos + steps;
                                break;
                            }
                        }
                    }

                    cycle++;
                }

                // output debug data.
                StringBuilder sb = new StringBuilder();
                foreach (var point in ScanResults)
                {
                    sb.Append($"{point.X}\t{point.Y}\t{point.Z}\r\n");
                }

                if (ScanResults.Count > adcValues.Count)
                {
                    throw new ADCSamplingPointMissException(ScanResults.Count, adcValues.Count);
                }
            }
        }
示例#12
0
        /// <summary>
        /// Perform the fast-1D alignment.
        /// </summary>
        /// <param name="Unit"></param>
        /// <param name="Range"></param>
        /// <param name="Interval"></param>
        /// <param name="Speed"></param>
        /// <param name="AnalogCapture"></param>
        /// <param name="ScanResults"></param>
        public void StartFast1D(UnitID Unit, int Range, ushort Interval, byte Speed, ADCChannels AnalogCapture, out List <Point2D> ScanResults, ADCChannels AnalogCapture2, out List <Point2D> ScanResults2)
        {
            if (GlobalDefinition.NumberOfSetBits((int)AnalogCapture) != 1)
            {
                throw new ArgumentException($"specify ONLY one channel allowed for the analog capture.");
            }

            if (GlobalDefinition.NumberOfSetBits((int)AnalogCapture2) > 1)
            {
                throw new ArgumentException($"specify ONLY one channel allowed for the analog capture 2, or disable it.");
            }

            ScanResults = new List <Point2D>();

            ScanResults2 = null;
            if (AnalogCapture2 != 0)
            {
                ScanResults2 = new List <Point2D>();
            }


            ConfigADCTrigger(AnalogCapture | AnalogCapture2);

            ClearMemory();

            MoveTriggerADC(Unit, Range, Speed, Interval);

            // read sampling points from the memory.
            var adcValues = ReadMemoryAll();

            int x = 0;
            int indexOfAdcValues = 0;

            while (true)
            {
                if (indexOfAdcValues > (adcValues.Count - 1))
                {
                    ScanResults.Add(new Point2D(x, 0));
                }
                else
                {
                    ScanResults.Add(new Point2D(x, adcValues[indexOfAdcValues++]));
                }

                if (AnalogCapture2 != 0)
                {
                    if (indexOfAdcValues > (adcValues.Count - 1))
                    {
                        ScanResults2.Add(new Point2D(x, 0));
                    }
                    else
                    {
                        ScanResults2.Add(new Point2D(x, adcValues[indexOfAdcValues++]));
                    }
                }

                x += Interval;

                if (Math.Abs(x) >= Math.Abs(Range))
                {
                    break;
                }
            }

            // ran too fast, some ADC value missed.
            if (ScanResults.Count * Interval < Range)
            {
                throw new ADCSamplingPointMissException((int)Math.Ceiling((decimal)Range / Interval), ScanResults.Count);
            }
        }
示例#13
0
        public void StartFast1D(UnitID Unit, int Range, ushort Interval, byte Speed, ADCChannels AnalogCapture, out List <Point2D> ScanResults)
        {
            List <Point2D> fakeList = null;

            StartFast1D(Unit, Range, Interval, Speed, AnalogCapture, out ScanResults, 0, out fakeList);
        }
示例#14
0
 public CommandReadADC(ADCChannels ChannelEnabled)
 {
     this.ChannelEnabled = ChannelEnabled;
 }
示例#15
0
 /// <summary>
 /// Perform the fast-1D alignment with one analog capture channel activated.
 /// </summary>
 /// <param name="unit"></param>
 /// <param name="range"></param>
 /// <param name="interval"></param>
 /// <param name="speed"></param>
 /// <param name="analogCapture"></param>
 /// <param name="scanResults"></param>
 public void StartFast1D(UnitID unit, int range, ushort interval, byte speed, ADCChannels analogCapture, out List <Point2D> scanResults)
 {
     StartFast1D(unit, range, interval, speed, analogCapture, out scanResults, 0, out _);
 }
示例#16
0
 /// <summary>
 /// Read the analog input value in mV.
 /// <para>NOTE AN1 and AN2 are used to connect to the contact sensors.</para>
 /// <para>AN3 and AN4 used to the internal PowerMeters.</para>
 /// </summary>
 /// <returns></returns>
 public double[] ReadAN(ADCChannels Ch)
 {
     return(_m12.ReadADC(Ch));
 }
示例#17
0
        /// <summary>
        /// Perform the fast-1D alignment with two analog capture channel activated.
        /// </summary>
        /// <param name="unit"></param>
        /// <param name="range"></param>
        /// <param name="interval"></param>
        /// <param name="speed"></param>
        /// <param name="analogCapture"></param>
        /// <param name="scanResults"></param>
        /// <param name="analogCapture2"></param>
        /// <param name="scanResults2"></param>
        public void StartFast1D(UnitID unit, int range, ushort interval, byte speed, ADCChannels analogCapture,
                                out List <Point2D> scanResults, ADCChannels analogCapture2, out List <Point2D> scanResults2)
        {
            if (GlobalDefinition.NumberOfSetBits((int)analogCapture) != 1)
            {
                throw new ArgumentException("only 1 analog capture channel can be activated.", nameof(analogCapture));
            }

            if ((analogCapture2 != 0) && GlobalDefinition.NumberOfSetBits((int)analogCapture2) != 1)
            {
                throw new ArgumentException("only 1 analog capture channel can be activated.", nameof(analogCapture2));
            }

            var dir = range < 0 ? -1 : 1;

            scanResults = new List <Point2D>();

            scanResults2 = null;
            if (analogCapture2 != 0)
            {
                scanResults2 = new List <Point2D>();
            }

            ConfigAdcTrigger(analogCapture | analogCapture2);

            ClearMemory();

            MoveTriggerAdc(unit, range, speed, interval);

            // read sampling points from the memory.
            var adcValues = ReadMemoryAll().ToList();

            var x = 0;
            var indexOfAdcValues = 0;

            while (true)
            {
                scanResults.Add(indexOfAdcValues > (adcValues.Count - 1)
                    ? new Point2D(x, 0)
                    : new Point2D(x, adcValues[indexOfAdcValues++]));

                if (analogCapture2 != 0)
                {
                    scanResults2?.Add(indexOfAdcValues > (adcValues.Count - 1)
                        ? new Point2D(x, 0)
                        : new Point2D(x, adcValues[indexOfAdcValues++]));
                }

                x += (dir * interval);

                if (Math.Abs(x) >= Math.Abs(range))
                {
                    break;
                }
            }

            #region Convert negative coordinates to positive coordinates.

            var minPos = scanResults.Min(p => p.X);
            foreach (var p in scanResults)
            {
                p.X -= minPos;
            }

            if (analogCapture2 != 0 && scanResults2 != null)
            {
                minPos = scanResults2.Min(p => p.X);
                foreach (var p in scanResults2)
                {
                    p.X -= minPos;
                }
            }

            #endregion

            // ran too fast, some ADC value missed.
            var pointsDesired = Math.Abs((int)Math.Ceiling((double)range / interval));
            if (pointsDesired != scanResults.Count)
            {
                throw new ADCSamplingPointMissException(pointsDesired, scanResults.Count);
            }
        }
示例#18
0
 /// <summary>
 /// Call the registered actions to set the analog input value to the corresponding devices.
 /// </summary>
 /// <param name="Channel"></param>
 /// <param name="Voltage"></param>
 public void UpdateAnalogValue(ADCChannels Channel, double Voltage)
 {
     OnAnalogInputValueUpdated?.Invoke(this, new M12AnalogInputUpdatedArgs(Channel, Voltage));
 }
示例#19
0
 public CommandConfigADCTrigger(ADCChannels ChannelEnabled)
 {
     this.ChannelEnabled = ChannelEnabled;
 }
 public bool ReadAD(ADCChannels ChannelFlags, out double[] values)
 {
     values = _controller.ReadADC(ChannelFlags);
     return(true);
 }