熟女人妻水多爽中文字幕,国产精品鲁鲁鲁,隔壁的少妇2做爰韩国电影,亚洲最大中文字幕无码网站

技術頻道

娓娓工業
您現在的位置: 中國傳動網 > 技術頻道 > 技術百科 > 運動控制卡周期上報實時數據IO狀態之C++篇

運動控制卡周期上報實時數據IO狀態之C++篇

時間:2024-12-19 15:08:38來源:深圳市正運動技術有限公司

導語:?正運動小助手為大家分享一下運動控制卡周期上報,通過提前設置經常讀取的參數主動周期上報,可以減少PC主動輪詢的時間。此次介紹將以ECI2A18B為例,主要講解如何使用C++編程語言來進行周期上報函數的編寫和功能的開發。

  今天,正運動小助手為大家分享一下運動控制卡周期上報,通過提前設置經常讀取的參數主動周期上報,可以減少PC主動輪詢的時間。此次介紹將以ECI2A18B為例,主要講解如何使用C++編程語言來進行周期上報函數的編寫和功能的開發。

  01、ECI2A18B控制卡硬件介紹

  ECI2A18B經濟型多軸運動控制卡是一款脈沖型、模塊化的網絡型運動控制卡?刂瓶ū旧碜疃嘀С10軸,用以實現直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機械手指令等簡單的軌跡控制需求;采用優化的網絡通訊協議可以實現實時的運動控制。

運動控制

  ECI2A18B控制卡功能特點:

  (1)本身支持6差分脈沖軸+4單端脈沖軸運動控制,最多可擴展至12軸運動控制。

  (2)脈沖輸出模式:脈沖/方向或雙脈沖。

  (3)AXIS接口支持編碼器位置測量,可以配置為手輪輸入模式。

  (4)專用的手輪輸入接口。

  (5)每軸最大輸出脈沖頻率10MHz。

  (6)通過CAN總線,最多可擴展到256個隔離輸入口和256個隔離輸出口。

  (7)軸正負限位信號口/原點信號口可以隨意配置到任何輸入口。

  (8)通用數字輸出口最大輸出電流可達500mA,可直接驅動部分電磁閥。

  (9)RS232接口、以太網接口、CAN接口。

  (10)支持最多達12軸直線插補、任意圓弧插補、螺旋插補。

  (11)支持點位運動、電子凸輪、直線插補、圓弧插補、連續插補運動、機械手指令。

  (12)支持Basic多文件多任務編程。

  (13)多種程序加密手段,保護客戶的知識產權。

運動控制

  接口定義:

運動控制

  ECI2000系列經濟型多軸運動控制卡可用于電子半導體設備(檢測類設備、組裝類設備、鎖附類設備、焊錫機)、點膠設備和流水線等12軸以內脈沖應用場合。

  控制器支持windows、linux、Mac、Android、wince各種操作系統下的開發,提供vc、c#、vb.net、labview等各種環境的dll庫,如下圖。上位機軟件編程參考《ZMotion PC函數庫編程手冊》。

