連接鈕

連接 (Connect) 鈕功能為 ConnectDisconnect 鈕依硬體連接狀態而定,點擊 Connect 以將 KINGSTAR 子系統連接至硬體;若硬體已連接,擇點選 Disconnect 以斷開連結。

此方法的按鈕為 btnConnect_Click,連結至硬體前先檢查 KSMStatus.StateKSMStatusSubsystemStatus 類別之實例,我們想知道 EtherCAT 連接是否已建立,若已建立,則按鈕函式為 Disconnect,否則為 Connect

連接 (Connect)

作為 Connect 鈕,我們建立一個名為 T_LinkStart 的新執行緒,並傳送將執行在此執行緒上之方法 LinkStartT_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 的開始即宣告。

初始化 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;
}

設定存取模式

SetAxisAccessModeEtherCAT 驅動器設定資料傳輸模式,存取模式決定驅動器可用的控制模式,存取模式可在 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;
}

啟用軸的數位輸入及輸出

EnableAxisInputEnableAxisOutput 啟用或停用存取軸的數位輸出及輸入,首三個輸入位元為負超程 (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;
   }
   .........
}