時間:2021-07-16 15:21:29來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹EtherCATé‹å‹•控制å¡ä¹‹ECI2828如何使用C#進行實時性程åºçš„é‹è¡Œå’Œè®€å¯«æŽ§åˆ¶ã€‚
  一ECI2828é‹å‹•控制å¡ç¡¬ä»¶ä»‹ç´¹
  ECI2828系列é‹å‹•æŽ§åˆ¶å¡æ”¯æŒå¤šé” 16 軸直線æ’補ã€ä»»æ„圓弧æ’補ã€ç©ºé–“圓弧ã€èžºæ—‹æ’補ã€é›»å凸輪ã€é›»å齒輪ã€åŒæ¥è·Ÿéš¨ã€è™›æ“¬è»¸å’Œæ©Ÿæ¢°æ‰‹æŒ‡ä»¤ç‰;采用優化的網絡通訊å”è°å¯ä»¥å¯¦ç¾å¯¦æ™‚çš„é‹å‹•控制。
  ECI2828系列é‹å‹•é‹å‹•æŽ§åˆ¶å¡æ”¯æŒä»¥å¤ªç¶²ï¼Œ232 通訊接å£å’Œé›»è…¦ç›¸é€£ï¼ŒæŽ¥æ”¶é›»è…¦çš„æŒ‡ä»¤é‹è¡Œï¼Œå¯ä»¥é€šéŽEtherCAT總線和CAN總線去連接å„個擴展模塊,從而擴展輸入輸出點數或é‹å‹•軸。
  ECI2828系列é‹å‹•控制å¡çš„æ‡‰ç”¨ç¨‹åºå¯ä»¥ä½¿ç”¨ VC,VB,VS,C++,C#ç‰è»Ÿä»¶ä¾†é–‹ç™¼ï¼Œç¨‹åºé‹è¡Œæ™‚需è¦å‹•態庫 zmotion.dll。調試時å¯ä»¥æŠŠZDevelopè»Ÿä»¶åŒæ™‚連接到控制器,從而方便調試,方便觀察。
  ECI2828系列典型連接é…置圖
  二C#語言進行é‹å‹•控制開發
  01新建WinFormé …ç›®å¹¶æ·»åŠ å‡½æ•¸åº«
  1.在VS2015èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’ â€œé …ç›®â€ï¼Œå•Ÿå‹•å‰µå»ºé …ç›®å‘導。
  2.鏿“‡é–‹ç™¼èªžè¨€ç‚ºâ€œVisual C#â€å’Œ.NET Framework 4以åŠWindows 窗體應用程åºã€‚
  3.æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料里é¢çš„C#函數庫,路徑如下(64ä½åº«ç‚ºä¾‹):
  A.é€²å…¥å» å•†æä¾›çš„光盤資料找到“8.PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  B.鏿“‡â€œå‡½æ•¸åº«2.1â€æ–‡ä»¶å¤¾ã€‚
  C.鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  D.æ ¹æ“šéœ€è¦é¸æ“‡å°æ‡‰çš„å‡½æ•¸åº«é€™é‡Œé¸æ“‡64ä½åº«ã€‚
  E.解壓C#的壓縮包,é‡Œé¢æœ‰C#å°æ‡‰çš„函數庫。
  F.函數庫具體路徑如下。
  4.å°‡å» å•†æä¾›çš„C#的庫文件以åŠç›¸é—œæ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®ä¸ã€‚
  A.å°‡zmcaux.csæ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®é‡Œé¢ä¸ã€‚
  B.å°‡zaux.dllå’Œzmotion.dll文件放入bin\debug文件夾ä¸ã€‚
  5.用vsæ‰“é–‹æ–°å»ºçš„é …ç›®æ–‡ä»¶ï¼Œåœ¨å³é‚Šçš„解決方案資æºç®¡ç†å™¨ä¸é»žæ“Šé¡¯ç¤ºæ‰€æœ‰ï¼Œç„¶åŽé¼ 標å³éµé»žæ“Šzmcaux.csæ–‡ä»¶ï¼Œé»žæ“ŠåŒ…æ‹¬åœ¨é …ç›®ä¸ã€‚
  6.雙擊Form1.cs里é¢çš„Form1,出ç¾ä»£ç¢¼ç·¨è¼¯ç•Œé¢ï¼Œåœ¨æ–‡ä»¶é–‹é 寫入 using cszmcaux,å¹¶è²æ˜ŽæŽ§åˆ¶å™¨å¥æŸ„g_handle。
  至æ¤é …目新建完æˆï¼Œå¯é€²è¡ŒC#é …ç›®é–‹ç™¼ã€‚
  02查看PC函數手冊
  A.PC函數手冊也在光盤資料里é¢ï¼Œå…·é«”路徑如下:“光盤資料\8.PC函數\函數庫2.1\ZMotion函數庫編程手冊 V2.1.pdfâ€ã€‚
  B.PC編程,一般如果網å£å°æŽ§åˆ¶å™¨å’Œå·¥æŽ§æ©Ÿé€²è¡ŒéˆæŽ¥ã€‚ç¶²å£éˆæŽ¥å‡½æ•¸æŽ¥å£æ˜¯ZAux_OpenEth();å¦‚æžœéˆæŽ¥æˆåŠŸï¼Œè©²æŽ¥å£æœƒè¿”å›žä¸€å€‹éˆæŽ¥å¥æŸ„ã€‚é€šéŽæ“ä½œé€™å€‹éˆæŽ¥å¥æŸ„å¯ä»¥å¯¦ç¾å°æŽ§åˆ¶å™¨çš„æŽ§åˆ¶ã€‚
  ZAux_OpenEth()接å£èªªæ˜Žï¼š
  C.使用å°ä¸‹ä½æ©Ÿå¯„å˜å™¨æ“作的指令æ“ä½œéˆæŽ¥å¥æŸ„“g_handleâ€ï¼Œå°æŽ§åˆ¶å™¨é€²è¡Œå¯„å˜å™¨å…§å®¹å–å€¼ï¼Œå¯¦æ™‚æŽ§åˆ¶ä¸‹ä½æ©Ÿç›¸é—œçš„æŒ‡ä»¤å¦‚下。
