コード例 #1
0
        enuFeedbackStatusFlags CheckFeedback(double signal)
        {
            mStatus &= ~enuFeedbackStatusFlags.InRange;
            mStatus &= ~enuFeedbackStatusFlags.AtSetpoint;

            if ((mSensor.Status.HasFlag(enuTChannelStatus.Overload)) ||
                (signal < Settings.MinSafetyLimit) || (signal > Settings.MaxSafetyLimit))
            {
                mStatus |= enuFeedbackStatusFlags.LimitsExceeded;
            }

            double minchange = Math.Abs(BulkSignal * 0.02);  // 2%

            if (((SetPoint >= BulkSignal) && (signal >= (BulkSignal + minchange))) ||
                ((SetPoint < BulkSignal) && (signal <= (BulkSignal - minchange))))
            {
                mStatus |= enuFeedbackStatusFlags.InRange;
            }

            if ((signal >= Settings.MinSetpoint) && (signal <= Settings.MaxSetpoint))
            {
                mStatus |= enuFeedbackStatusFlags.AtSetpoint;
            }

            return(mStatus);
        }
コード例 #2
0
        private enuFeedbackStatusFlags GotoSetpointStep(long millis, bool isPostApproachPhase = false)
        {
            double signal = mSensor.GetAveragedValue();
            enuFeedbackStatusFlags stat = CheckFeedback(signal);
            double mpos = double.NaN;

            if (mPositioner.GetAxisAbsolutePosition(enuAxes.ZAxis, ref mpos) != enuPositionerStatus.Ready)
            {
                return(enuFeedbackStatusFlags.PositionerError);
            }

            OnFBPositionUpdated(new FBPositionUpdatedEventArgs(mpos, signal, isPostApproachPhase, millis / 1000.0));

            if (stat.HasFlag(enuFeedbackStatusFlags.LimitsExceeded))
            {
                log.Add("GotoSetpointStep(): Sensor response exceeded safety limits or sensor overload", "ERROR");
                return(stat);
            }

            if (stat.HasFlag(enuFeedbackStatusFlags.Timeout))
            {
                log.Add("GotoSetpointStep(): Timeout", "ERROR");
                return(enuFeedbackStatusFlags.Timeout);
            }

            if (stat.HasFlag(enuFeedbackStatusFlags.AtSetpoint))
            {
                return(stat);
            }

            Position Correction = new Position();

            Correction.Z = PID.SimpleCorrection(signal);

            if (!mPositioner.SetRelativePosition(Correction).HasFlag(enuPositionerStatus.Ready))
            {
                return(enuFeedbackStatusFlags.Aborted);
            }

            if ((mPositioner.SetRelativePosition(Correction).HasFlag(enuPositionerStatus.LowerLimit)) ||
                (mPositioner.SetRelativePosition(Correction).HasFlag(enuPositionerStatus.UpperLimit)))
            {
                return(enuFeedbackStatusFlags.LimitsExceeded);
            }

            if (mPositioner.GetAxisAbsolutePosition(enuAxes.ZAxis, ref mpos) != enuPositionerStatus.Ready)
            {
                return(enuFeedbackStatusFlags.PositionerError);
            }
            log.AddStatusUpdate(0, mpos);

            return(enuFeedbackStatusFlags.Ready);
        }
コード例 #3
0
 public enuFeedbackStatusFlags Initialize()
 {
     mPositioner = Settings.Positioners[Settings.Positioner];
     if (mPositioner != null)
     {
         if (mPositioner.GetPositionerStatus == enuPositionerStatus.Ready)
         {
             mSensor = Settings.TransducerChannels[Settings.Channel];
             if (mSensor != null)
             {
                 if (mSensor.Status == enuTChannelStatus.OK)
                 {
                     mSensor.Averaging = Settings.Averaging;
                     abortFlag         = false;
                     PID          = new PIDController(log);
                     PID.Settings = Settings.PIDController;
                     if (PID.Error == 0)
                     {
                         mStatus = enuFeedbackStatusFlags.Ready;
                     }
                     else
                     {
                         log.Add("Could not initialize PID controller, check PID controller settings!", "ERROR");
                     }
                 }
                 else
                 {
                     log.Add("Could not initialize sensor, check transudcer settings!", "ERROR");
                 }
             }
             else
             {
                 log.Add("Could not initialize sensor, check feedbackcontroller settings!", "ERROR");
             }
         }
         else
         {
             log.Add("Could not initialize positioner, check positioner settings!", "ERROR");
         }
     }
     else
     {
         log.Add("Could not initialize positioner, check feedback controller settings!", "ERROR");
     }
     return(mStatus);
 }
コード例 #4
0
        public enuFeedbackStatusFlags GoToSetpoint()
        {
            mTiming = enuFeedbackTiming.FBSync;
            if (!AcquireBulksignal().HasFlag(enuFeedbackStatusFlags.Ready))
            {
                log.Add("Error while acquiring bulksignal in GotoSetpoint().", "ERROR");
                mStatus |= enuFeedbackStatusFlags.Aborted;
                return(Status());
            }

            if (BulkSignal == double.NaN)
            {
                log.Add("No bulksignal acquired before call to GotoSetpoint()?", "ERROR");
                mStatus |= enuFeedbackStatusFlags.Aborted;
                return(Status());
            }

            Stopwatch stopwatch = new Stopwatch();

            if (!Status().HasFlag(enuFeedbackStatusFlags.Ready))
            {
                log.Add("FeedbackController is not configured in GotoSetpoint().", "ERROR");
                return(Status());
            }

            if (mTiming != enuFeedbackTiming.FBSync)
            {
                log.Add("GotoSetpoint(): Controller in not in synchronous mode - aborting.");
                mStatus |= enuFeedbackStatusFlags.Aborted;
                return(Status());
            }

            PID.Setpoint = ((Settings.MinSetpoint + Settings.MaxSetpoint) / 2);
            PID.Reset();

            do
            {
                if (abortFlag)
                {
                    mStatus |= enuFeedbackStatusFlags.Aborted;
                    log.Add("GotoSetpoint() was aborted by user");
                    return(Status());
                }
                mStatus = GotoSetpointStep(stopwatch.ElapsedMilliseconds);

                if (stopwatch.ElapsedMilliseconds > Settings.TimeOut)
                {
                    return(enuFeedbackStatusFlags.Timeout);
                }

                if (mStatus.HasFlag(enuFeedbackStatusFlags.LimitsExceeded))
                {
                    return(mStatus);
                }

                System.Threading.Thread.Sleep(Settings.LoopDelay);
            } while (!mStatus.HasFlag(enuFeedbackStatusFlags.AtSetpoint));

            if (Settings.PostAppFBC)
            {
                stopwatch.Restart();
                do
                {
                    if (abortFlag)
                    {
                        mStatus |= enuFeedbackStatusFlags.Aborted;
                        log.Add("Post-approach FB control was aborted by user");
                        return(Status());
                    }
                    mStatus = GotoSetpointStep(stopwatch.ElapsedMilliseconds, true);
                    System.Threading.Thread.Sleep(Settings.SPLoopDelay);
                }while (stopwatch.ElapsedMilliseconds < Settings.PostAppTimeOut);
            }
            return(mStatus);
        }