運動控制

  02、為什么要進行周期上報,作用是什么?

  1、當PC主動輪詢的次數過多時,可能會導致以下問題:

  (1)消耗系統資源

  輪詢會使系統資源消耗增加,無論是任務輪詢或定時器輪詢,都會消耗系統的部分資源。在多用戶或者資源受限的環境里,這極有可能致使系統性能下滑。

  (2)浪費CPU資源

  只要是輪詢都會造成CPU資源的浪費。這是因為輪詢會會在系統內不間斷的運行,不論當前設備的狀態是否有改變。實際上,設備的諸多狀態并不經常改變,輪詢空轉只會無端消耗CPU的時間。

  (3)影響電源管理

  向PC報告外圍設備次數增多會使功耗提高,這可能縮短電池壽命或增加能源消耗,從而影響電源管理。

  (4)降低響應速度

  如果輪詢頻率過高,系統響應其他任務的速度或許會變慢。造成原因是由于CPU會不間斷的輪詢當前狀態,從而響應處理其他計算或與用戶交互任務會減慢。

  (5)網絡負載增加

  若輪詢涉及網絡通信,輪詢請求過多就可能加大網絡負載,造成網絡擁堵或者延遲加劇。

  (6)服務器壓力增大

  在客戶端服務器架構里,要是頻繁進行輪詢請求,就可能給服務器帶來壓力。主要集中在在服務器資源不足時,也許會使服務質量降低或者出現請求超時的情況。

  2、多種獲取方式對于程序運行占比的區別:

  在探討單條獲取、多條獲取以及周期性獲取對程序運行產生的影響時,我們需要考量這些操作的特性以及它們對程序整體性能可能存在的潛在影響。

  (1)單條獲取

  單條獲取即程序每次僅處理一個單獨的數據項。此方式簡單直接,然而處理大量數據時效率不高,因為每次操作都會有上下文切換與資源管理方面的開銷。此時,程序運行時間主要耗費在數據處理上。

  (2)多條獲取

  多條獲取意味著同時處理多個數據項。在現代計算機系統里,常借助多線程或者并發技術達成這一操作,這樣做能大幅提升數據處理的吞吐量。不過,多線程雖有好處,卻可能被鎖爭、內存競爭和上下文切換等問題所抵消。所以,多條獲取也許會縮短單個數據項處理的相對運行時間,但總體運行時間能否減少取決于多線程優化的成效。

  (3)周期性獲取

  周期獲取即按照固定的時間間隔重復開展數據獲取操作。在諸如實時監控系統、定時任務這類需要定期更新數據狀態的應用場景中較為常見。其運行時間占比由任務的周期性和每個周期內實際工作量決定。若周期性任務負載較輕,則對程序整體運行時間影響不大。

  應用場合:在實際應用里,具體的應用場景、數據特性以及性能要求決定了選擇何種數據獲取策略。比如,若程序要對單個事件快速響應,單條獲取或許更合適;要是旨在使數據處理速度最大化,多條獲取可能更有利;而對于那些需要定期保持數據新鮮度的應用而言,周期性獲取則不可或缺。

  03、新建MFC項目并添加函數庫

  1、首先打開Visual Studio 2022,點擊創建新項目。

運動控制

  2、選擇開發語言為“Visual C++”和程序類型“MFC應用程序”。

運動控制

  3、點擊下一步即可。

運動控制

  4、選擇類型為“基于對話框”,下一步或者完成。

運動控制

  5、前往正運動官網下載PC函數庫,路徑如下(本文采用64位函數庫為例)。

  (1)進入官網,選擇支持與服務,打開下載中心選擇庫文件,就能找到所有的PC函數庫。

運動控制

  (2)點擊下載Windows C++(64位),可按需求另存為想要保存的路徑下。

運動控制

  (3)函數庫另存為具體路徑如下。

運動控制

  6、將廠商提供的C++庫文件和相關頭文件復制到新建的項目里。

運動控制

  7、在項目中添加靜態庫和相關頭文件。

  (1)先右擊項目文件,接著依次選擇:“添加”→“現有項”。

運動控制

  (2)在彈出的窗口中依次添加靜態庫和相關頭文件。

運動控制

  8、聲明用到的頭文件和定義控制器連接句柄。

運動控制

  至此項目新建完成,可進行MFC項目開發。

  04、查看PC函數手冊,熟悉相關函數接口

  1、PC函數手冊也可以在正運動官網“支持與服務”→“下載中心”→“編程手冊”中找到。

運動控制

  2、鏈接控制器,獲取鏈接句柄。

運動控制

  3、控制器自動上報相關指令。

運動控制

  4、讀取數字輸入輸出相關指令。

運動控制

  5、讀取Modbus寄存器相關指令。

運動控制

  05、MFC實現軸的周期上報

  1、例程界面如下。

