連接狀態與進度列

點擊 Connect 後, KINGSTAR 子系統即開始連接到硬體,我們使用標籤與進度列 (Label and Progress Bar) 來顯示連接狀態,

標籤:連結狀態

使用事件 t_Staus_Tick 來檢查 EtherCAT 連結之狀態,t_Staus 為當 Windows Forms 初始化後所啟用的 Timer 變數,而 Tick 為 Timer 類別之事件,t_Staus.Interval 設為 5(在 Form1.Designer.cs 中定義),表示 t_Staus_Tick 每 5 毫秒執行一次。

EtherCAT 連結有四種狀態:Init, Pre-Operational (Pre-Op), Safe-Operational (Safe-Op), Operational (Op),當狀態為 Op,則連結及建立,欲在連接時顯示這些狀態,我們使用 GetStatus 以獲取 EtherCAT 連結的狀態。KSMStatusSubsystemStatus 類別之實例,含 State 欄位以接收 EtherCAT 連結之狀態;if 陳述式用來檢查狀態;標籤 lbStatus 透過 Invoke 反映對應的狀態,當狀態為 ecatOP (Op),此時 Connect 鈕的文字將變為 Disconnect

private void t_Staus_Tick(object sender, EventArgs e)
{
   int Mindex = lbMList.SelectedIndex;

   //Gets the state of the EtherCAT link.
   Code= KS_API.GetStatus(KSMStatus, null);

   if (KSMStatus.State == EthercatState.ecatOffline)
   {
      lbStatus.Invoke((MethodInvoker)delegate { lbStatus.Text = "Offline"; });
   }
   if (KSMStatus.State == EthercatState.ecatInit)
   {
      lbStatus.Invoke((MethodInvoker)delegate { lbStatus.Text = "Init"; });
   }
   if (KSMStatus.State == EthercatState.ecatPreOP)
   {
      lbStatus.Invoke((MethodInvoker)delegate { lbStatus.Text = "PreOP"; });
   }
   if (KSMStatus.State == EthercatState.ecatSafeOP)
   {
      lbStatus.Invoke((MethodInvoker)delegate { lbStatus.Text = "SafeOP"; });
   }
   if (KSMStatus.State == EthercatState.ecatOP)
   {
      lbStatus.Invoke((MethodInvoker)delegate { lbStatus.Text = "OP"; });
      btnConnect.Invoke((MethodInvoker)delegate { btnConnect.Text = "Disconnect"; });
   }
   .........
}

進度列:連接進度

進度列展示需長時間完成的之進度狀態,使用前需先初始化進度列的一些屬性,在此範例中使用變數 progressBar1 以代表該進度列。

Connect 中設定計時器以在進度列中使用,變數 t_ProcessBar 代表該計時器,點選連接鈕時將呼叫此計時器,t_ProcessBar_Tick 事件每 100 毫秒執行一次,當 KINGSTAR 子系統與硬體間的 EtherCAT 連結在建立時,進度方塊將重複在進度列中移動,移動速度將為 MarqueeAnimationSpeed 屬性設定的 30 毫秒。

private void btnConnect_Click(object sender, EventArgs e)
{
   .........
   progressBar1.MarqueeAnimationSpeed = 30;
   t_ProcessBar.Interval = 100;
   t_ProcessBar.Start();
   .........
}

我們使用 KSMStatus.State 以偵測狀態是否為 Op,若是,則 EtherCAT 連結即成功建立,而進度方塊的移動速度將設為零且計時器停止。

private void t_ProcessBar_Tick(object sender, EventArgs e)
{
   if (KSMStatus.State == EthercatState.ecatOP)
   {
      progressBar1.MarqueeAnimationSpeed = 0;
      t_ProcessBar.Stop();
   }
}