| 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 |
|
|---|