運動控制

  2、通過下拉控件選擇連接控制器/控制卡連接方式。

  ·

  BOOL CTest_CycleUpDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); // 將“關于...”菜單項添加到系統菜單中。 // IDM_ABOUTBOX 必須在系統命令范圍內。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if(pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,strAboutMenu); } } // 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動 // 執行此操作 SetIcon(m_hIcon, TRUE); // 設置大圖標 SetIcon(m_hIcon, FALSE); // 設置小圖標 // TODO: 在此添加額外的初始化代碼 GetDlgItem(IDC_COMBO2)->SetWindowTextA("網口\n"); CComboBox *connetList; connetList = (CComboBox *)GetDlgItem(IDC_COMBO2); connetList->AddString(_T("網口\n")); connetList->AddString(_T("LOCAL\n")); connetList->AddString(_T("PCI\n")); connetList->AddString(_T("串口\n")); return TRUE; // 除非將焦點設置到控件,否則返回 TRUE}

  3、自動搜索IP。

  ·

  void CTest_CycleUpDlg::OnCbnDropdownCombo1(){ char Buffer[256]; CTest_CycleUpDlg* pDlg = (CTest_CycleUpDlg*)AfxGetMainWnd(); GetDlgItemText(IDC_COMBO2,Buffer,256); Buffer[255] = '\0'; if(0==strcmp(Buffer,"串口\n")) { Com_SCAN(pDlg); } else if(0==strcmp(Buffer,"網口\n")) { IP_SCAN(pDlg); } else if(0==strcmp(Buffer,"PCI\n")) { PCI_SCAN(pDlg); } else if(0==strcmp(Buffer,"LOCAL\n")) { CComboBox *m_pEthList; m_pEthList = (CComboBox *)GetDlgItem(IDC_COMBO1); m_pEthList->ResetContent(); m_pEthList->AddString(_T("LOCAL1\n")); }else { CString str; MessageBox("請選擇正確的鏈接類型!"); return; } return;}

運動控制

  4、開啟上報。

運動控制

  ·

  //開啟關閉上報void CTest_CycleUpDlg::OnBnClickedCheckStart(){ if(NULL == G_ZmcHandle) { MessageBox(_T("控制器未連接")); return; } CString tempstr; UpdateData(true); int iret = 0; if(m_If_StartUp) //開啟上報 { GetCycleStr(); iret = ZAux_CycleUpEnable(G_ZmcHandle,m_CyclePort,m_CycleTime,Str_CycleCmd); if(ERR_SUCCESS != iret) { tempstr.Format("周期上報打開失敗!錯誤碼:%d 命令:%s\r\n",iret,Str_CycleCmd); AppendTextOut(tempstr); return; } tempstr.Format("周期上報開始!命令:%s\r\n",Str_CycleCmd); AppendTextOut(tempstr); ifirsttimeus = GetTickCount(); SetTimer(1,1,NULL); } else { m_CycleCount = ZAux_CycleUpGetRecvTimes(G_ZmcHandle,m_CyclePort); iret = ZAux_CycleUpDisable(G_ZmcHandle,m_CyclePort); if(ERR_SUCCESS != iret) { tempstr.Format("周期上報關閉失敗!錯誤碼:%d \r\n",iret); AppendTextOut(tempstr); return; } tempstr.Format("周期上報關閉-上報用時:%dms, 上報次數:%d ,平均時間:%.3fms\r\n",(GetTickCount() - ifirsttimeus),m_CycleCount,(float)(GetTickCount() - ifirsttimeus)/m_CycleCount); AppendTextOut(tempstr); KillTimer(1); }}

  5、選擇獲取參數類型和起始地址及數量。

