Adaptive Control
Adaptive_database.doc
ASC
ASC Problem Solver
DCS-2000 User Guide Adaptive Control
注:仅引用,未详细整理Online_adaptivev010001.doc;Adaptive_database.doc
We also have a paper on MTS Online Iteration and Adaptive Inverse Control: AIC-OLI-1.jpg AIC-OLI-2.jpg AIC-OLI-3.jpg AIC-OLI-4.jpg
The following is an e-mail written by Vince.
Below are the four MTS “Adaptive” products listed in all their documentation and, in blue, are our equivalent products and some comments.
Peak Valley Control (PVC) adapts to achieve and maintain desired peaks and valleys (including mean) for any constant amplitude periodic waveform.
Servotest equivalent: Compressor (soon to be renamed something like “Adaptive Periodic Control” or there may be a case for calling it exactly the same as MTS ie PVC to help with compliance statements and convince customers that our version is exactly the same as MTS’s)
Compressors are currently limited to periodic commands coming from Signal Generators but it would be a simple task to extend it to shaped sine sweeps played by Replay (the zero-crossing signals could be an extra channel in the file or determined in the DSP).
Peak Valley Phase (PVP) Control adapts for phase as well amplitude and made for multichannel cyclic tests
Servotest equivalent: Adaptive Sine Control (ASC) which could be renamed Adaptive Matrix Control to re-emphasize its multi-input-multi-output capabilities, or renamed PVP (?)
Adaptive Inverse Control (AIC) can be applied to any waveform, including random profiles or RPC time history files in linear systems.
The nearest we have to this is the “Online Adaptive” system Matt and I did for the DCS. Attached is the manual for this. Please treat as an internal document only; this manual presents all the facts on adaptive control, including the many limitations. In the Pulsar version I intend to be more economical with the truth!
Adaptive Database Setup Procedure
In the Servotst\Database directory add the following files and sub-directory:
• \Adaptcfg sub-directory containing at least one *.lst file and some *.cfg files.
• Adaptive.dbf
• Ringbuf.dbf
• SSModel.dbf
• The .inp file that defines the state space model inputs and dimensions.
In the .inp file (eg, disp.inp), ensure the feedback signal has the right object name (as in sigcnd.dbf) and the right sinal name (as in signal.dbf). Eg,
2 3 6
Delayed Command,Delayed Command
Displacement 1,Displacement 1
In SSModel.dbf, ensure INPUT_FILE is correct.
OBNAME MAX_INPUTS MAXOUTPUTS MAX_STATES INPUT_FILE COEF_FILE
SS Model 2 3 6 DISP 200_080
Ensure the file specified in COEF_FILE (eg, 200_080.ssm) is present in the database directory.
In Signal.dbf, take note of the Command signal name:
SGNAME OBNAME SGIDX
Displ Command 1 Displ Control 1 0.00000
In Signal.dbf, add the following entries:
SGNAME OBNAME SGIDX
Adaptive Output Adaptive 0.00000
Ky1 Adaptive 1.00000
Ky2 Adaptive 2.00000
Kr Adaptive 3.00000
Adaptive Error Adaptive 4.00000
y1 Adaptive 5.00000
y2 Adaptive 6.00000
Command Adaptive 7.00000
Emcs_output Adaptive 13.00000
Delayed Command Delayed Command 0.00000
SS Model OP1 SS Model 0.00000
SS Model OP2 SS Model 1.00000
SS Model OP3 SS Model 2.00000
In Adaptive.dbf, check that the following entries are correct:
OBNAME CMD_OBNAME CMD_SGNAME DISPLFB_OB DISPLFB_SG
Adaptive Displ Control 1 Displ Command 1 Displacement 1 Displacement 1
FILENAME CONFIGLIST
Default MCS1
and that Default.cfg and MCS1.lst are in the \Database\Adaptcfg directory.
In Srvctl.dbf, update the following entries:
CMD_OBNAME CMD_SGNAME FB_OBNAME FB_SGNAME
Displacement 1 Displacement 1
FB_SCALE VFF_OBNAME VFF_SGNAME VFF_SCALE
1 Adaptive Adaptive Output 1
Update the following entries in Ringbuf.dbf:
OBNAME IP_OBNAME IP_SGNAME
Delayed Command Displ Control 1 Displ Command 1
In group.dbf, add the following entries:
GPNAME OBNAME
Adaptive Adaptive
Model SS Model
(DCS2000相关,暂未整理)
I think we should plan to incorporate a simpler version of this adaptive controller in Pulsar where all the parameters are hidden in the Advanced View and the user only sees an “Adaptive ON/OFF” button on the ServoController? window. When it is switched On it will actually do very little, but the Advanced View parameters can be edited by Servotest engineers to perform very convincing demos.
Arbitrary end Level Control (ALC) can adapt for linear or non-linear specimens with periodic or random waveforms.
We could market our “Online Adaptive” system to be applicable to both linear and non-linear systems.
ASC aka Adaptive Sine Control.
ASC will usually be required on MASTs even if it will only be used to pass the acceptance tests.
I tried downloading the database after every step. Tedious but could save time in the long run!
1.Create a ASC signal generator. Note, it is hidden, you do not use it with the normal signal generator UI. Example:
<SignalGenerator Name="ASC Signal Generator">
<RunPosition>0</RunPosition>
<TripAction>SoftStop</TripAction>
<ShutAction>SoftStop</ShutAction>
<Frequency>1</Frequency>
<Waveform>Sine</Waveform>
<Continuous>true</Continuous>
<Cycles>1</Cycles>
<InitialPhaseAngle>0</InitialPhaseAngle>
<StartHardness>Soft</StartHardness>
<StopHardness>Soft</StopHardness>
<Period>1</Period>
<SweepDirection>Up</SweepDirection>
<SweepType>NoSweep</SweepType>
<SweepMode>Single</SweepMode>
<LogarithmicRate>0.1</LogarithmicRate>
<LinearRate>0.1</LinearRate>
<LowerLimit>0.1</LowerLimit>
<UpperLimit>1</UpperLimit>
<Hidden>true</Hidden>
</SignalGenerator>
2.Create sin, cos and zero crossing signals for siggen. Note, we don’t use the normal output. Example:
<Signal Name="ASC Zero Crossing">
<ObjectName>ASC Signal Generator</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="ASC Reference Cos">
<ObjectName>ASC Signal Generator</ObjectName>
<OutputPinName>3</OutputPinName>
</Signal>
<Signal Name="ASC Reference Sin">
<ObjectName>ASC Signal Generator</ObjectName>
<OutputPinName>4</OutputPinName>
</Signal>
3.Create divide zero crossing gate:
<DivZeroXs>
<DivZeroX Name="ASC Zero Crossing Gate">
<RunPosition>0</RunPosition>
<ZeroCrossingSignalName>ASC Zero Crossing</ZeroCrossingSignalName>
<InhibitTicks>10</InhibitTicks>
</DivZeroX>
</DivZeroXs>
4.Create signals for gate:
<Signal Name="ASC Gate">
<ObjectName>ASC Zero Crossing Gate</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="ASC N Ticks">
<ObjectName>ASC Zero Crossing Gate</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
5.Create DFT filter for each axis. Note, Zero, I done this so the database will download now, we’ll change it later! Example:
<DiscreteFourierTransforms>
<DiscreteFourierTransform Name="DFT Filter X">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration X</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
<DiscreteFourierTransform Name="DFT Filter Y">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration Y</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
<DiscreteFourierTransform Name="DFT Filter Z">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration Z</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
<DiscreteFourierTransform Name="DFT Filter Roll">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration Roll</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
<DiscreteFourierTransform Name="DFT Filter Pitch">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration Pitch</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
<DiscreteFourierTransform Name="DFT Filter Yaw">
<RunPosition>0</RunPosition>
<FeedbackSignalName>Acceleration Yaw</FeedbackSignalName>
<SinSignalName>ASC Reference Sin</SinSignalName>
<CosSignalName>ASC Reference Cos</CosSignalName>
<InverseTicksSignalName>Zero</InverseTicksSignalName>
<TriggerSignalName>ASC Gate</TriggerSignalName>
<TriggerMask>0x00000800</TriggerMask>
<Ticks>16</Ticks>
</DiscreteFourierTransform>
</DiscreteFourierTransforms>
6.Create DFT output signals. Note, there are some other outputs from the DFT but I guess we’ll have to add them when it doesn’t work! Example:
<Signal Name="Command X">
<ObjectName>DFT Filter X</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental X">
<ObjectName>DFT Filter X</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="Command Y">
<ObjectName>DFT Filter Y</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental Y">
<ObjectName>DFT Filter Y</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="Command Z">
<ObjectName>DFT Filter Z</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental Z">
<ObjectName>DFT Filter Z</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="Command Roll">
<ObjectName>DFT Filter Roll</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental Roll">
<ObjectName>DFT Filter Roll</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="Command Pitch">
<ObjectName>DFT Filter Pitch</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental Pitch">
<ObjectName>DFT Filter Pitch</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
<Signal Name="Command Yaw">
<ObjectName>DFT Filter Yaw</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
<Signal Name="Fundamental Yaw">
<ObjectName>DFT Filter Yaw</ObjectName>
<OutputPinName>1</OutputPinName>
</Signal>
7.Create reference amplitude internal conditioner:
<InternalConditioner Name="Reference Amplitude">
<RunPosition>0</RunPosition>
<Scale>1</Scale>
<Units>DSPu</Units>
<Offset>0</Offset>
<XTerm>1</XTerm>
<X2Term>0</X2Term>
<X3Term>0</X3Term>
<X4Term>0</X4Term>
<X5Term>0</X5Term>
<Zero>0</Zero>
<InputSignalName>ASC Reference Sin</InputSignalName>
<ZeroCrossingSignalName>ASC Gate</ZeroCrossingSignalName>
</InternalConditioner>
8.Create reference amplitude signals:
<Signal Name="+Q Peak Amplitude">
<ObjectName>Reference Amplitude</ObjectName>
<OutputPinName>5</OutputPinName>
</Signal>
9.Create router to square the reference amplitude:
<Router Name="Reference Amplitude Squarer">
<RunPosition>0</RunPosition>
<Input1SignalName>+Q Peak Amplitude</Input1SignalName>
<Input2SignalName>+Q Peak Amplitude</Input2SignalName>
<Input1Scale>0</Input1Scale>
<Input2Scale>0</Input2Scale>
<ProductScale>1</ProductScale>
<ScaleAndUnitsSource>Neither</ScaleAndUnitsSource>
</Router>
10.Signal to go with router:
<Signal Name="Ref Ampl Squared">
<ObjectName>Reference Amplitude Squarer</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
11.Next router (I’ve just noticed something that could be wrong in my example database. The running order of the 2 routers must be important but it is not specified. In Pulsar RunPosition can be used to dictate running order but obviously it’s not set in the 2 routers. Make sure Reference Amplitude Correction comes after in the database and we’ll look into the run position later if nec.):
<Router Name="Reference Amplitude Correction">
<RunPosition>0</RunPosition>
<Input1SignalName>ASC N Ticks</Input1SignalName>
<Input2SignalName>Ref Ampl Squared</Input2SignalName>
<Input1Scale>0</Input1Scale>
<Input2Scale>0</Input2Scale>
<ProductScale>1</ProductScale>
<ScaleAndUnitsSource>Neither</ScaleAndUnitsSource>
</Router>
12.Add signal for router:
<Signal Name="Scale Correction">
<ObjectName>Reference Amplitude Correction</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
13.Create Inverse Count:
<SignalsArithmetic>
<SignalArithmetic Name="Inverse Count">
<RunPosition>0</RunPosition>
<Input1SignalName>Scale Correction</Input1SignalName>
<Input2SignalName>Zero</Input2SignalName>
<Function>Reciprocal</Function>
</SignalArithmetic>
</SignalsArithmetic>
14.Create signal for inverse count:
<Signal Name="1 / N Ticks">
<ObjectName>Inverse Count</ObjectName>
<OutputPinName>0</OutputPinName>
</Signal>
15.In the DFT objects change:
<InverseTicksSignalName>Zero</InverseTicksSignalName>
to
<InverseTicksSignalName>1 / N Ticks</InverseTicksSignalName>
16.Finally (for the database) add the ASC object:
<AdaptiveSineControls>
<AdaptiveSineControl Name="ASC">
<SignalGeneratorName>ASC Signal Generator</SignalGeneratorName>
<Amplitude>1</Amplitude>
<InitialAdjustmentThreshold>0.5</InitialAdjustmentThreshold>
<ReachedThresholdMultiplier>1</ReachedThresholdMultiplier>
<ExcludedAxisThresholdMultiplier>1</ExcludedAxisThresholdMultiplier>
<PrimaryAxisAdaptationRate>0.1</PrimaryAxisAdaptationRate>
<CrossCoupledAdaptationRate>0.1</CrossCoupledAdaptationRate>
<PrimaryAxisName>X</PrimaryAxisName>
<RampTime>10</RampTime>
<Axis Name="X">
<DiscreteFourierTransformName>DFT Filter X</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration X</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
<Axis Name="Y">
<DiscreteFourierTransformName>DFT Filter Y</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration Y</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
<Axis Name="Z">
<DiscreteFourierTransformName>DFT Filter Z</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration Z</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
<Axis Name="Roll">
<DiscreteFourierTransformName>DFT Filter Roll</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration Roll</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
<Axis Name="Pitch">
<DiscreteFourierTransformName>DFT Filter Pitch</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration Pitch</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
<Axis Name="Yaw">
<DiscreteFourierTransformName>DFT Filter Yaw</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration Yaw</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
</AdaptiveSineControl>
</AdaptiveSineControls>
17.Connect the ASC command signals to an input (I would suggest input 3) of the corresponding servocontroller. The ASC command signals are Command X, etc. Note the difference between Command X and Command IP X which a different signal that you find in many MAST databases. To use ASC you have to ensure that this input is at 100%.
Acceleration will usually be the preferred mode for ASC operation. In some cases acceleration may not be available in all axis so displacement or velocity will have to be used instead.
For testing purposes it may be safer to start in displacement at low frequencies. At low frequencies there shouldn’t be very much cross-coupling and therefore ASC shouldn’t have to do very much; hopefully you will just get the single-axis sinusoidal motion straight away.
The modes are setup in the AdaptiveSineControl? objects in the rdbml (and sdbml if it exists).
You should see the 6 axis configurations like:
<Axis Name="X">
<DiscreteFourierTransformName>DFT Filter X</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Acceleration">
<SignalName>Acceleration X</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
To add another mode so that it becomes:
<Axis Name="X">
<DiscreteFourierTransformName>DFT Filter X</DiscreteFourierTransformName>
<SelectedModeLabel>Acceleration</SelectedModeLabel>
<Mode Label="Displacement">
<SignalName>Displacement X</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Displacement</Type>
</Mode>
<Mode Label="Acceleration">
<SignalName>Acceleration X</SignalName>
<UnitsScaleFactor>1</UnitsScaleFactor>
<Type>Acceleration</Type>
</Mode>
</Axis>
Add similar to each of the other axis.
You then select the mode from the ASC properties panel. You want all the axis in the same mode where possible.
If ASC is open loop doesn’t appear to be doing anything log the fundamental signals coming out of the DFT. If these signals are zero it indicates
Feedbacks are actually zero
The feedbacks have not be connected correctly
DFT are not interating, could be the gate signal is not connected or the inverse ticks