ã€€ã€€å¯¦æ™‚å…¨å±€è®Šé‡æŒ‡ä»¤ï¼š
  ZAux_Direct_HwPswitch2硬件比較輸出指令到ä½ç½®åŽç¡¬ä»¶è‡ªå‹•觸發op輸出信號:
  ZAux_Direct_HwTimer硬件定時器硬件比較輸出åŽä¸€æ®µæ™‚見還原電平:
  鎖å˜ç›¸é—œæŒ‡ä»¤ï¼š
  ZAux_Direct_Regist接收到指定信號輸入åŽç«‹å³éŽ–å˜ç•¶å‰ä½ç½®è¨˜éŒ„,R0,R1è¼¸å…¥ä¸€èˆ¬å°æ‡‰åˆ°è¼¸å…¥å£0å’Œ1:
  ZAux_Direct_GetMark判斷鎖å˜mark是å¦ç”¢ç”Ÿï¼š
  ZAux_Direct_GetMarkB判斷鎖å˜markB是å¦ç”¢ç”Ÿï¼š
  ZAux_Direct_GetRegPos 鎖å˜ä¿¡è™Ÿè§¸ç™¼æ™‚å饋ä½ç½®ï¼š
  ZAux_Direct_GetRegPosBç²å–R1類型鎖å˜å饋到的編碼器ä½ç½®ä½ç½®:
  硬件比較輸出相關功能:
單點觸發
多點觸發
  é‹å‹•控制器內有ä½ç½®æ¯”è¼ƒå–®å…ƒï¼Œç¡¬ä»¶æ¯”è¼ƒè¼¸å‡ºæ˜¯é€šéŽæ¯”較軸是å¦åˆ°é”è¨å®šä½ç½®ï¼Œä¾†æ“作輸出å£å‹•作,一般使用時將編碼器ä½ç½®èˆ‡è¨å®šä½ç½®æ¯”較,當編碼器的ä½ç½®åˆ°é”一個è¨å®šæ¯”較ä½ç½®æ™‚,觸發相應輸出å£é›»å¹³ç¿»è½‰ä¸€æ¬¡ã€‚
  如下圖所示,到é”è¨ç½®çš„ä½ç½®1,電平翻轉,到é”ä½ç½®2電平冿¬¡ç¿»è½‰ï¼Œåˆ°é”ä½ç½®3電平å†ç¿»è½‰ï¼Œç›´é”比較完所有的點åŽï¼Œé›»å¹³ç¶æŒæœ€åŽä¸€æ¬¡ç¿»è½‰åŽçš„狀態。
  03c#進行實時程åºçš„é‹è¡Œå’Œè®€å¯«æŽ§åˆ¶é–‹ç™¼
  1.實時程åºçš„é‹è¡Œå’Œè®€å¯«æŽ§åˆ¶é–‹ç™¼äººæ©Ÿäº¤äº’界é¢å¦‚下。
  2.例程功能介紹
  ä½ç½®æ¯”較輸出功能實ç¾ï¼š
  使用以下數據傳輸到控制器的table表ä¸ï¼Œç¡¬ä»¶æ¯”較輸出功能到ä½ç½®å°‡æœƒé¸æ“‡å°‡å°æ‡‰ä¿¡è™Ÿé€²è¡Œç¿»è½‰é”到硬件比較輸出的功能目的。
  ä½ç½®æ¯”è¼ƒè¼¸å‡ºåƒæ•¸è¨ç½®
  通éŽé€²è¡Œè¨ç½®æ¯”è¼ƒçš„è»¸è™Ÿï¼Œå°æ‡‰æ“作的輸出å£ç·¨è™Ÿï¼Œé€²è¡Œå‹•作,以起始點table寄å˜å™¨ç·¨è™Ÿå…§å®¹æ•¸æ“šåˆ°çµæŸé»žçš„編號內容數據,é‹å‹•åˆ°é”æ¯å€‹å°æ‡‰çš„æ•¸æ“šä½ç½®æ™‚將會進行翻轉電平。
  硬件定時器æ“作
  在硬件比較輸出功能æ“作åŽï¼Œå¯ä½¿ç”¨ç¡¬ä»¶å®šæ™‚å™¨åŠŸèƒ½ï¼Œé€²è¡Œå°æ‡‰è¨ç½®å‘¨æœŸæ™‚é–“å…§opå£ä¿¡è™Ÿçš„還原,ä¿è‰opå£ä¸å˜åœ¨é•·æ™‚間輸出信號的情æ³ã€‚
  狀態顯示
  PC定時器進行刷新當å‰ç²å–åˆ°æŽ§åˆ¶å™¨çš„åæ¨™ä»¥åŠæ“作的op輸出å£çš„狀態,顯示在界é¢ä¸Šï¼Œå¹¶è¨˜éŒ„鎖å˜è§¸ç™¼çš„æ¬¡æ•¸ã€‚
  é‹å‹•部分
  é¸å®šé‹å‹•çš„è·é›¢ï¼Œç¢ºä¿ä½ç½®æ¯”è¼ƒè¼¸å‡ºçš„åæ¨™æ•¸æ“šé»žåœ¨é‹å‹•范åœå…§ï¼Œå¯ä»¥è§¸ç™¼åˆ°å°æ‡‰çš„信號點并進行動作。
  編碼器鎖å˜
