Ignore:
Timestamp:
05/25/01 16:51:24 (24 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Cosy/devdrv
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Cosy/devdrv/macs.cc

    r732 r808  
    1010    : NodeDrv(nodeid, out), fMacId(2*nodeid+1),
    1111    fPos(0), fPosTime(0.0), fPdoPos(0), fPdoTime(0.0),
    12     fPosActive(0), fRpmActive(0), fError(FALSE)
     12    fPosActive(0), fRpmActive(0)
    1313{
    1414}
     
    115115    RequestSDO(0x2004);
    116116    WaitForSdo(0x2004);
    117 
    118 
    119 */
     117    */
     118
    120119    lout << "- Requesting Mac Software Version of " << (int)GetId() << endl;
    121120    RequestSDO(0x100a);
    122121    WaitForSdo(0x100a);
    123     //   
     122
    124123    SetRpmMode(FALSE);
    125124
     
    131130
    132131
    133     SetHome(250000);
     132//    SetHome(250000);
    134133
    135134//    lout << "- Requesting SDO 0x2001 of " << (int)GetId() << endl;
     
    195194    WaitForSdo(0x6003, 2);
    196195
     196    // home also defines the zero point of the system
    197197    SendSDO(0x3001, string('h','o','m','e'));       // home
    198198    WaitForSdo(0x3001);
    199199    lout << "- Home position of #" << (int)GetId() << " reached. " << endl;
     200
     201    SendSDO(0x6003, 0, string('s','e','t'));       // home
     202    WaitForSdo(0x6003, 0);
    200203}
    201204
     
    208211void Macs::SetAcceleration(LWORD_t acc)
    209212{
    210     SendSDO(0x2003, 0, acc);     // acceleration
     213    SendSDO(0x2003, 0, acc);  // acceleration
    211214    WaitForSdo(0x2003, 0);
    212215}
     
    214217void Macs::SetDeceleration(LWORD_t dec)
    215218{
    216     SendSDO(0x2003, 1, dec);     // acceleration
     219    SendSDO(0x2003, 1, dec);  // acceleration
    217220    WaitForSdo(0x2003, 1);
    218221}
     
    223226    // SetRpmMode(FALSE) stop the motor, but lets the position control unit on
    224227    //
    225 
    226228    SendSDO(0x3006, 0, mode ? string('S','T','R','T') : string('S','T','O','P'));
    227229    WaitForSdo(0x3006, 0);
     
    250252    WaitForSdo(0x3008);
    251253}
     254
     255void Macs::SetSyncMode()
     256{
     257    lout << "- Setting Sync Mode #" << (int)GetId() << endl;
     258    SendSDO(0x3007, string('S', 'Y', 'N', 'C'));
     259    WaitForSdo(0x3007);
     260}
    252261/*
    253262void Macs::ReqAxEnd()
     
    283292    LWORDS_t errinf = (data[4]<<24) | (data[5]<<16) | (data[6]<<8) | data[7];
    284293
     294    //
     295    // errnum==0 gives a sudden information that something happened. Now the
     296    // microcontroller is running inside its interrup procedure which
     297    // stopped the normal program. The interrupt procedure should try to clear
     298    // the error state of the hardware. This should never create a new error!
     299    //
    285300    if (!errnum)
    286301    {
    287302        cout << "Mac #" << (int)GetId() << " reports Error occursion." << endl;
    288         fError = TRUE;
     303        SetError(-1);
    289304        return;
    290305    }
     306
     307    //
     308    // Now the error is handled by the hardware now it is the software part
     309    // to react on it. The Error flag now is set to the correct value.
     310    //
     311    if (GetError()>0)
     312        cout << "Mac #" << (int)GetId() << " WARNING! Error #" << GetError() << " unhandled by software." << endl;
     313
     314    SetError(errnum);
    291315
    292316    cout << "Mac #" << (int)GetId() << " reports: ";
     
    305329        return;
    306330
     331    case 11:
    307332    case 25:
    308333        switch (errinf)
    309334        {
     335        case -1:
     336            cout << "Negative";
     337            break;
    310338        case 1:
    311339            cout << "Positive";
    312             break;
    313         case 2:
    314             cout << "Negative";
    315340            break;
    316341        default:
    317342            cout << "-unknown-";
    318343        }
    319         cout << " endswitch activated." << endl;
    320         fError = FALSE;
     344        switch (errnum)
     345        {
     346        case 11:
     347            cout << " software endswitch activated." << endl;
     348            break;
     349        case 25:
     350            cout << " hardware endswitch activated." << endl;
     351            break;
     352        }
    321353        return;
    322354
     
    330362}
    331363
     364void Macs::HandleError()
     365{
     366    //
     367    // If there is no error we must not handle anything
     368    //
     369    if (!HasError())
     370        return;
     371
     372    //
     373    // If the program got into the: HandleError state before the hardware
     374    // has finished handeling the error we have to wait for the hardware
     375    // handeling the error
     376    //
     377    // FIXME: Timeout???
     378    //
     379    while (GetError()<0)
     380        usleep(1);
     381
     382    //
     383    // After this software and hardware should be in a state so that
     384    // we can go on working 'as usual' Eg. Initialize a Display Update
     385    //
     386    cout << "Mac #" << (int)GetId() << " Handling Error #" << GetError() << endl;
     387    switch (GetError())
     388    {
     389    case  6: // home
     390    case  8: // control dev
     391    case  9: // zero idx
     392    case 84: // ON TIME
     393        // Stop program?
     394        return;
     395
     396    case 11: // software endswitch
     397    case 25: // hardware endswitch
     398        DelError();
     399        return;
     400    }
     401}
     402
    332403double Macs::GetTime()
    333404{
     
    350421}
    351422
     423/*   0x2000 0 rw Maximum positioning error     */
     424/*          1 rw Negative Software Endswitch   */
     425/*          2 rw Positive Software Endswitch   */
     426void Macs::SetNegEndswitch(LWORDS_t val)
     427{
     428    SendSDO(0x2000, 1, (LWORD_t)val);
     429    WaitForSdo(0x2000, 1);
     430}
     431
     432void Macs::SetPosEndswitch(LWORDS_t val)
     433{
     434    SendSDO(0x2000, 2, (LWORD_t)val);
     435    WaitForSdo(0x2000, 2);
     436}
     437
     438void Macs::EnableEndswitches(bool neg, bool pos)
     439{
     440    SendSDO(0x2000, 3, (LWORD_t)(neg|(pos<<1)));
     441    WaitForSdo(0x2000, 3);
     442}
  • trunk/MagicSoft/Cosy/devdrv/macs.h

    r732 r808  
    2121    BYTE_t   fPosActive;
    2222    BYTE_t   fRpmActive;
    23 
    24     int      fError;      // Indicater for error state
    2523
    2624    LWORD_t string(BYTE_t b0=0, BYTE_t b1=0, BYTE_t b2=0, BYTE_t b3=0)
     
    5856    void SetVelocity(LWORD_t vel);
    5957    void SetNoWait(BYTE_t flag=TRUE);
     58    void SetSyncMode();
    6059    void SetRpmMode(BYTE_t mode=TRUE);
    6160    void SetRpmVelocity(LWORDS_t cvel);
    6261    void SetPDO1On(BYTE_t flag=TRUE);
     62    void SetPosEndswitch(LWORDS_t val);
     63    void SetNegEndswitch(LWORDS_t val);
     64
     65    void EnableEndswitches(bool neg=true, bool pos=true);
    6366
    6467    void StartRelPos(LWORDS_t pos);
     
    7982    LWORDS_t GetPos()    { return fPos; }
    8083    LWORDS_t GetVel()    { return fVel; }
    81     LWORD_t  GetVelRes() { return fVelRes; }
     84    LWORD_t  GetVelRes() { return fVelRes; } // Velocity units (would be 100 for %)
    8285
    83     int      HasError() { return fError; }
     86    void HandleError();
    8487};
    8588
Note: See TracChangeset for help on using the changeset viewer.