Hi all,
I have a tricky controls task to implement that I could use some input on.
I have a system using a trap-screw linear actuator that applies a load on a shaft through a spring setup. Actuator travel / force range is 750lbf / in. I want to get as much resolution as possible within that 0-750lbf range, ideally +/-5lbf (unlikely) but +/- 10 will suffice. Max actuator speed is 0.58in / sec. A load cell provides feedback to the PLC. Actuator is AC and controlled using zero-crossing SSRs. PLC worst-case cycle time is 13ms. Operator sets the load on the HMI and the actuator should go to set load within the tolerance.
I tried implementing this by going full-on on the SSRs and switching off when the actuator is within tolerance. The actuator overshoots then reverses, and hunts for the position indefinitely, even with tolerance ranges as wide as +/-25lbf.
It turns out that due to the initial acceleration of the actuator, the load cell reading massively overshoots in both directions by up to 60lbf. By switching the SSRs on a timer for a 30ms pulse, I’m able to get force increments of about 10-15lbf per “on-Step” at the lower end of the force range, and 3-5lbf at the mid-upper range. I still get about 5lbf overshoot initially, which settles after a few seconds. I turned off filtering on the PLC analog input.
So it seems that some type of PWM is the way I’m going to need to go here. In the ideal scenario, I’m envisioning some type of control (PID perhaps?) where the on-duration at each cycle step is controlled by the force error and the motion is smooth; however, as mentioned, the sensor value overshoots significantly. To simplify things, however, I could implement and test different constant pulse durations (duty cycles) and take whatever gets me closest.
Curious if anyone would be willing to share advice / suggestions on how they would solve this. Not sure what the best way is to determine the on-off durations, or if there’s an entirely different method that might work better.
PLC is a Siemens S7-1200 if it makes any difference.
Thanks!
I have a tricky controls task to implement that I could use some input on.
I have a system using a trap-screw linear actuator that applies a load on a shaft through a spring setup. Actuator travel / force range is 750lbf / in. I want to get as much resolution as possible within that 0-750lbf range, ideally +/-5lbf (unlikely) but +/- 10 will suffice. Max actuator speed is 0.58in / sec. A load cell provides feedback to the PLC. Actuator is AC and controlled using zero-crossing SSRs. PLC worst-case cycle time is 13ms. Operator sets the load on the HMI and the actuator should go to set load within the tolerance.
I tried implementing this by going full-on on the SSRs and switching off when the actuator is within tolerance. The actuator overshoots then reverses, and hunts for the position indefinitely, even with tolerance ranges as wide as +/-25lbf.
It turns out that due to the initial acceleration of the actuator, the load cell reading massively overshoots in both directions by up to 60lbf. By switching the SSRs on a timer for a 30ms pulse, I’m able to get force increments of about 10-15lbf per “on-Step” at the lower end of the force range, and 3-5lbf at the mid-upper range. I still get about 5lbf overshoot initially, which settles after a few seconds. I turned off filtering on the PLC analog input.
So it seems that some type of PWM is the way I’m going to need to go here. In the ideal scenario, I’m envisioning some type of control (PID perhaps?) where the on-duration at each cycle step is controlled by the force error and the motion is smooth; however, as mentioned, the sensor value overshoots significantly. To simplify things, however, I could implement and test different constant pulse durations (duty cycles) and take whatever gets me closest.
Curious if anyone would be willing to share advice / suggestions on how they would solve this. Not sure what the best way is to determine the on-off durations, or if there’s an entirely different method that might work better.
PLC is a Siemens S7-1200 if it makes any difference.
Thanks!