andyf Posted November 6, 2014 Share Posted November 6, 2014 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? Link to comment Share on other sites More sharing options...
andyf Posted November 6, 2014 Author Share Posted November 6, 2014 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? Link to comment Share on other sites More sharing options...
Omron Forums Support Posted November 6, 2014 Share Posted November 6, 2014 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. Link to comment Share on other sites More sharing options...
Omron Forums Support Posted November 6, 2014 Share Posted November 6, 2014 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. Link to comment Share on other sites More sharing options...
JeffLowe Posted November 7, 2014 Share Posted November 7, 2014 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. Link to comment Share on other sites More sharing options...
JeffLowe Posted November 7, 2014 Share Posted November 7, 2014 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. Link to comment Share on other sites More sharing options...
curtwilson Posted November 7, 2014 Share Posted November 7, 2014 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.) Link to comment Share on other sites More sharing options...
curtwilson Posted November 7, 2014 Share Posted November 7, 2014 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.) Link to comment Share on other sites More sharing options...
Recommended Posts