連接狀態與進度列
點擊 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 連結的狀態。KSMStatus 為 SubsystemStatus 類別之實例,含 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();
}
}