ã€€ã€€æŒ‡å®šéŽ–å˜æ¨¡å¼ä»¥åŠéŽ–å˜è»¸ï¼Œç•¶é‹å‹•åˆ°é”æ¯”較輸出ä½ç½®æ™‚op輸出信號到inå£ï¼Œè§¸ç™¼å°æ‡‰çš„ä¸Šå‡æ²¿æˆ–è€…ä¸‹é™æ²¿é€²è¡ŒéŽ–å˜ç•¶å‰ä½ç½®ï¼Œå¹¶å°‡ä½ç½®è¨˜éŒ„下來,顯示在當å‰ç•Œé¢ä¸Šã€‚
  3.例程簡易æµç¨‹åœ–。
  4.在Form1çš„æ§‹é€ å‡½æ•¸ä¸èª¿ç”¨æŽ¥å£ZAux_OpenEth(),使在系統åˆå§‹åŒ–çš„æ™‚å€™è‡ªå‹•éˆæŽ¥æŽ§åˆ¶å™¨ã€‚
  private void C_Open_Eth_Click(object sender, EventArgs e) //以太網連接控制器{ if (g_handle == (IntPtr)0) { C_Close_Card_Click(sender, e); //æ–·é–‹å‰é¢çš„連接 } zmcaux.ZAux_OpenEth(C_Ip_Address.Text, out g_handle); //ç¶²å£é€£æŽ¥æŽ§åˆ¶å™¨ if (g_handle != (IntPtr)0) { this.Text = "已連接"; timer1.Enabled = true; //C_Move_Axis_TextChanged(sender, e); }}
  5.通éŽå®šæ™‚器更新控制器軸狀態:當å‰å標ã€OP輸出狀態ç‰ç‰ã€‚
  private void timer1_Tick(object sender, EventArgs e) //刷新狀態顯示{ float AxisDpos = 0; int iret = 0; UInt32 Op_status = 0;
  updata_value(); if (RadioButton1.Checked == true) //ä½ç½®æ¯”較是å¦é–‹å•Ÿ m_POS_IfOpen = false; if (RadioButton2.Checked == true) m_POS_IfOpen = true; if (RadioButton4.Checked == true) //定時器輸出å轉是å¦é–‹å•Ÿ m_Timer_IfOpen = false; if (RadioButton3.Checked == true) m_Timer_IfOpen = true; iret = zmcaux.ZAux_Direct_GetDpos(g_handle, m_AxisNum, ref AxisDpos); iret = zmcaux.ZAux_Direct_GetOp(g_handle, m_POS_out, ref Op_status); label_dpos.Text = "軸" + m_AxisNum.ToString() + "忍™ï¼š " + AxisDpos.ToString(); op.BackColor = Color.Red; if (Op_status == 1) op.BackColor = Color.LimeGreen;
  }
  6.è¨ç½®æ¯”較點ä½ç½®å¹¶é¸æ“‡å•Ÿç”¨ç¡¬ä»¶æ¯”較輸出以åŠç¡¬ä»¶å®šæ™‚器并開始進行é‹å‹•:
  private void Button2_Click(object sender, EventArgs e) //é‹å‹•{ if (g_handle == (IntPtr)0) { MessageBox.Show("æœªéˆæŽ¥åˆ°æŽ§åˆ¶å™¨!", "æç¤º"); return; } int iret = 0; iret = zmcaux.ZAux_Direct_SetUnits(g_handle, m_AxisNum, 100); iret = zmcaux.ZAux_Direct_SetSpeed(g_handle, m_AxisNum, 100); iret = zmcaux.ZAux_Direct_SetAccel(g_handle, m_AxisNum, 2000); iret = zmcaux.ZAux_Direct_HwPswitch2(g_handle, m_AxisNum, 2, 0, 0, 0, 0, 0, 0); //清除å‰é¢çš„æ¯”較輸出指令 if (m_POS_IfOpen == false) //比較完æˆä¸€æ¬¡åŽéœ€è¦é‡æ–°èª¿ç”¨HwPswitch { iret = zmcaux.ZAux_Direct_SetTable(g_handle, m_POS_StartTable, m_POS_EndTable, fPointPos); //將比較點填入TABLE if (iret != 0) { string tempstr; tempstr = "SetTable失敗 返回值:" + iret.ToString(); MessageBox.Show(tempstr, "æç¤º"); return; } iret = zmcaux.ZAux_Direct_HwPswitch2(g_handle, m_AxisNum, 1, m_POS_out, m_POS_OutStatus, m_POS_StartTable, m_POS_EndTable, m_PSO_dir, 0); if (iret != 0) { string tempstr; tempstr = "HwPswitch2失敗 返回值:" + iret.ToString(); MessageBox.Show(tempstr, "æç¤º"); return; } } else { iret = 0; iret = zmcaux.ZAux_Direct_HwPswitch2(g_handle, m_AxisNum, 2, 0, 0, 0, 0, 0, 0); //清除比較輸出指令 if (iret != 0) { string tempstr; tempstr = "HwPswitch2失敗 返回值:" + iret.ToString(); MessageBox.Show(tempstr, "æç¤º"); return; } }
  int tempoutstatus = 0; if (m_POS_OutStatus == 0) tempoutstatus = 1; else tempoutstatus = 0; if (m_Timer_IfOpen == false) { iret = zmcaux.ZAux_Direct_HwTimer(g_handle, 2, m_Timer_Cycle, m_Timer_Valid, m_Timer_Num, tempoutstatus, m_POS_out); if (iret != 0) { string tempstr; tempstr = "HwTimer失敗 返回值:" + iret.ToString(); MessageBox.Show(tempstr, "æç¤º"); //return; } } else { iret = zmcaux.ZAux_Direct_HwTimer(g_handle, 0, m_Timer_Cycle, m_Timer_Valid, m_Timer_Num, tempoutstatus, m_POS_out); if (iret != 0) { string tempstr; tempstr = "HwTimer失敗 返回值:" + iret.ToString(); MessageBox.Show(tempstr, "æç¤º"); //return; } } zmcaux.ZAux_Trigger(g_handle); iret = zmcaux.ZAux_Direct_SetDpos(g_handle, m_AxisNum, 0); iret = zmcaux.ZAux_Direct_Single_MoveAbs(g_handle, m_AxisNum, m_Start_Pos); iret = zmcaux.ZAux_Direct_Single_MoveAbs(g_handle, m_AxisNum, m_End_Pos);
  }
  7.鏿“‡éŽ–å˜æ¨¡å¼ä»¥åŠéŽ–å˜è»¸ä½ç½®å•Ÿç”¨éŽ–å˜ã€‚
  private void Button1_Click(object sender, EventArgs e) //啟動鎖å˜{ if (g_handle == (IntPtr)0) { MessageBox.Show("æœªéˆæŽ¥åˆ°æŽ§åˆ¶å™¨!", "æç¤º"); return; } int iret = 0; if (m_Regist_IfOpen == false) { m_RegistCount = 0; iret = zmcaux.ZAux_Direct_SetAtype(g_handle, m_RegistAxis, 4); //å¿…é ˆæ˜¯ç·¨ç¢¼å™¨è»¸æ‰å¯ä»¥ int ReglistListSel = ComboBox1.SelectedIndex; if (ReglistListSel >= 0 && ReglistListSel <= 3) { RegistMode = ReglistListSel + 1; } else if (ReglistListSel == 4 || ReglistListSel == 5) { RegistMode = 10 + ReglistListSel; } else if (ReglistListSel > 5 || ReglistListSel < 9) { RegistMode = 12 + ReglistListSel; } iret = zmcaux.ZAux_Direct_Regist(g_handle, m_RegistAxis, RegistMode); timer2.Start();
  m_Regist_IfOpen = true; ComboBox1.Enabled = false; Button1.Text = "åœæ¢éŽ–å˜";
  } else { timer2.Stop(); m_Regist_IfOpen = false; ComboBox1.Enabled = true; Button1.Text = "啟動鎖å˜"; DataGridView2.Rows.Clear(); }}
  8.å®šæ™‚å™¨å®šæ™‚åˆ¤æ–·ç•¶å‰æ˜¯å¦è§¸ç™¼éŽ–å˜ç‹€æ…‹ï¼Œå¹¶å°‡éŽ–å˜ä½ç½®è®€å–出來并顯示在界é¢ä¸Šã€‚
  private void timer2_Tick(object sender, EventArgs e) //定時器刷新{ int iret = 0; int MarkStatus = 0; float RegistPos=0; if(RegistMode >= 0 && RegistMode <= 4) { iret = zmcaux.ZAux_Direct_GetMark(g_handle,m_RegistAxis,ref MarkStatus); } else if(RegistMode >= 14 || RegistMode < 16) { iret = zmcaux.ZAux_Direct_GetMarkB(g_handle, m_RegistAxis, ref MarkStatus); } else if(RegistMode >= 18 || RegistMode < 20) { float tempc=0; iret = zmcaux.ZAux_Direct_GetParam(g_handle, "MARKC", m_RegistAxis, ref tempc); MarkStatus = (int)tempc; } else if(RegistMode >= 20 || RegistMode < 22) { float tempd=0; iret = zmcaux.ZAux_Direct_GetParam(g_handle, "MARKD", m_RegistAxis, ref tempd); MarkStatus = (int)tempd; }
  if (MarkStatus == -1) { if (RegistMode >= 0 && RegistMode <= 4) { iret = zmcaux.ZAux_Direct_GetRegPos(g_handle, m_RegistAxis, ref RegistPos); //ç²å–鎖å˜ä½ç½® } else if (RegistMode >= 14 || RegistMode < 16) { iret = zmcaux.ZAux_Direct_GetRegPosB(g_handle, m_RegistAxis, ref RegistPos); } else if (RegistMode >= 18 || RegistMode < 20) { iret = zmcaux.ZAux_Direct_GetParam(g_handle, "REG_POSC", m_RegistAxis, ref RegistPos); } else if (RegistMode >= 20 || RegistMode < 22) { iret = zmcaux.ZAux_Direct_GetParam(g_handle, "REG_POSD", m_RegistAxis, ref RegistPos); } string[] tempstr = new string[2]; tempstr[0] = m_RegistCount.ToString(); tempstr[1] = RegistPos.ToString(); DataGridView2.Rows.Add(tempstr); m_RegistCount = m_RegistCount + 1; iret = zmcaux.ZAux_Direct_Regist(g_handle, m_RegistAxis, RegistMode); //釿–°è§¸ç™¼éŽ–å˜ } string temps; temps = "鎖å˜è§¸ç™¼ç‹€æ…‹ï¼š" + MarkStatus.ToString() + " 次數: " + m_RegistCount.ToString(); Label3.Text = temps; }
  }
  04調試與監控
  編è¯é‹è¡Œä¾‹ç¨‹ï¼ŒåŒæ™‚連接ZDevelop軟件進行調試,å°é‹å‹•æŽ§åˆ¶çš„è»¸åƒæ•¸å’Œé‹å‹•情æ³é€²è¡Œç›£æŽ§ã€‚
  1.ä½ç½®æ¯”較功能
  通éŽç•Œé¢ä¸Šçš„ä½ç½®æ¯”較輸出功能以åŠå°æ‡‰çš„ä½ç½®è¡¨ï¼Œåœ¨æŒ‡å®šä½ç½®å°‡æœƒå°ä¿¡è™Ÿå£é›»å¹³é€²è¡Œç¿»è½‰ï¼Œå¦‚圖示波器所示ä½ç½®ã€‚
  2.硬件定時器功能
ã€€ã€€ç¡¬ä»¶å®šæ™‚å™¨ä¸»è¦æ˜¯ç”¨äºŽç¡¬ä»¶æ¯”較輸出åŽä¸€æ®µæ™‚é–“åŽé‚„原電平,å¯ä»¥ç”¨äºŽä¿è‰è¼¸å‡ºå£çš„狀態輸出時間,控制輸出時間長çŸã€‚
  3.編碼器鎖å˜åŠŸèƒ½
  開啟鎖å˜åŠŸèƒ½ï¼Œå°æ‡‰è¼¸å…¥å£æŽ¥æ”¶åˆ°ä¿¡è™Ÿçš„åŒæ™‚將會鎖å˜ç•¶å‰ä½ç½®çš„mpos大å°ï¼Œå¹¶å°‡è®€å–åˆ°çš„å°æ‡‰å…§å®¹é¡¯ç¤ºåˆ°ç•Œé¢ä¸Šã€‚
ã€€ã€€éŽ–å˜æ¨¡å¼3:R0ä¸Šå‡æ²¿è§¸ç™¼(默èªRO信號å£ç‚ºin0)
  如圖:外部輸入å£IN由導通狀態進入截æ¢ç‹€æ…‹çš„一瞬間觸發,ä½ç½®é€²è¡Œè¨˜éŒ„é¡¯ç¤ºåœ¨è¡¨æ ¼ä¸ã€‚
ã€€ã€€éŽ–å˜æ¨¡å¼4:R0䏋陿²¿è§¸ç™¼(默èªRO信號å£ç‚ºin0)
  如圖:當外部輸入å£ç”±æˆªæ¢ç‹€æ…‹é€²å…¥å°Žé€šç‹€æ…‹çš„一瞬間觸發,ä½ç½®é€²è¡Œè¨˜éŒ„é¡¯ç¤ºåœ¨è¡¨æ ¼ä¸ã€‚
æ¼”ç¤ºè¦–é »
本次,æ£é‹å‹•技術EtherCATé‹å‹•控制å¡çš„IO動作與é‹å‹•æŽ§åˆ¶çš„åŒæ¥ï¼Œå°±åˆ†äº«åˆ°é€™é‡Œã€‚
  本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
ä¸Šä¸€ç¯‡ï¼šã€æ£é‹å‹•】ZBasicçµåˆQt實ç¾...
下一篇:利用人工智能ã€ç‰©è¯ç¶²å‚³æ„Ÿå™¨...
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