# Synchronized motion of a fixture with individual position offsets and custom feedback force limiting

I am working on a project with two fixtures, one that rotates, driven by an electric motor, and one non-rotary fixture that is position controlled by 2 radial/lift cylinders (below fixture head) and 3 axial cylinders that push the fixture toward the rotary fixture. Before the hydraulic supply is turned off, the position controlled fixture is backed away from the rotary fixture and lowered onto a support stand.

When test specimens are swapped, the fixture is moved close to final position from a retracted position, then a feeler gauge is used to check for parallel between the two fixtures, and dial indicators are used to check radial alignment. During this procedure, larger axial and radial moves are synchronized, but fine positioning is done with small offsets in position command per cylinder. The cylinder positions are then stored in variables (as a home/zero position). After the home/zero position is determined, the cylinders will move in equal displacement movements to keep the two fixtures parallel as they move axially.

Other setup procedures use a targeted face load on the test specimen, which is calculated from test specimen diameter, and the sum of the 3 axial force sensors. The fixture is moved into (parallel to rotating fixture) position until the calculated face load is achieved, then that position is held for a period of time, during which the face load decreases. Then the fixtures are moved closer yet again until the initial face load is re-achieved, and that position is held for a period of time. Would it be as simple as issuing new position commands (target pos = actual pos) when the calculated face load reaches/exceeds setpoint?

Since the system will not operate in a force controlled mode, or use force control on individual cylinders, it would seem that I could create a position only loop per cylinder and use the load cells as reference inputs, correct? How would I best go about issuing coordinated distance movements (move 1mm on all 3 axial cylinders), but with different individual position targets?

You could issue a new position command ( command pos = current target position) when the calculated face load reaches/exceeds the setpoint. With this method, your force will overshoot some as the position will overshoot when the axis decelerates and returns to the position at which the command was sent. This is the simplest approach. If you need better control, you could use cascaded loop control which works well for situations like this.

Correct. As you stated, you could use the load cells as reference inputs.

You have a couple options:

1. Create a virtual axis and gear all 3 axial cylinders to the virtual axis. Then send your distance movements to the virtual axis.
2. Send Move Absolute commands and do the math to figure out what position to send to each axis. As long as each axis is moving the same amount, this should work.
3. Send Move Relative commands to each axis.

I forgot to mention that all 3 axial cylinders are the same length and should move the same distance during coordinated fixture movements (not the alignment sequence).

With a virtual axis, how would the individual cylinder alignment position offsets be handled? What kind of gearing command would be used in that scenario?

To use a virtual axis, I would do this:

1. Create a virtual axis.
2. Move all cylinders to the home/zero position.
3. Issue the Gear Pos (Clutch by Time) (30) Command to the slave axis with these parameters:
• Numerator: 1
• Denominator: 1
• Master Register: Target Position of the Virtual Axis
• Clutch Time: 0 (Make sure all axes are stationary when issuing the command)
4. Send move commands to the virtual axis. All three slave axis will move geared to the master, and if the master moves, they will move a corresponding amount.

The offsets would be handled in step 2, when all the cylinders are moved to the home/zero position prior to sending the Gear Pos (Clutch by Time) Command.

Thanks for the information.

There is another mode of operation for this machine that I forgot to mention where 5 axis field position data will be used to create dynamic movement on all 5 cylinders independently, so I’m leaning towards going with individual position only control loops and use individual position commands to keep the programming simpler / more flexible.