You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 22
Next »
Global Variable Declarations
Legacy MCode Variables
Kept for compatibility. These are:
- Ve - MCode version. if Ve != DVER, MCode gets uploaded by IOC.
- Pu - Power-up status flag
Pulse Picker Variables
Se - Pulse Picker mode [Se]lect. Refer to Mode List for a complete list of Se modes.
- Sd - Status indicator register. Used for debugging. Refer to Status List for a complete list of statuses.
Sw - [Sw]eep distance. Number of motor steps to equal 11.25 degrees of motion.
- Sr - Encoder sweep distance. Number of encoder steps to equal 11.25 degrees of motion.
Dr - Encoder [Dr]ift, or the difference between the encoder count the predicted encoder position.
- P0 - Center (open) position, in motor steps.
- P1 - Positive closed position, in motor steps, nominally P0+Sw. (Repurposed from standard MCode program.)
- P2 - Negative closed position, in motor steps, nominally P0-Sw.
- N0 - Center (open) position, in encoder counts.
- N1 - Positive closed position, in encoder counts, nominally N0+Sr.
- N2 - Negative closed position, in encoder counts, nominally N0-Sr.
- Ec - Error checking flag. (0=OFF, 1=ON)
- Ns - Pulse Picker MCode version. (Repurposed from standard MCode program.)
- Hb - Heartbeat counter, incremented approx. every 100ms.
- Cs - Encoder counter shadow register (=C2)
- Ud - Drift violation, motor drifting in + direction (0= NO ERROR, 1=VIOLATION)
- Ld - Drift violation, motor drifting in - direction (0=NO ERROR, 1=VIOLATION)
- Df - Motor position flag (see interpretation below)
Program 1
Initialization
Code:
- If Se<>0, we are likely experiencing a hard reset. In that case:
- Signal state change to 80 (Hard Reset Initialization)
- Set EL (Encoder lines) to 4096, giving 4096 lines * 4 steps/line = 16384 steps/rev
- Set MS (Microsteps) to 8, giving 8 uSteps/step * 200 step/rev = 1600 uSteps/rev
- Set EE (Encoder enabled) to 0, forcing open-loop step mode. Closed-loop mode is too slow because of a 1kHz loop rate.
- Set S3 (I/O 3 settings) to 16,0,1. This is used for encoder power - sourcing output, active low.
- Set O3 (Output 3) to 1, turning the encoder on.
- Set S4 (I/O 4 settings) to 16,0,0. This is used for fan power - sinking power, active low.
- Set O4 (Output 4) to 1, turning the fan on.
- Set S13 (I/O 13 settings) to 60,0,0. This is used for input signaling, and makes it available to the input capture trip (interrupt)
- Set FC (Filter Capture) to 9. This sets a debounce filter on input 13 with a 12.9usec delay time.
- Set HT (Hold Time) to 5, setting the hold current delay time to 5ms.
- Set RC (Run Current) to 100, making 100% of current available for movement.
- Set HC (Holding Current) to 5.
- Set NE (Numeric Enable) to 0, to prevent errant communications as being interpreted as movement commands.
- Set Pu (Power-Up Flag) to 0 to prevent IOC from locking itself.
- Set Sw (Sweep Distance) to 50 steps.
- Set Sr (Encoder Sweep Distance) to 512 counts.
- Reset Dr (Drift) to 0.
- Reset P0 (Open position) to 0.
- Reset P1 (Positive closed position) to P0+Sw = 512.
- Reset P2 (Negative closed position) to P0-Sw = -512.
- Reset N0 (Open encoder position) to 0.
- Reset N1 (Positive closed encoder position) to N0+Sr.
- Reset N2 (Negative closed encoder position) to N0-Sr.
- Pre-load shadow register Cs=C2
- Set Ec=1 to turn error checking on.
- Reset drift violation flags Ud and Ld to 0.
- Reset Df to 99 (current slit position is unknown)
- For both hard and soft resets, we do the following
- Signal state change to 81 (Soft Reset Initialization)
- Disable any trips (TE=0)
- Hold for 100ms to let things stabilize.
- Set Se (Mode Select) to 0
- Goto Mode Select Loop
Mode Select Loop
- Signal state change to 0 (Mode Select)
- Mode Select Loop START (forever):
- If Se=1, branch to Mode 1: One-Shot
- If Se=2, branch to Mode 2: Flip-Flop
- If Se=3, branch to Mode 3: Burst
- If Se=4, branch to Mode 4: Fast Open
- If Se=5, branch to Mode 5: Fast Close
- Increment heartbeat
- Hold for 100ms
- Mode Select Loop END
Mode 1: One-Shot
- Signal state change to 10 (One-Shot Init)
- Load One-Shot speeds (V1)
- Specify One-Shot ISR (J1) to run on Input Trip
- Arm Input Trip (TE=TE|4)
- Signal state change to 11 (One-Shot Loop)
- One-Shot Loop START (forever):
- Increment heartbeat
- Hold for 100ms
- If user sets the soft reset (Se=0)
- EndIf
- If movement is complete (Sd=90)
- Signal state change to 12 (One-Shot Complete)
- EndIf
- One-Shot Loop END
NOTE: Once in the one-shot loop, you must set Se=0 to get back to Mode Select.
One-Shot ISR (J1)
- Copy current position to shadow variables
- If currently in the positive closed position (Df=1)
- Move (MA) to negative closed position P2
- If error checking is enabled (Ec=1), check drift at previous, negative closed position (call X9)
- Hold until movement complete
- Set Df=1, indicating current position is positive closed position
- Else (any other position but P1)
- Move (MA) to positive closed position P1
- Check drift at previous, positive closed position (call X8)
- Hold until movement complete
- Set Df=-1, indicating current position is negative closed position
- EndIf
- Copy current encoder count (C2) to shadow register Cs
- Signal state change to 90 (Toggle movement complete)
- Return
Mode 2: Flip-Flop
- Signal state change to 20 (Flip-Flop Init)
- Load Flip-Flop speeds (V2)
- Specify Flip-Flop ISR (J2) to run on Input Trip
- Arm Input Trip (TE=TE|4)
- Signal state change to 21 (Flip-Flop Loop)
- Flip-Flop Loop START (forever):
- Increment heartbeat
- Hold for 100ms
- If user sets the soft reset (Se=0)
- EndIf
- If at least one movement is complete (Sd=90)
- Signal state change to 22 (Flip-Flop Loop Active)
- EndIf
- Flip-Flop Loop END
NOTE: Once in the flip-flop loop, you must set Se=0 to get back to Mode Select.
Flip-Flop ISR (J2)
This ISR is identical to the One-Shot ISR (J1), with the exception that it re-arms the Input Trip (TE=TE|4) every time it runs.
Mode 3: Burst
- Signal state change to 30 (Burst Mode Init)
- Load Burst speeds (V3)
- Specify Burst Open ISR (J3) to run on Input Trip
- Arm Input Trip (TE=TE|4)
- Signal state change to 31 (Burst Loop)
- Burst Loop START (forever):
- Increment heartbeat
- Hold for 100ms
- If user sets the soft reset (Se=0)
- EndIf
- If the close movement is complete (Sd=92), then
- Signal state change to 39 (Burst complete)
- EndIf
- Burst Loop END
NOTE: Once in the burst loop, you must set Se=0 to get back to Mode Select.
Burst Open ISR (J3)
- Signal state change to 32 (Burst open signal received)
- Move (MA) to open position (P0)
- If error checking is enabled (Ec=1), check drift at previous, assumed positive closed position (call X8)
- Hold until movement complete
- Set Df=0 to indicate slits are at open position
- Signal state change to 94 (Move to open position complete)
- Specify Burst Close ISR (J4) to run on Input Trip
- Re-arm input trip (TE=TE|4)
- Return
Burst Close ISR (J4)
- Signal state change to 33 (Burst close signal received)
- Move (MA) to positive closed position (P1)
- If error checking is enabled (Ec=1), check drift at previous, assumed negative closed position (call X9) (this is redundant here)
- Hold until movement complete
- Set Df=1 to indicate slits are at positive closed position
- Copy current encoder count (C2) to shadow register Cs
- Signal state change to 91 (Move to positive closed position complete)
- Return
Mode 4: Fast Open
- Signal state change to 40 (Fast Open Init)
- Load fast open speeds
- Move (MA) to the open position (P0)
- If error checking is enabled (Ec=1), check drift at previous, assumed positive closed position (call X8)
- Hold until movement complete
- Set Df=0 to indicate that slits are in open position
- Signal state change to 41 (Fast open complete)
- Goto mode select
Mode 5: Fast Close
- Signal state change to 50 (Fast close init)
- Load fast close speeds
- If neither at position P1 (positive closed) nor at position P2 (negative closed), then
- Move (MA) to the positive closed position (P1)
- If error checking is enabled (Ec=1), check drift at previous, assumed negative closed position (call X8)
- Hold until movement complete
- Set Df=1 to indicate that slits are in positive closed position
- Copy current encoder count to Cs for future drift checks
- EndIf
- Signal state change to 51 (Fast close complete)
- Goto mode select
Subroutines
Drift Check at Positive Closed Position (X8)
- If Df==1 (position is positive closed position), then
- Let Dr=N1-Cs, such that Dr is positive if the motor is slipping (missing steps while travelling in the positive direction)
- If Dr >= Dl (drift limit), then
- Set Ld=1, indicating a drift limit violation in the negative direction
- EndIf
- EndIf
- Return
Drift Check at Negative Closed Position (X9)
- If Df==-1 (position is negative closed position), then
- Let Dr=Cs-N2, such that Dr is positive if the motor is slipping (missing steps while traveling in the negative direction)
- If Df >= Dl (drift limit), then
- Set Ud=1, indicating a drift limit violation in the negative direction
- EndIf
- EndIf
- Return
Mode/State Tables
Se - Mode Select
Se |
Mode Description |
0 |
Soft Reset - interpreted at start-up to bypass hard reset initialization routine |
1 |
One-Shot mode: one pulse on the input line results in a single sweep of the pulse picker. Does not automatically return to mode select. |
2 |
Flip-Flop mode: will sweep the pulse picker each time a pulse is received on the input line. Does not automatically return to mode select. |
3 |
Burst mode: will open the pulse picker on the first input pulse received, and close on the second. Does not automatically return to mode select. |
4 |
Fast Open: moves the pulse picker to the full open position (P0). Automatically returns to mode select. |
5 |
Fast Close: moves the pulse picker to the positive closed position (P1). Automatically returns to mode select. |
Sd - Status Indicator
Sd |
Status Description |
0 |
Waiting for Se mode selection |
10 |
One-Shot Initialization |
11 |
One-Shot Loop Waiting |
12 |
One-Shot Complete |
20 |
Flip-Flop Initialization |
21 |
Flip-Flop Loop Waiting |
22 |
Flip-Flop Loop Active |
30 |
Burst Initialization |
31 |
Burst Armed and Waiting |
32 |
Burst Open Pulse Received |
33 |
Burst Close Pulse Received |
39 |
Burst Complete |
40 |
Fast Open Initialization |
41 |
Fast Open Complete |
50 |
Fast Close Initialization |
51 |
Fast Close Complete |
80 |
Hard Reset/Power-Up Initialization |
81 |
Soft Reset/Power-Up Initialization |
90 |
Toggle Move Complete |
91 |
Move to Positive Closed Position Complete |
92 |
Move to Negative Closed Position Complete |
94 |
Move to Open Position Complete |
95 |
Close move did not execute because pulse picker is already closed |
Df - Slit Open/Closed Status
Df |
Status Description |
-1 |
Closed in the negative position |
0 |
Open |
1 |
Closed in the positive position |
99 |
Slit status is unknown |