CANOpen,關於 DS402 電機驅動器的狀態切換(控制字&狀態字)
阿新 • • 發佈:2019-02-13
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 等所指的是控制字的對應位:
控制字各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;
}