E N D
1. Aerotech A3200 high precision rotation stage Windows based Epics IOC driver implementation
2. Marcel Grunder
3. Marcel Grunder Aerotech SMC controller Motion control system and programming environment
Runs on a standard Windows PC
Maximum of 32 intelligent drives connected via IEEE 1394
20 kHz servo update rate for all axes
Integrated high-speed Position Synchronized Output (PSO) for position latching.
Utility Programs to configure, troubleshoot, and operate the controller
Programming languages include Aerotech’s own AEROBasic or RS274 G-code, C, C++, VisualBasic®, Delphi and Labview
4. Marcel Grunder At a beamline
5. Marcel Grunder Epics driver requirements Fast signal indicating movement done.
A3200 PSO feature used to open/close fast beam shutter
Safe homing sequence for multiple axes stages
Measurement mode
Define start + oscillation angle and oscillation time
Use calc records go generate movement start + stop pos, shutter open + close pos and velocity.
Direct mode
Absolute or incremental move of axis (axes) at defined speed
6. Marcel Grunder Software environment Runs on Windows XP
epics base 3.14.8
autosave and restore 4-2-1
storing offset and velocities
state notation language (SNL) 2.0.1
homing sequence
A3200 v.2.19
7. Marcel Grunder A3200 Software Architecture Layer 4: Windows Apps
Layer 3: Programming Interface
Layer 2: Nmotion SMC engine
Layer 1: Drive Firmware
8. Marcel Grunder A3200 programming models Library Programming Model
Simplest programming model used to initialize controller, to get controller and motor status info…
CNC Programming Model (G code)
compiled and loaded as binary code, directly into the Nmotion SMC controller.
Runs in RTX real time environment
9. Marcel Grunder A3200 programming models (cont.) Mixed Programming Models
There is no explicit synchronization between the CNC tasks and Windows threads.
To synchronize use global variables and G-code CALLBACK statement…
10. Marcel Grunder Measurement mode timing diagram V2
11. Marcel Grunder Difficulties Long time performance was limited by “automatic Windows updates”. ? Updates done while no user operation.
McAfee Antivirus could disturb long time measurements when McShield service started. ? McShield will be restarted with new updated database before user operation starts.
A3200 v. > 2.13 needed modification of epics base Thread stack size ?
static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000, 6000, 5000000};
A3200 without hardware behave differently. Attention when testing limits, homing, errors…
12. Marcel Grunder Synchronize CNC and Library program code G-Code provide CALLBACK function
In “C”: userCallback()
get the G-code Task number
Set the correct moving flag
scanIoReques()
epicsEventWaitWithTimeout
13. Marcel Grunder RESERVE
14. Marcel Grunder Air-Bearing Rotary Stage ? Key features Air-Bearing Rotary Stage provide superior angular positioning, velocity stability, and error motion performance.
The ABRS is designed to meet the exacting requirements of wafer inspection, high precision metrology, x-ray diffraction systems, optical inspection and fabrication, and nanotechnology device fabrication.
Accurate PositioningAn optical encoder is standard with the ABRS. Resolutions of <0.03 arc second are achievable.
15. Marcel Grunder A3200 Driver
16. Marcel Grunder Measurement mode timing diagram
17. Marcel Grunder Synchronize CNC and Library program code WAIT( $global0 == 1) -1 ; Wait for RotX osc. tigger
; Set PSO mode
PSOOUTPUT RotX WINDOW
; specify PSO Encoder (0 or 1)
PSOWINDOW RotX 1 INPUT iEncoder
; Set PSO Windows from ROTX_MSMOPEN to ROTX_MSMCLOSE
PSOWINDOW RotX 1 RANGE $global7 $global8 UNITS ;
; Rotate RotX
G1 RotX $fPosition E $fVelocity
; Force the user callback in driver c code
CALLBACK 9
18. Marcel Grunder Synchronize CNC and Library program code /* In Axis Thread to monitor G-code CALLBACK ? add userCallbackEvent *****/
AerCBackLibWaitForCallbackEvent(TASKINDEX_1, &dwEvent );
if (dwEvent == AER_LIB_CALLBACK_USER_EVENT)
callbackUser(hCtrl, TASKINDEX_1);
/* Handles the CALLBACK commands from G-code *****/
callbackUser( HAERCTRL hAerCtrl, TASKINDEX iTask) {
/* 1. Get the callback data */
AerCBackLibCallbackValueGetCallbackType(hAerCtrl, iTask, &dwCallBackNumber);
/* 2. Do the callback functionality */
if (dwCallBackNumber > 0)
/* depending on the axis task, set the correct Done flag */
switch (iTask) {
case TASKINDEX_1: /* ROTX */
AT_AxisPosGet(TRUE); /* need to get current Positions */
pAT.bRotXDone = MOTOR_STOP;
scanIoRequest(pAT.ioscanRotXDONE); /* update status bits */
epicsEventWaitWithTimeout(pAT.doneRotXSent, 1.0); /* wait until DONE record has been processed */
break;
...
}
}