| 1 | /* ----------------------------------------------------------------------- */ | 
|---|
| 2 | /*                                                                         */ | 
|---|
| 3 | /*  Version:                                                               */ | 
|---|
| 4 | /*                                                                         */ | 
|---|
| 5 | kVERSION    = 0   /*                                                       */ | 
|---|
| 6 | kSUBVERSION = 7   /*                                                       */ | 
|---|
| 7 | /*                                                                         */ | 
|---|
| 8 | /*  HISTORY:                                                               */ | 
|---|
| 9 | /*                                                                         */ | 
|---|
| 10 | /*   * V0.7                                                                */ | 
|---|
| 11 | /*       - fixed a bug, caused the software to open the brake only once    */ | 
|---|
| 12 | /*                                                                         */ | 
|---|
| 13 | /*   * V0.6                                                                */ | 
|---|
| 14 | /*       - do not reset the velocity if set already                        */ | 
|---|
| 15 | /*       - set acceleration to 20%                                         */ | 
|---|
| 16 | /*                                                                         */ | 
|---|
| 17 | /*   * V0.5:                                                               */ | 
|---|
| 18 | /*       - changes 'DKC Ready' signal to IN1 for all MACS                  */ | 
|---|
| 19 | /*       - control brake only when cannr==3                                */ | 
|---|
| 20 | /*                                                                         */ | 
|---|
| 21 | /*   * V0.4:                                                               */ | 
|---|
| 22 | /*       - restart MACS with PRGPAR 1 when not in manual mode              */ | 
|---|
| 23 | /*       - replaced label reset by a subprg                                */ | 
|---|
| 24 | /*                                                                         */ | 
|---|
| 25 | /*   * V0.3:                                                               */ | 
|---|
| 26 | /*       - added support for the elevation axis brake                      */ | 
|---|
| 27 | /*       - enabled check for operation mode (remote control/pc)            */ | 
|---|
| 28 | /*       - added 'reset' label                                             */ | 
|---|
| 29 | /*       - moved syncv/cstart to setting rf                                */ | 
|---|
| 30 | /*                                                                         */ | 
|---|
| 31 | /*   * V0.2:                                                               */ | 
|---|
| 32 | /*       - fixed a bug, shaking the telescope switching on again after an  */ | 
|---|
| 33 | /*         emergency stop                                                  */ | 
|---|
| 34 | /*                                                                         */ | 
|---|
| 35 | /*   * V0.1:                                                               */ | 
|---|
| 36 | /*       - first implementation                                            */ | 
|---|
| 37 | /*                                                                         */ | 
|---|
| 38 | /* ----------------------------------------------------------------------- */ | 
|---|
| 39 |  | 
|---|
| 40 | PRINT "Magic Manc (Manual Control) V", kVERSION, ".", kSUBVERSION /*       */ | 
|---|
| 41 |  | 
|---|
| 42 | /* | 
|---|
| 43 | if (get cannr!=1) and (get cannr!=3) then | 
|---|
| 44 | PRINT "Sorry, wrong MACS (CAN Id=", get cannr, ") only #1 and #3 allowed!" | 
|---|
| 45 | exit | 
|---|
| 46 | endif | 
|---|
| 47 | */ | 
|---|
| 48 |  | 
|---|
| 49 | /*-------------------------------------------------------------------------*/ | 
|---|
| 50 | /* section for global constants                                            */ | 
|---|
| 51 | /*-------------------------------------------------------------------------*/ | 
|---|
| 52 | SET PRGPAR       -1          /* Don't restart any Program on Exit          */ | 
|---|
| 53 |  | 
|---|
| 54 | SET ENCODERTYPE   0          /* Incremental Encoder                        */ | 
|---|
| 55 | SET MENCODERTYPE  0          /* Incremental Encoder (Master)               */ | 
|---|
| 56 |  | 
|---|
| 57 | SET ENDSWMOD      0          /* No End Switch                              */ | 
|---|
| 58 | SET ERRCOND       2          /* Motor Stop, position control, no break     */ | 
|---|
| 59 | SET POSDRCT      -1          /* rotation direction                         */ | 
|---|
| 60 | SET POSFACT_Z     1          /* 1 user unit (be) = POSFACT_Z/POSFACT_N qc  */ | 
|---|
| 61 | SET POSFACT_N     1          /*                                            */ | 
|---|
| 62 |  | 
|---|
| 63 | SET HOME_FORCE    0          /* Don't force Home positioning on mainloopup    */ | 
|---|
| 64 | SET HOME_OFFSET   0          /* Offset between index and home position     */ | 
|---|
| 65 | SET HOMETYPE      0          /* drive to home, reverse, go to next index   */ | 
|---|
| 66 |  | 
|---|
| 67 | /*----------------*/ | 
|---|
| 68 | /* syncronisation */ | 
|---|
| 69 | /*----------------*/ | 
|---|
| 70 | SET SYNCFACTM      1         /* Master Sync Velocity factor                */ | 
|---|
| 71 | SET SYNCFACTS      1         /* Slave Sync Velocity factor                 */ | 
|---|
| 72 | SET SYNCPOSOFFS    0         /* Sync Position offset between M/S           */ | 
|---|
| 73 | SET SYNCACCURACY  50         /* When to set Accuracy Flag                  */ | 
|---|
| 74 | SET REVERS         0         /* How to handle reversation of vel           */ | 
|---|
| 75 |  | 
|---|
| 76 | /*----------------*/ | 
|---|
| 77 | /*    Inputs      */ | 
|---|
| 78 | /*----------------*/ | 
|---|
| 79 | SET I_REFSWITCH   0          /* Reference Switch                           */ | 
|---|
| 80 | SET I_POSLIMITSW  0          /* Pos Limit Switch                           */ | 
|---|
| 81 | SET I_NEGLIMITSW  0          /* Neg Limit Switch                           */ | 
|---|
| 82 | SET I_BREAK       0          /* Input which brakes a running program       */ | 
|---|
| 83 | SET I_CONTINUE    0          /* Input to continue a broken program         */ | 
|---|
| 84 | SET I_ERRCLR      0          /* Input to clear error                       */ | 
|---|
| 85 |  | 
|---|
| 86 | /*----------------*/ | 
|---|
| 87 | /*    Outputs     */ | 
|---|
| 88 | /*----------------*/ | 
|---|
| 89 | SET O_AXMOVE      0          /* Motor control is working                   */ | 
|---|
| 90 | SET O_BRAKE       0          /* Brake                                      */ | 
|---|
| 91 | SET O_ERROR       0          /* error occured                              */ | 
|---|
| 92 |  | 
|---|
| 93 | /*----------------*/ | 
|---|
| 94 | /* Unit param.    */ | 
|---|
| 95 | /*----------------*/ | 
|---|
| 96 | SET RAMPTYPE      1          /* Ramp Type: 0=Trapez, 1=Sinus               */ | 
|---|
| 97 | SET ENCODER    1500          /* Encoder has 1500 Ticks                     */ | 
|---|
| 98 | SET MENCODER   1500          /* Encoder has 500 Ticks (Master)             */ | 
|---|
| 99 | SET VELMAX     3000          /* Motor: Maximum revolutions per minute      */ | 
|---|
| 100 | SET POSERR     1500          /* Maximum tolarable Position error (qc) 0.1° */ | 
|---|
| 101 | SET RAMPMIN   10000          /* Shortest Ramp 10s                          */ | 
|---|
| 102 |  | 
|---|
| 103 | /*----------------*/ | 
|---|
| 104 | /* Dflt vel & acc */ | 
|---|
| 105 | /*----------------*/ | 
|---|
| 106 |  | 
|---|
| 107 | /* Prop=100, Div=300, Int=800 */ | 
|---|
| 108 | if (get cannr==1) then | 
|---|
| 109 | SET KPROP 100 | 
|---|
| 110 | SET KDER  300 | 
|---|
| 111 | SET KINT  1000 | 
|---|
| 112 | elseif (get cannr==2) then | 
|---|
| 113 | SET KPROP 100 | 
|---|
| 114 | SET KDER  200 | 
|---|
| 115 | SET KINT  150 | 
|---|
| 116 | else | 
|---|
| 117 | SET KPROP 350 | 
|---|
| 118 | SET KDER  50 | 
|---|
| 119 | SET KINT  350 | 
|---|
| 120 | endif | 
|---|
| 121 |  | 
|---|
| 122 | vres = (GET ENCODER)*(GET VELMAX)           /*  ticks/R * R/M = ticks/min  */ | 
|---|
| 123 | SET VELRES    vres                          /* Set velocity units          */ | 
|---|
| 124 |  | 
|---|
| 125 | /*----------------*/ | 
|---|
| 126 | /* Manual control */ | 
|---|
| 127 | /*----------------*/ | 
|---|
| 128 | SET RAMPTYPE 1                    /* Ramp: 0=linear, 1=sinus     */ | 
|---|
| 129 | defacc = 10*vres%100 | 
|---|
| 130 |  | 
|---|
| 131 | SET DFLTACC defacc                /* Default acceleratio: [%]    */ | 
|---|
| 132 | ACC defacc | 
|---|
| 133 | DEC defacc*2 | 
|---|
| 134 | /* Velocity which is reached in | 
|---|
| 135 | a time given by RAMPMIN     */ | 
|---|
| 136 | SET DFLTVEL    (1*vres%100)       /* Default velocity [%]        */ | 
|---|
| 137 |  | 
|---|
| 138 | manvel = (4*vres%100)  /* 150 U/min */     /* Max speed in man mode: [%]  */ | 
|---|
| 139 |  | 
|---|
| 140 | print "Vel Res (vel max): ", GET VELRES, " Encoder Ticks/min" | 
|---|
| 141 | print "V_man: ", manvel, " Encoder Ticks/min,  Acc=", defacc | 
|---|
| 142 |  | 
|---|
| 143 | /*----------------*/ | 
|---|
| 144 | /* Software range */ | 
|---|
| 145 | /*----------------*/ | 
|---|
| 146 | SET SWPOSLIMACT   0             /* positive software limit switch inactive */ | 
|---|
| 147 | SET SWNEGLIMACT   0             /* negative software limit switch inactive */ | 
|---|
| 148 | SET POSLIMIT      0             /* positive software limit (qc)            */ | 
|---|
| 149 | SET NEGLIMIT      0             /* negative software limit (qc)            */ | 
|---|
| 150 |  | 
|---|
| 151 | /*-------------------------------------------------------------------------*/ | 
|---|
| 152 | /* const section for constant velues                                       */ | 
|---|
| 153 | /*-------------------------------------------------------------------------*/ | 
|---|
| 154 | kTRUE  = 1 | 
|---|
| 155 | kFALSE = 0 | 
|---|
| 156 |  | 
|---|
| 157 | /*-------------------------------------------------------------------------*/ | 
|---|
| 158 | /* Error routine                                                           */ | 
|---|
| 159 | /*-------------------------------------------------------------------------*/ | 
|---|
| 160 | on error gosub suberror | 
|---|
| 161 |  | 
|---|
| 162 | kIoModule = 4*256 | 
|---|
| 163 |  | 
|---|
| 164 | /*-------------------------------------------------------------------------*/ | 
|---|
| 165 | /* mainloop rotation mode but stand still                                  */ | 
|---|
| 166 | /*-------------------------------------------------------------------------*/ | 
|---|
| 167 |  | 
|---|
| 168 | brake = 0 | 
|---|
| 169 | RF    = 0 | 
|---|
| 170 | velo  = 0 | 
|---|
| 171 |  | 
|---|
| 172 | gosub reset | 
|---|
| 173 |  | 
|---|
| 174 | mainloop: | 
|---|
| 175 | fuse  = in (kIoModule+1) | 
|---|
| 176 | emcy  = in (kIoModule+2) | 
|---|
| 177 | vltg  = in (kIoModule+3) | 
|---|
| 178 | mode  = in (kIoModule+4) | 
|---|
| 179 | /* | 
|---|
| 180 | if (get cannr==1) or (get cannr==2) then | 
|---|
| 181 | */ | 
|---|
| 182 | ready = in 1 | 
|---|
| 183 | /* | 
|---|
| 184 | elseif (get cannr==3) then | 
|---|
| 185 | ready = in (kIoModule+5) | 
|---|
| 186 | endif | 
|---|
| 187 | */ | 
|---|
| 188 |  | 
|---|
| 189 | if (ready==0) and (RF==1) then | 
|---|
| 190 | print "DKC not ready, but RF set... setting RF=AH=0!" | 
|---|
| 191 | gosub reset | 
|---|
| 192 | goto mainloop | 
|---|
| 193 | elseif mode==0 then | 
|---|
| 194 | print "Control not in manual mode!" | 
|---|
| 195 | gosub reset | 
|---|
| 196 | SET PRGPAR 1 | 
|---|
| 197 | exit | 
|---|
| 198 | elseif fuse==0 then | 
|---|
| 199 | print "Motor-Power Fuse not OK!" | 
|---|
| 200 | gosub reset | 
|---|
| 201 | goto mainloop | 
|---|
| 202 | elseif vltg==0 then | 
|---|
| 203 | print "Overvoltage control broken!" | 
|---|
| 204 | gosub reset | 
|---|
| 205 | goto mainloop | 
|---|
| 206 | elseif emcy==0 then | 
|---|
| 207 | print "Please release Emergency Stop!" | 
|---|
| 208 | gosub reset | 
|---|
| 209 | goto mainloop | 
|---|
| 210 | elseif (ready==1) and (RF==0) then | 
|---|
| 211 | print "DKC powered, RF=0... setting RF=AH=1!" | 
|---|
| 212 | /* | 
|---|
| 213 | * After switching on power wait at least 300ms until | 
|---|
| 214 | * control changed state 'bb' to 'ab' | 
|---|
| 215 | */ | 
|---|
| 216 | cvel 0 | 
|---|
| 217 | waitt 300 | 
|---|
| 218 | out 1 0 | 
|---|
| 219 | out 2 0 | 
|---|
| 220 | motor off | 
|---|
| 221 | waitt 100 | 
|---|
| 222 | out 1 1 | 
|---|
| 223 | out 2 1 | 
|---|
| 224 | RF = 1 | 
|---|
| 225 | waitt 100 | 
|---|
| 226 |  | 
|---|
| 227 | if (brake==0 and get cannr==3) then | 
|---|
| 228 | out (kIoModule+1) 1 | 
|---|
| 229 | brake = 1 | 
|---|
| 230 | waitt 1000 | 
|---|
| 231 | endif | 
|---|
| 232 |  | 
|---|
| 233 | motor on | 
|---|
| 234 |  | 
|---|
| 235 | if (get cannr==2) then | 
|---|
| 236 | syncv | 
|---|
| 237 | print "Synchronizing speed..." | 
|---|
| 238 | else | 
|---|
| 239 | cstart | 
|---|
| 240 | print "Starting revolution mode..." | 
|---|
| 241 | waitt 500 | 
|---|
| 242 | endif | 
|---|
| 243 | elseif (ready==0) or (RF==0) then | 
|---|
| 244 | goto mainloop | 
|---|
| 245 | endif | 
|---|
| 246 | /* | 
|---|
| 247 | if (get cannr==2) then | 
|---|
| 248 | print apos, " ", mapos, "  ", avel," ", mavel | 
|---|
| 249 | waitt 500 | 
|---|
| 250 | goto mainloop | 
|---|
| 251 | endif | 
|---|
| 252 | */ | 
|---|
| 253 | forward  = in 2 | 
|---|
| 254 | backward = in 3 | 
|---|
| 255 |  | 
|---|
| 256 | if     (forward==1) and (backward==0) and (velo!=manvel) then | 
|---|
| 257 | cvel  manvel | 
|---|
| 258 | velo = manvel | 
|---|
| 259 | elseif (forward==0) and (backward==1) and (velo!=-manvel) then | 
|---|
| 260 | cvel -manvel | 
|---|
| 261 | velo = -manvel | 
|---|
| 262 | elseif (forward==backward) and (velo!=0) then | 
|---|
| 263 | cvel 0 | 
|---|
| 264 | velo = 0 | 
|---|
| 265 | endif | 
|---|
| 266 | goto mainloop | 
|---|
| 267 |  | 
|---|
| 268 | SUBMAINPROG | 
|---|
| 269 | subprog reset | 
|---|
| 270 | out 1 0 | 
|---|
| 271 | out 2 0 | 
|---|
| 272 | RF = 0 | 
|---|
| 273 | motor off | 
|---|
| 274 | velo = 0 | 
|---|
| 275 | waitt 1000 | 
|---|
| 276 |  | 
|---|
| 277 | if (brake==1 and get cannr==3) then | 
|---|
| 278 | waitt 3000          /* wait 3s for DKC to stop the motor */ | 
|---|
| 279 | out (kIoModule+1) 0 /* brake the brake                   */ | 
|---|
| 280 | brake = 0 | 
|---|
| 281 | waitt 1000 | 
|---|
| 282 | endif | 
|---|
| 283 | return | 
|---|
| 284 |  | 
|---|
| 285 | subprog suberror | 
|---|
| 286 | out 1 0 | 
|---|
| 287 | out 2 0 | 
|---|
| 288 | RF = 0 | 
|---|
| 289 | waitt 100 | 
|---|
| 290 | velo = 0 | 
|---|
| 291 |  | 
|---|
| 292 | if (brake==1 and get cannr==3) then | 
|---|
| 293 | waitt 5000 | 
|---|
| 294 | out (kIoModule+1) 0 | 
|---|
| 295 | brake = 0 | 
|---|
| 296 | waitt 500 | 
|---|
| 297 | endif | 
|---|
| 298 |  | 
|---|
| 299 | print "Error #", errno | 
|---|
| 300 |  | 
|---|
| 301 | if errno==3 then     /* axis not existing: shoud never happen */ | 
|---|
| 302 | exit | 
|---|
| 303 | elseif errno==5 then /* error remaining: tried moving while error not cleared */ | 
|---|
| 304 | /* !!! */ | 
|---|
| 305 | exit | 
|---|
| 306 | elseif errno==6 then /* home not first command: shoud never happen */ | 
|---|
| 307 | exit | 
|---|
| 308 | elseif errno==8 then /* control deviation too large */ | 
|---|
| 309 | /* | 
|---|
| 310 | * | 
|---|
| 311 | */ | 
|---|
| 312 | elseif errno==9 then /* index not found: shoud never happen */ | 
|---|
| 313 | exit | 
|---|
| 314 | elseif errno==10 then /* unknown command: shoud never happen */ | 
|---|
| 315 | exit | 
|---|
| 316 | elseif errno==11 then /* software endswitch reached */ | 
|---|
| 317 | /* | 
|---|
| 318 | * | 
|---|
| 319 | */ | 
|---|
| 320 | elseif errno==12 then /* wrong paremeter number: shoud never happen */ | 
|---|
| 321 | exit | 
|---|
| 322 | elseif errno==14 then /* too many LOOP commands: shoud never happen */ | 
|---|
| 323 | exit | 
|---|
| 324 | elseif errno==16 then /* parameter in EEPROM broken */ | 
|---|
| 325 | exit | 
|---|
| 326 | elseif errno==17 then /* programs in EEPROM broken */ | 
|---|
| 327 | exit | 
|---|
| 328 | elseif errno==18 then /* RESET by CPU: Reason could be power-problems */ | 
|---|
| 329 | exit | 
|---|
| 330 | elseif errno==19 then /* User break */ | 
|---|
| 331 | exit | 
|---|
| 332 | elseif errno==25 then /* hardware Endswitch reached */ | 
|---|
| 333 | /* | 
|---|
| 334 | * | 
|---|
| 335 | */ | 
|---|
| 336 | elseif errno==51 then /* too many gosub: shoud never happen */ | 
|---|
| 337 | exit | 
|---|
| 338 | elseif errno==52 then /* too many return: shoud never happen */ | 
|---|
| 339 | exit | 
|---|
| 340 | elseif errno==62 then /* error verifying EEPROM */ | 
|---|
| 341 | exit | 
|---|
| 342 | elseif errno==70 then /* error in DIM statement: should never happen */ | 
|---|
| 343 | exit | 
|---|
| 344 | elseif errno==72 then /* DIM limit reached: should never happen */ | 
|---|
| 345 | exit | 
|---|
| 346 | elseif errno==79 then /* Timeout waiting for an index */ | 
|---|
| 347 | exit | 
|---|
| 348 | elseif errno==84 then /* Too many ON TIME calls */ | 
|---|
| 349 | exit | 
|---|
| 350 | elseif errno==87 then /* storage for variables exhausted */ | 
|---|
| 351 | exit | 
|---|
| 352 | else | 
|---|
| 353 | print "Unknown (internal) error #", errno | 
|---|
| 354 | exit | 
|---|
| 355 | endif | 
|---|
| 356 |  | 
|---|
| 357 | exit | 
|---|
| 358 | /*errclr*/ /* errclr includes 'motor on' which enables the motor controlling */ | 
|---|
| 359 |  | 
|---|
| 360 | return | 
|---|
| 361 | ENDPROG | 
|---|
| 362 |  | 
|---|
| 363 |  | 
|---|