連接鈕
連接 (Connect) 鈕功能為 Connect 或 Disconnect 鈕依硬體連接狀態而定,點擊 Connect 以將 KINGSTAR 子系統連接至硬體;若硬體已連接,擇點選 Disconnect 以斷開連結。
此方法的按鈕為 btnConnect_Click,連結至硬體前先檢查 KSMStatus.State,KSMStatus 為 SubsystemStatus 類別之實例,我們想知道 EtherCAT 連接是否已建立,若已建立,則按鈕函式為 Disconnect,否則為 Connect。
連接 (Connect)
作為 Connect 鈕,我們建立一個名為 T_LinkStart 的新執行緒,並傳送將執行在此執行緒上之方法 LinkStart,T_LinkStart 將作為背景執行緒運行,而方法 T_LinkStart.Start 用來開啟此執行緒。
var T_LinkStart = new Thread(LinkStart);
T_LinkStart.IsBackground = true;
T_LinkStart.Start();
配置 KINGSTAR 子系統
LinkStart 包含一系列 KINGSTAR 方法以初始化、建立及開啟 EtherCAT 連結,LinkStart 中使用以下變數:
private void LinkStart()
{.........}
變數
以下變數在 Form1.vb 的開始即宣告,此變數偵測方法或 EtherCAT 連結之狀態,並在範例程式中使用,LinkStart 為第一個看到這些變數的地方。
範例使用以下變數,其皆在 Form1.cs 的開始即宣告。
KS_API– Api 類別的實例。KsCommandStatus Command = null– KsCommandStatus 為包含方法狀態的類別,可由其得知方法是否運行、完成工作、回傳錯誤與錯誤為何,使用Command以獲取方法的狀態。KsError Code = KsError.errNoError– KsError 為包含 KINGSTAR 所有錯誤碼的列舉類型。使用Code以接收方法的回傳值,errNoError表示方法成功執行,若Code非errNoError,則將呼叫 Destroy 而 KINGSTAR 子系統將終止。- OPFlag – 此旗標信號指示 EtherCAT 連結是否已建立。
初始化 KINGSTAR 子系統之連結
首先呼叫 Create,準備連接應用程式至 KINGSTAR 子系統,開始任何動作前,必須最先呼叫 Create 方法。
Code = KS_API.Create(0, 0);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to create: " + Code.ToString(); });
KS_API.Destroy();
return;
}
設定 EtherCAT 循環時間
SetCycleTime 設定 EtherCAT 循環時間(單位為秒),欲使用低於 1 毫秒的循環時間,須備有高速計時器套件。非所有軸皆可支援快速循環時間,若選擇了不支援的循環時間,則每個軸的更新時間會自動且各自延長,欲使用快速循環時間,請確保電腦上的網卡可使用,只有具有低延遲的網卡才可支持快速循環。
Code = KS_API.SetCycleTime(0.001);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to set cycle time: " + Code.ToString(); });
KS_API.Destroy();
return;
}
停用 RTX64 伺服主控台 (Server Console) 上的記錄
EnableServerLog 啟用或停用 RTX64 Server Console 上的即時訊息,若將其停用,則主控台將只顯示 KINGSTAR 訊息,在此範例中我們選擇將其停用。
Code = KS_API.EnableServerLog(false);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to set server log: " + Code.ToString(); });
KS_API.Destroy();
return;
}
設定存取模式
SetAxisAccessMode 為 EtherCAT 驅動器設定資料傳輸模式,存取模式決定驅動器可用的控制模式,存取模式可在 KsAccessMode 列舉類型中選擇,預設之存取模式為 accessVelPos。
Code = KS_API.SetAxisAccessMode(KsAccessMode.accessVelPos);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to set access mode: " + Code.ToString(); });
KS_API.Destroy();
return;
}
啟用軸的數位輸入及輸出
EnableAxisInput 和 EnableAxisOutput 啟用或停用存取軸的數位輸出及輸入,首三個輸入位元為負超程 (Negative Overtravel)、正超程 (Positive Overtravel) 與原點復歸感測器 (Home Sensor),若啟用輸入則可存取超程位元。
Code = KS_API.EnableAxisInput(true);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to set servo inputs: " + Code.ToString(); });
KS_API.Destroy();
return;
}
Code = KS_API.EnableAxisOutput(true);
if (Code != KsError.errNoError)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to set servo Outputs: " + Code.ToString(); });
KS_API.Destroy();
return;
}
設定模擬軸的數量
SetConfiguredAxesCount 設定模擬軸的數量,我們使用變數 SERVOCOUNT 以將數量設為一,若沒有真實軸,一個模擬軸將建立給 EtherCAT 網路。
Code = KS_API.SetConfiguredAxesCount(SERVOCOUNT);
啟用實際速度
EnableActualVelocity讀取軸的實際速度。
Code = KS_API.EnableActualVelocity(true);
開啟 KINGSTAR 子系統
我們使用 Start 以開啟 KINGSTAR 子系統和 EtherCAT 網路,為防止子系統無法啟動導致程式永遠等待其完成,我們為 Start 使用 WaitForCommand 將超時設定為 30 秒,而若 KINGSTAR 子系統無法啟動,則使用 Destroy 關閉與子系統的連接並將其終止。
Command = KS_API.WaitForCommand(30, true, KS_API.Start());
if (!Command.Done)
{
lbErrorStatus.Invoke((MethodInvoker)delegate { lbErrorStatus.Text = "Failed to start EtherCAT: " + Command.ErrorId.ToString(); });
KS_API.Destroy();
return;
}
OPFlag = false;
斷開連結 (Disconnect)
作為斷連 (Disconnect) 鈕,使用 Stop 來停止 EtherCAT 連接和 KINGSTAR 子系統,當子系統已停止,Disconnect 的文字將變更為 Connect。
private void btnConnect_Click(object sender, EventArgs e)
{
if (KSMStatus.State == EthercatState.ecatOP)
{
//Stops the EtherCAT network and the KINGSTAR Subsystem.
KS_API.Stop();
btnConnect.Text = "Connect";
return;
}
.........
}