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:
Create a virtual axis and gear all 3 axial cylinders to the virtual axis. Then send your distance movements to the virtual axis.
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.
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.