OMRON Forums

# Open motor servo loop in motion program

## Recommended Posts

Our servo motors run in an observatory environment that is sensitive to heat. As such we would like to turn the motors off once they have been moved into position. Our approach to this is to outfit each motor with a brake, and once a move is complete open the servo loop and engage the brake. The problem we are running into is that we run these motors through a series of moves for hours using a motion program, primarily for the coordinate system timing features (i.e. external time base). Since motion programs require the servo loop to be closed, it seems we cannot open the servo loop after each move. Do you have any suggestions for how to solve this problem?

• Replies 7
• Created

#### Popular Days

Our servo motors run in an observatory environment that is sensitive to heat. As such we would like to turn the motors off once they have been moved into position. Our approach to this is to outfit each motor with a brake, and once a move is complete open the servo loop and engage the brake. The problem we are running into is that we run these motors through a series of moves for hours using a motion program, primarily for the coordinate system timing features (i.e. external time base). Since motion programs require the servo loop to be closed, it seems we cannot open the servo loop after each move. Do you have any suggestions for how to solve this problem?
##### Share on other sites

If your moves are simple enough (i.e. just point-to-point), you could restructure your approach and use PLCs with "jog" moves and just issue "kill" after each move has finished. There is no open/closed loop restriction in PLCs. To check that a jog move has finished, you can poll Motor[x].InPos until it becomes 1. If you're doing a home move, you need to also check for Motor[x].HomeComplete=1. Also note that Motor[x].InPosBand is 0 by default so you might want to widen it up a bit (e.g. Motor[x].InPosBand = 0.5).

For example:

open plc 2

jog1=2000; // jog motor 1 to 2000

while(Motor[1].InPos==0){} // wait for move to finish

kill 1; // Remove power from motor 1

disable plc 2

close

If your moves are more complex, you could maybe set a variable for each line of the program, and run the program repeatedly, but with a goto statement in the top that reads the line number where you broke out, and just jump down to that line when you reenable the program. This is an ugly approach though and I don't recommend it.

##### Share on other sites

If your moves are simple enough (i.e. just point-to-point), you could restructure your approach and use PLCs with "jog" moves and just issue "kill" after each move has finished. There is no open/closed loop restriction in PLCs. To check that a jog move has finished, you can poll Motor[x].InPos until it becomes 1. If you're doing a home move, you need to also check for Motor[x].HomeComplete=1. Also note that Motor[x].InPosBand is 0 by default so you might want to widen it up a bit (e.g. Motor[x].InPosBand = 0.5).

For example:

open plc 2

jog1=2000; // jog motor 1 to 2000

while(Motor[1].InPos==0){} // wait for move to finish

kill 1; // Remove power from motor 1

disable plc 2

close

If your moves are more complex, you could maybe set a variable for each line of the program, and run the program repeatedly, but with a goto statement in the top that reads the line number where you broke out, and just jump down to that line when you reenable the program. This is an ugly approach though and I don't recommend it.

##### Share on other sites

Our servo motors run in an observatory environment that is sensitive to heat. As such we would like to turn the motors off once they have been moved into position. Our approach to this is to outfit each motor with a brake, and once a move is complete open the servo loop and engage the brake. The problem we are running into is that we run these motors through a series of moves for hours using a motion program, primarily for the coordinate system timing features (i.e. external time base). Since motion programs require the servo loop to be closed, it seems we cannot open the servo loop after each move. Do you have any suggestions for how to solve this problem?

We use braking on a direct drive rotary axis and our approach is once the axis is in position to set:

Motor[x].MaxInt=0;

Motor[x].MaxDac= (some small value, enough to keep from drifting)

Activate Brake

dwell enough time to engage

Motor[x].MaxDac=0 ;

At this point the motor is still closed loop, but not applying any power to the motor.

This works well with linear drives, but you may still have some heat with a 50% modulated PWM. Delta Tau's new TriLevel PWM could help with this(?).

To reengage drive simply reverse the process, perhaps with a ramp for the MaxInt up in case there has been some drift. Also, I would leave the FatalFeLimit in place to serve as a position loss detector.

##### Share on other sites

Our servo motors run in an observatory environment that is sensitive to heat. As such we would like to turn the motors off once they have been moved into position. Our approach to this is to outfit each motor with a brake, and once a move is complete open the servo loop and engage the brake. The problem we are running into is that we run these motors through a series of moves for hours using a motion program, primarily for the coordinate system timing features (i.e. external time base). Since motion programs require the servo loop to be closed, it seems we cannot open the servo loop after each move. Do you have any suggestions for how to solve this problem?

We use braking on a direct drive rotary axis and our approach is once the axis is in position to set:

Motor[x].MaxInt=0;

Motor[x].MaxDac= (some small value, enough to keep from drifting)

Activate Brake

dwell enough time to engage

Motor[x].MaxDac=0 ;

At this point the motor is still closed loop, but not applying any power to the motor.

This works well with linear drives, but you may still have some heat with a 50% modulated PWM. Delta Tau's new TriLevel PWM could help with this(?).

To reengage drive simply reverse the process, perhaps with a ramp for the MaxInt up in case there has been some drift. Also, I would leave the FatalFeLimit in place to serve as a position loss detector.

##### Share on other sites

I would have suggested the same approach as Jeff did, which technically keeps the loop closed, but effectively disables it.

Note that you cannot use our automatic brake control function for this, as that function operates only on true disabling and enabling of the motor.

Our own "in-phase" PWM amplifiers yield no current ripple in the motor at zero command, and I believe that most 3-phase brushless motor amps are in-phase like this. (Many cheap brush motor and stepper motor drives use the simpler "anti-phase" PWM, which has a lot of current ripple at zero command.)

##### Share on other sites

I would have suggested the same approach as Jeff did, which technically keeps the loop closed, but effectively disables it.

Note that you cannot use our automatic brake control function for this, as that function operates only on true disabling and enabling of the motor.

Our own "in-phase" PWM amplifiers yield no current ripple in the motor at zero command, and I believe that most 3-phase brushless motor amps are in-phase like this. (Many cheap brush motor and stepper motor drives use the simpler "anti-phase" PWM, which has a lot of current ripple at zero command.)

##### Share on other sites

This topic is now closed to further replies.

### Announcements

×
• Forums

• Events
• #### Browse

×
• Create New...