運動控制

  ·

  //獲取上報參數void CTest_CycleUpDlg::GetCycleStr(){ memset(Str_CycleCmd,0,sizeof(Str_CycleCmd)); CString TempString = ""; int ilen = 0; if(m_CycleParaEnAble[0]) { switch(m_CyclePara[0]) { case 0: //AXISSTATUS TempString.Format("AXISSTATUS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 1: //DPOS TempString.Format("DPOS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 2: //IDLE TempString.Format("IDLE(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 3: //IN TempString.Format("IN(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 4: //MODBUS_REG TempString.Format("MODBUS_REG(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 5: //MPOS TempString.Format("MPOS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 6: //OP TempString.Format("OP(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; case 7: //TABLE TempString.Format("TABLE(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]); break; default: break; } } ilen += TempString.GetLength(); memcpy(Str_CycleCmd,TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR)); if(m_CycleParaEnAble[1]) { switch(m_CyclePara[1]) { case 0: //AXISSTATUS TempString.Format("AXISSTATUS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 1: //DPOS TempString.Format("DPOS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 2: //IDLE TempString.Format("IDLE(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 3: //IN TempString.Format("IN(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 4: //MODBUS_REG TempString.Format("MODBUS_REG(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 5: //MPOS TempString.Format("MPOS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 6: //OP TempString.Format("OP(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; case 7: //TABLE TempString.Format("TABLE(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]); break; default: break; } } if((ilen + TempString.GetLength()) < 1000) { memcpy(&Str_CycleCmd[ilen],TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR)); ilen += TempString.GetLength(); } if(m_CycleParaEnAble[2]) { switch(m_CyclePara[2]) { case 0: //AXISSTATUS TempString.Format("AXISSTATUS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 1: //DPOS TempString.Format("DPOS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 2: //IDLE TempString.Format("IDLE(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 3: //IN TempString.Format("IN(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 4: //MODBUS_REG TempString.Format("MODBUS_REG(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 5: //MPOS TempString.Format("MPOS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 6: //OP TempString.Format("OP(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; case 7: //TABLE TempString.Format("TABLE(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]); break; default: break; } } if((ilen + TempString.GetLength()) < 1000) { memcpy(&Str_CycleCmd[ilen],TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR)); ilen += TempString.GetLength(); }}

  6、獲取上報結果并輸出。

運動控制

  ·

  //獲取上報結果void CTest_CycleUpDlg::GetCycleInfo(){ CString ParaString = ""; CString TempString = ""; CString ShowString = ""; int iret = 0; int ival = 0; for(int inum=0;inum<3;inum++) { ShowString =""; if(m_CycleParaEnAble[inum]) { switch(m_CyclePara[inum]) { case 0: //AXISSTATUS ParaString = "AXISSTATUS"; break; case 1: //DPOS ParaString = "DPOS"; break; case 2: //IDLE ParaString = "IDLE"; break; case 3: //IN ParaString = "IN"; break; case 4: //MODBUS_REG ParaString = "MODBUS_REG"; break; case 5: //MPOS ParaString = "MPOS"; break; case 6: //OP ParaString = "OP"; break; case 7: //TABLE ParaString = "TABLE"; break; default: break; } ShowString += ParaString; for(int i =0;i

  7、強制上報一次。

  ·

  //強制上報一次void CTest_CycleUpDlg::OnBnClickedBtnCycleup(){ if(NULL == G_ZmcHandle) { MessageBox(_T("控制器未連接")); return; } UpdateData(true); int iret = ZAux_CycleUpForceOnce(G_ZmcHandle, m_CyclePort); if(ERR_SUCCESS != iret) { MessageBox(_T("周期上報刷新失敗!")); return; }}

  8、使用正運動RTSys軟件輸出窗口和軸參數窗口方便直接的觀察到我們周期上報的數值。

運動控制

  9、上位機讀取周期上報的值并輸入在文本框。

運動控制

  10、可以點擊下拉框選擇其他參數或更改起始地址及數量讀取不同區域數據。

運動控制

  11、周期上報獲取信息和單次獲取信息的比較。

運動控制

完整代碼獲取地址

運動控制

  本次,正運動運動控制卡周期上報實時數據IO狀態之C++篇就分享到這里。

  更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。

  本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。

標簽: 正運動運動控制

點贊

分享到:

上一篇:工業領域中,壓力傳感器是如...

下一篇:采用物聯網能源效率解決方案...

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網站簡介|會員服務|聯系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業自動化與智能制造的全媒體“互聯網+”創新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業執照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號

主站蜘蛛池模板: 沙坪坝区| 九台市| 嫩江县| 连山| 香河县| 繁昌县| 枣庄市| 苏尼特左旗| 扶沟县| 玛纳斯县| 安阳县| 潮州市| 崇明县| 临夏县| 磴口县| 枞阳县| 淮南市| 盘锦市| 红桥区| 沁水县| 南汇区| 泸定县| 肇东市| 镇原县| 太湖县| 招远市| 清苑县| 海安县| 濮阳市| 丘北县| 拉萨市| 武功县| 阿巴嘎旗| 怀安县| 伊川县| 五河县| 沧源| 蒙山县| 克山县| 淮阳县| 吉林省|