1. 程式人生 > >CANOpen,關於 DS402 電機驅動器的狀態切換(控制字&狀態字)

CANOpen,關於 DS402 電機驅動器的狀態切換(控制字&狀態字)

CANopen對於運動控制來說是一款優秀的通訊協議,採用了面向物件的一些設計思路,比如物件字典,過程資料物件(PDO),服務資料物件(SDO)等等。CANopen定義了完整的同步控制機制,使其成為主流的運動控制協議,除了在CAN總線上執行外,還被搬到了乙太網上(CANopen over Ethernet),形成了著名的PowerLink,EtherCat工業乙太網協議(CoE)。

一般支援ethercat的驅動器用的都是CoE協議,在配置好PDO後,ethercat的domain中包含了對映的Object Dictionary資料,通過讀寫domain即可讀寫物件字典中的對應資料,其中最主要的兩個引數( 控制字

狀態字) 的簡單使用如下:

控制字用於控制驅動器的各種狀態切換(其中過程 0 和 過程 1 是還有 Error Occurs 都是自動切換的,其他狀態切換一般需要通過寫驅動器的控制字來完成):
驅動器各種狀態切換
各個狀態的解釋如下:
各個狀態的解釋

以下是各個狀態切換的條件,其中 Bit0、Bit1 等所指的是控制字的對應位:

狀態遷移part1

狀態遷移part2

控制字各bit表示的含義:
控制字

狀態字各bit表示的含義:
狀態字

這是一段關於狀態遷移的簡易程式碼(讀狀態字並且寫控制字)

    switch(cmd)
    {
    case ServoCommandOFF: // init value: If in Switch_On_Disabled state, change to Ready_To_Switch On
{ output.control_word_ = 0x06; // operation: Shut down break; } case ServoCommandON: { if( (input.status_word_ & 0x0040) == 0x0040 ) { output.control_word_ = 0x06; // operation: Shut down } else if ( (input.status_word_&0x007f) == 0x0031
) // FSA State: Ready to Switch On { output.control_word_ = 0x07; // operation: Switch On } break; } case ServoCommandEnable: // 上使能 { if ( (input.status_word_&0x007b) == 0x0033 ) // FSA State: Switch On { output.control_word_ = 0x0f; // Enable Operation } else { output.control_word_ = 0x0b; // 急停, Quick Stop } break; } case ServoCommandDisable: // 下使能 { output.control_word_ = 0x07; // Disable operation break; } case ServoCommandEmeStop: // 急停 { output.control_word_ = 0x0b; // 急停, Quick Stop break; } case ServoCommandFaultReset: // 錯誤恢復, 錯誤恢復後需要重新使能 { if( (input.error_code_!= 0) || (input.status_word_&0x0008) ) { output.control_word_ = output.control_word_ | 0x0080; } else { output.control_word_ = output.control_word_ & 0xff7f; } break; } case ServoCommandHalt: // 暫停 Halt On; Warning!!! 在暫停驅動器之前確保控制器已經停止傳送位置指令 { output.control_word_ = output.control_word_ | 0x0100; break; } case ServoCommandHaltReset: // 取消暫停 Halt Off, Warning!!! { output.control_word_ = output.control_word_ & 0xfeff; // if ( (input.status_word_& 0x007f) == 0x0037) // FSA State: Operation enabled (正常工作狀態) = Switch On + Enable Operation + Quick Stop Off + No warning + Voltage On // { // output.target_cmd_ = data_->out.pos; // } break; } default: output.control_word_ = 0x0b; // 急停, Quick Stop break; }