Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

bridgeportspin.cc

Go to the documentation of this file.
00001 /*
00002   bridgeportspin.cc
00003 
00004   Controller for Bridgeport spindle I/O
00005 
00006   Modification history:
00007 
00008   31-Aug-1999  FMP changed to bridgeportspin.cc
00009   1-Oct-1998  FMP added enabled to spindle status, setting it to non-zero if
00010   spindleDirection is non-zero.
00011   1-Apr-1998  FMP changed from emcspin.cc to shvspin.cc
00012   24-Mar-1998  FMP changed ERROR() to REPORT_ERROR() due to conflict
00013   in VC++
00014   11-Dec-1997  FMP created from nce stuff
00015   */
00016 
00017 #include "rcs.hh"               // NML
00018 #include "emc.hh"               // EMC NML
00019 #include "emcio.hh"             // these decls
00020 #include "emcglb.h"
00021 #include "extintf.h"            // extDioSet(),Clear()
00022 #include "inispin.hh"           // iniSpindle()
00023 
00024 /* ident tag */
00025 #ifndef __GNUC__
00026 #ifndef __attribute__
00027 #define __attribute__(x)
00028 #endif
00029 #endif
00030 
00031 static char __attribute__((unused)) ident[] = "$Id: bridgeportspin.cc,v 1.3 2001/06/29 20:27:29 wshackle Exp $";
00032 
00033 // local functions for acting on spindle
00034 
00035 static void spindleForward()
00036 {
00037   extDioWrite(SPINDLE_REVERSE_INDEX, ! SPINDLE_REVERSE_POLARITY);
00038   extDioWrite(SPINDLE_FORWARD_INDEX, SPINDLE_FORWARD_POLARITY);
00039 }
00040 
00041 static void spindleReverse()
00042 {
00043   extDioWrite(SPINDLE_FORWARD_INDEX, ! SPINDLE_FORWARD_POLARITY);
00044   extDioWrite(SPINDLE_REVERSE_INDEX, SPINDLE_REVERSE_POLARITY);
00045 }
00046 
00047 static void spindleStop()
00048 {
00049   extDioWrite(SPINDLE_FORWARD_INDEX, ! SPINDLE_FORWARD_POLARITY);
00050   extDioWrite(SPINDLE_REVERSE_INDEX, ! SPINDLE_REVERSE_POLARITY);
00051 }
00052 
00053 static void spindleBrake(int on)
00054 {
00055   if (on)
00056     {
00057       extDioWrite(SPINDLE_BRAKE_INDEX, SPINDLE_BRAKE_POLARITY);
00058     }
00059   else
00060     {
00061       extDioWrite(SPINDLE_BRAKE_INDEX, ! SPINDLE_BRAKE_POLARITY);
00062     }
00063 }
00064 
00065 static void spindleIncrease()
00066 {
00067   extDioWrite(SPINDLE_DECREASE_INDEX, ! SPINDLE_DECREASE_POLARITY);
00068   extDioWrite(SPINDLE_INCREASE_INDEX, SPINDLE_INCREASE_POLARITY);
00069 }
00070 
00071 static void spindleDecrease()
00072 {
00073   extDioWrite(SPINDLE_INCREASE_INDEX, ! SPINDLE_INCREASE_POLARITY);
00074   extDioWrite(SPINDLE_DECREASE_INDEX, SPINDLE_DECREASE_POLARITY);
00075 }
00076 
00077 static void spindleConstant()
00078 {
00079   extDioWrite(SPINDLE_INCREASE_INDEX, ! SPINDLE_INCREASE_POLARITY);
00080   extDioWrite(SPINDLE_DECREASE_INDEX, ! SPINDLE_DECREASE_POLARITY);
00081 }
00082 
00083 static int isSpindleDirection()
00084 {
00085   int f, r;
00086 
00087   extDioCheck(SPINDLE_FORWARD_INDEX, &f);
00088   extDioCheck(SPINDLE_REVERSE_INDEX, &r);
00089 
00090   // spindle is interlocked so forward wins
00091   if (f == SPINDLE_FORWARD_POLARITY)
00092     {
00093       return 1;
00094     }
00095 
00096   if (r == SPINDLE_REVERSE_POLARITY)
00097     {
00098       return -1;
00099     }
00100 
00101   return 0;
00102 }
00103 
00104 static int isSpindleIncrease()
00105 {
00106   int i;
00107 
00108   extDioCheck(SPINDLE_INCREASE_INDEX, &i);
00109 
00110   return i == SPINDLE_INCREASE_POLARITY;
00111 }
00112 
00113 static int isSpindleDecrease()
00114 {
00115   int d;
00116 
00117   extDioCheck(SPINDLE_DECREASE_INDEX, &d);
00118 
00119   return d == SPINDLE_DECREASE_POLARITY;
00120 }
00121 
00122 static int isSpindleBrake()
00123 {
00124   int b;
00125 
00126   extDioCheck(SPINDLE_BRAKE_INDEX, &b);
00127 
00128   if (b == SPINDLE_BRAKE_POLARITY)
00129     {
00130       return 1;
00131     }
00132 
00133   return 0;
00134 }
00135 
00136 // constructor
00137 
00138 EMC_SPINDLE_MODULE::EMC_SPINDLE_MODULE()
00139 {
00140   setErrorLogChannel(new NML(nmlErrorFormat, "emcError", "spindle", EMC_NMLFILE));
00141 
00142   setCmdChannel(new RCS_CMD_CHANNEL(emcFormat, "spindleCmd", "spindle", EMC_NMLFILE));
00143 
00144   setStatChannel(new RCS_STAT_CHANNEL(emcFormat, "spindleSts", "spindle", EMC_NMLFILE), &spindleStatus);
00145 }
00146 
00147 // destructor
00148 
00149 EMC_SPINDLE_MODULE::~EMC_SPINDLE_MODULE(void)
00150 {
00151 }
00152 
00153 void EMC_SPINDLE_MODULE::DECISION_PROCESS(void)
00154 {
00155   switch (commandInData->type)
00156     {
00157     case EMC_SPINDLE_INIT_TYPE:
00158       INIT((EMC_SPINDLE_INIT *) commandInData);
00159       break;
00160 
00161     case EMC_SPINDLE_HALT_TYPE:
00162       HALT((EMC_SPINDLE_HALT *) commandInData);
00163       break;
00164 
00165     case EMC_SPINDLE_ABORT_TYPE:
00166       ABORT((EMC_SPINDLE_ABORT *) commandInData);
00167       break;
00168 
00169     case EMC_SPINDLE_FORWARD_TYPE:
00170       SPINDLE_FORWARD((EMC_SPINDLE_FORWARD *) commandInData);
00171       break;
00172 
00173     case EMC_SPINDLE_REVERSE_TYPE:
00174       SPINDLE_REVERSE((EMC_SPINDLE_REVERSE *) commandInData);
00175       break;
00176 
00177     case EMC_SPINDLE_STOP_TYPE:
00178       SPINDLE_STOP((EMC_SPINDLE_STOP *) commandInData);
00179       break;
00180 
00181     case EMC_SPINDLE_INCREASE_TYPE:
00182       SPINDLE_INCREASE((EMC_SPINDLE_INCREASE *) commandInData);
00183       break;
00184 
00185     case EMC_SPINDLE_DECREASE_TYPE:
00186       SPINDLE_DECREASE((EMC_SPINDLE_DECREASE *) commandInData);
00187       break;
00188 
00189     case EMC_SPINDLE_CONSTANT_TYPE:
00190       SPINDLE_CONSTANT((EMC_SPINDLE_CONSTANT *) commandInData);
00191       break;
00192 
00193     case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
00194       SPINDLE_BRAKE_RELEASE((EMC_SPINDLE_BRAKE_RELEASE *) commandInData);
00195       break;
00196 
00197     case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
00198       SPINDLE_BRAKE_ENGAGE((EMC_SPINDLE_BRAKE_ENGAGE *) commandInData);
00199       break;
00200 
00201     default:
00202       REPORT_ERROR(commandInData);
00203       break;
00204     }
00205 }
00206 
00207 void EMC_SPINDLE_MODULE::PRE_PROCESS(void)
00208 {
00209 }
00210 
00211 void EMC_SPINDLE_MODULE::POST_PROCESS(void)
00212 {
00213   // sync status vars with sensors
00214   spindleStatus.speed = 0.0;    // no speed sensor
00215   spindleStatus.direction = isSpindleDirection();
00216   spindleStatus.brake = isSpindleBrake();
00217   spindleStatus.increasing = isSpindleIncrease() ? 1 :
00218     isSpindleDecrease() ? -1 : 0;
00219   spindleStatus.enabled = (spindleStatus.direction != 0);
00220 }
00221 
00222 void EMC_SPINDLE_MODULE::INIT(EMC_SPINDLE_INIT *cmdIn)
00223 {
00224   if (STATE_MATCH(NEW_COMMAND))
00225     {
00226       // load params from ini file
00227       iniSpindle(EMC_INIFILE);
00228 
00229       // stop spindle, brake it, make constant
00230       spindleStop();
00231       spindleBrake(1);
00232       spindleConstant();
00233 
00234       status = RCS_DONE;
00235       stateNext(S0);
00236     }
00237   else if (STATE_MATCH(S0))
00238     {
00239       // idle
00240     }
00241 }
00242 
00243 void EMC_SPINDLE_MODULE::HALT(EMC_SPINDLE_HALT *cmdIn)
00244 {
00245   if (STATE_MATCH(NEW_COMMAND))
00246     {
00247       // stop spindle, brake it, make constant
00248       spindleStop();
00249       spindleBrake(1);
00250       spindleConstant();
00251 
00252       status = RCS_DONE;
00253       stateNext(S0);
00254     }
00255   else if (STATE_MATCH(S0))
00256     {
00257       // idle
00258     }
00259 }
00260 
00261 void EMC_SPINDLE_MODULE::ABORT(EMC_SPINDLE_ABORT *cmdIn)
00262 {
00263   if (STATE_MATCH(NEW_COMMAND))
00264     {
00265       // stop spindle, brake it, make constant
00266       spindleStop();
00267       spindleBrake(1);
00268       spindleConstant();
00269 
00270       status = RCS_DONE;
00271       stateNext(S0);
00272     }
00273   else if (STATE_MATCH(S0))
00274     {
00275       // idle
00276     }
00277 }
00278 
00279 void EMC_SPINDLE_MODULE::REPORT_ERROR(RCS_CMD_MSG *cmdIn)
00280 {
00281   if (STATE_MATCH(NEW_COMMAND))
00282     {
00283       rcs_print_error("EMC_SPINDLE_MODULE: unknown command %d\n",
00284                       cmdIn->type);
00285       status = RCS_ERROR;
00286       stateNext(S0);
00287     }
00288   else if (STATE_MATCH(S0))
00289     {
00290       // idle
00291     }
00292 }
00293 
00294 void EMC_SPINDLE_MODULE::SPINDLE_FORWARD(EMC_SPINDLE_FORWARD *cmdIn)
00295 {
00296   if (STATE_MATCH(NEW_COMMAND))
00297     {
00298       spindleForward();
00299 
00300       status = RCS_DONE;
00301       stateNext(S0);
00302     }
00303   else if (STATE_MATCH(S0))
00304     {
00305       // idle
00306     }
00307 }
00308 
00309 void EMC_SPINDLE_MODULE::SPINDLE_REVERSE(EMC_SPINDLE_REVERSE *cmdIn)
00310 {
00311   if (STATE_MATCH(NEW_COMMAND))
00312     {
00313       spindleReverse();
00314 
00315       status = RCS_DONE;
00316       stateNext(S0);
00317     }
00318   else if (STATE_MATCH(S0))
00319     {
00320       // idle
00321     }
00322 }
00323 
00324 void EMC_SPINDLE_MODULE::SPINDLE_STOP(EMC_SPINDLE_STOP *cmdIn)
00325 {
00326   if (STATE_MATCH(NEW_COMMAND))
00327     {
00328       spindleStop();
00329 
00330       status = RCS_DONE;
00331       stateNext(S0);
00332     }
00333   else if (STATE_MATCH(S0))
00334     {
00335       // idle
00336     }
00337 }
00338 
00339 void EMC_SPINDLE_MODULE::SPINDLE_INCREASE(EMC_SPINDLE_INCREASE *cmdIn)
00340 {
00341   if (STATE_MATCH(NEW_COMMAND))
00342     {
00343       spindleIncrease();
00344 
00345       status = RCS_DONE;
00346       stateNext(S0);
00347     }
00348   else if (STATE_MATCH(S0))
00349     {
00350       // idle
00351     }
00352 }
00353 
00354 void EMC_SPINDLE_MODULE::SPINDLE_DECREASE(EMC_SPINDLE_DECREASE *cmdIn)
00355 {
00356   if (STATE_MATCH(NEW_COMMAND))
00357     {
00358       spindleDecrease();
00359 
00360       status = RCS_DONE;
00361       stateNext(S0);
00362     }
00363   else if (STATE_MATCH(S0))
00364     {
00365       // idle
00366     }
00367 }
00368 
00369 void EMC_SPINDLE_MODULE::SPINDLE_CONSTANT(EMC_SPINDLE_CONSTANT *cmdIn)
00370 {
00371   if (STATE_MATCH(NEW_COMMAND))
00372     {
00373       spindleConstant();
00374 
00375       status = RCS_DONE;
00376       stateNext(S0);
00377     }
00378   else if (STATE_MATCH(S0))
00379     {
00380       // idle
00381     }
00382 }
00383 
00384 void EMC_SPINDLE_MODULE::SPINDLE_BRAKE_RELEASE(EMC_SPINDLE_BRAKE_RELEASE *cmdIn)
00385 {
00386   if (STATE_MATCH(NEW_COMMAND))
00387     {
00388       spindleBrake(0);
00389 
00390       status = RCS_DONE;
00391       stateNext(S0);
00392     }
00393   else if (STATE_MATCH(S0))
00394     {
00395       // idle
00396     }
00397 }
00398 
00399 void EMC_SPINDLE_MODULE::SPINDLE_BRAKE_ENGAGE(EMC_SPINDLE_BRAKE_ENGAGE *cmdIn)
00400 {
00401   if (STATE_MATCH(NEW_COMMAND))
00402     {
00403       spindleBrake(1);
00404 
00405       status = RCS_DONE;
00406       stateNext(S0);
00407     }
00408   else if (STATE_MATCH(S0))
00409     {
00410       // idle
00411     }
00412 }

Generated on Sun Dec 2 15:27:36 2001 for EMC by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001