Gain Scheduling

Hi, new to this forum. Also relatively new to motion control systems, just been learning electro-hydraulics over the last 9 months or so.

I’m currently building a hydraulic motion control system with a set of cylinders working in tandem powered by a mobile HPU. The HPU feeds through two proportional servo valves, one for high flow range (i.e. 3 to 140 Lpm) and one for low flow range (0 to 3 Lpm). So far I’ve been able to set up the system on the bench and do some basic loop tuning using the autotune tools in RMCTools. The motion controller/interface program has been very intuitive and easy to use, I’ve been impressed.

My question is whether RMCTools has any built in support for gain scheduling. I’ve looked around a bit and found a “gain set” feature but it doesn’t appear to be aimed at creating scheduled gains for varying production conditions, rather it looks like it is targeted at switching control modes from position to velocity control, position to I-PD control, etc. Is there a built-in facility for doing gain scheduling? Can it be easily programmed using a user program?

My desired application is to create a set of scheduled gain parameters that could automatically update to the controller based on operating conditions. I am developing a soil probe system that will encounter varying resistance based on the geologic profile and I suspect that different tuning may be appropriate for different profiles (i.e. less aggressive in stiff soils, more aggressive in softer soils). I could probably do this manually each time I run the system, but it would be nice to have it preprogrammed so I don’t have to update quite so many things while under operation. Any comments would be appreciated.

Ye don’t yet support automatic gain scheduling. It is on our wish list.

You can easily set gains from a user program by using an expression statement. The simplest thing to do would be to change only the Output Scale parameter (example: _Axis[0].OutputScale := 6.0).

If using a single overall gain is not adequate then you can set all the individual tuning gains in one expression statement.

Each program you run could start with a step that sets the gains for that particular application.

You can change the gains easily using user programs.

In a user program you can write
_Axis[].IntGain := 10.0 * Lambda * Lambda * Lambda * InvGainAlpha;
_Axis[].PropGain := 30.0 * Lambda * Lambda * InvGainAlpha;
_Axis[].DiffGain := 10.0 * MAX(3.0*Lambda -Alpha,0.0) * InvGainAlpha;
_Axis[].VelFFwd := 10.0 / _Axis[].SystemGain;
_Axis[].AccFFwd := 10.0 * InvGainAlpha;
_Axis[].JerkFFwd := 0.0;
or whatever gains you think you need.
Most often all the gains are changed by writing to the output scale. This way only one parameter changes.

You will probably be able to get by with just changing the scale
_Axis[].OutputScale:=10.0; // 10 volt for 100% control output
Remember, if the array index is missing then the default axis is assumed.

So if you were to use the output scale to control the gains for different conditions, would you tune the system using a low or high initial scale? I suppose if you used full scale initially for tuning and then adjusted it downwards, you would effectively be starting at an aggressive setting and becoming less aggressive. Perhaps you could start at half scale to allow yourself room to move up or down?

Does the high flow valve have a closed center position? I would tune the small flow valve for positioning. Then use quick moves for the fast moves. Onces the axis starts moving with the quick move open up the high flow valve. Then when you need to start slowing down close the high flow valve and let the little valve ramp down. With the high flow valve having a closed center it can be taken out of the circuit and all the positioning and tuning is done with the small valve.

I would start with the defaults where the OutputScale is 10 volts per 100%

You can always change the scale to 11 volts per %100 but you will never get about 10 volt on the output. If you need more than 10 volts the system is sized incorrectly.