時間:2023-02-10 17:17:11來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹é‹å‹•控制å¡ä¹‹ECIO系列IOå¡çš„用法,C#語言進行ECI IOå¡çš„é–‹ç™¼ä»¥åŠæ¸¬è©¦å¤šå€‹IO讀寫的交互速度。
  01ã€ECI0032/ECI0064 IOå¡çš„硬件介紹
  1.功能介紹
  ECI0032/ECI0064ç‰ECI0系列é‹å‹•æŽ§åˆ¶å¡æ”¯æŒä»¥å¤ªç¶²ã€RS232通訊接å£å’Œé›»è…¦ç›¸é€£ï¼ŒæŽ¥æ”¶é›»è…¦çš„æŒ‡ä»¤é‹è¡Œï¼Œå¯ä»¥é€šéŽCAN總線連接å„個擴展模塊,從而擴展輸入輸出點數。
ECI0032 IO控制å¡
ECI0064 IO控制å¡
  ECI0032/ECI0064ç‰ECI0系列采用了優化的網絡通訊å”è°ï¼Œå¯ä»¥å¯¦ç¾å¯¦æ™‚çš„é‚輯控制和IO狀態的監控。
  ECI0032/ECI0064ç‰ECI0系列IOå¡çš„æ‡‰ç”¨ç¨‹åºå¯ä»¥ä½¿ç”¨VC,VB,VS,C++,C#ç‰è»Ÿä»¶é–‹ç™¼ï¼Œç¨‹åºé‹è¡Œæ™‚需è¦å‹•態庫zmotion.dll,調試時å¯ä»¥å°‡ZDevelopè»Ÿä»¶åŒæ™‚é€£æŽ¥æŽ§åˆ¶å™¨ï¼Œå¾žè€Œæ–¹ä¾¿èª¿è©¦ã€æ–¹ä¾¿è§€å¯Ÿã€‚
ECI0032系統架構圖
ECI0064系統架構圖
  2.硬件接å£
通用輸入å£é›»è·¯åœ–
é€šç”¨è¼¸å…¥å£æŽ¥ç·šåƒè€ƒåœ–
通用輸出å£é›»è·¯åœ–
é€šç”¨è¼¸å‡ºå£æŽ¥ç·šåƒè€ƒåœ–
  3.控制器基本信æ¯
  02C#語言進行ECI IOå¡çš„開發
  (一)新建WinFormé …ç›®å¹¶æ·»åŠ å‡½æ•¸åº«
  1.在VS2015èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’â€œé …ç›®â€ï¼Œå•Ÿå‹•å‰µå»ºé …ç›®å‘導。
  2.鏿“‡é–‹ç™¼èªžè¨€ç‚ºâ€œVisual C#â€å’Œ.NET Framework 4以åŠWindows窗體應用程åºã€‚
  3.æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料里é¢çš„C#函數庫,路徑如下(64ä½åº«ç‚ºä¾‹)。
  1)é€²å…¥å» å•†æä¾›çš„光盤資料找到“8.PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  2)鏿“‡â€œå‡½æ•¸åº«2.1â€æ–‡ä»¶å¤¾ã€‚
  3)鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  4)æ ¹æ“šéœ€è¦é¸æ“‡å°æ‡‰çš„å‡½æ•¸åº«ï¼Œé€™é‡Œé¸æ“‡64ä½åº«ã€‚
  5)解壓C#壓縮包,é‡Œé¢æœ‰C#å°æ‡‰çš„函數庫。
  6)函數庫具體路徑如下。
  4.å°‡å» å•†æä¾›çš„C#的庫文件以åŠç›¸é—œæ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®ä¸ã€‚
  1)å°‡zmcaux.csæ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®é‡Œé¢ä¸ã€‚
  2)å°‡zaux.dllå’Œzmotion.dll文件放入bin\debug文件夾ä¸ã€‚
  5.用vsæ‰“é–‹æ–°å»ºçš„é …ç›®æ–‡ä»¶ï¼Œåœ¨å³é‚Šçš„解決方案資æºç®¡ç†å™¨ä¸é»žæ“Šé¡¯ç¤ºæ‰€æœ‰æ–‡ä»¶ï¼Œç„¶åŽé¼ æ¨™å³æ“Šzmcaux.csæ–‡ä»¶ï¼Œé»žæ“ŠåŒ…æ‹¬åœ¨é …ç›®ä¸ã€‚
  6.雙擊Form1.cs里é¢çš„Form1,出ç¾ä»£ç¢¼ç·¨è¼¯ç•Œé¢ï¼Œåœ¨æ–‡ä»¶é–‹é 寫入using cszmcauxï¼Œå¹¶è²æ˜ŽæŽ§åˆ¶å™¨å¥æŸ„g_handle。
  7.至æ¤ï¼Œé …目新建完æˆï¼Œå¯é€²è¡ŒC#é …ç›®é–‹ç™¼ã€‚
  (二)PC函數介紹
1.PC函數手冊å¯åœ¨å…‰ç›¤è³‡æ–™æŸ¥çœ‹ï¼Œå…·é«”路徑如下。
  2.éˆæŽ¥æŽ§åˆ¶å™¨ï¼Œç²å–éˆæŽ¥å¥æŸ„。
  3.快速讀å–多個輸入å£ç•¶å‰ç‹€æ…‹æŽ¥å£èªªæ˜Žã€‚
  4.快速讀å–多個輸出å£ç•¶å‰ç‹€æ…‹æŽ¥å£èªªæ˜Žã€‚
  03ã€C#快速讀å–多個IO狀態的測試例程
  1.例程界é¢
  2.相關代碼
ã€€ã€€â‘ éˆæŽ¥æŒ‰éˆ•çš„äº‹ä»¶è™•ç†å‡½æ•¸ä¸èª¿ç”¨éˆæŽ¥æŽ§åˆ¶å™¨çš„æŽ¥å£å‡½æ•¸ZAux_OpenEth()ï¼Œèˆ‡æŽ§åˆ¶å™¨é€²è¡ŒéˆæŽ¥,éˆæŽ¥æˆåŠŸåŽå•Ÿå‹•定時器1監控控制器的IO狀態。
  ·
  //éˆæŽ¥æŽ§åˆ¶å™¨private void LinkButton_Click(object sender, EventArgs e){ zmcaux.ZAux_OpenEth(IP_comboBox.Text, out g_handle); if (g_handle != (IntPtr)0) { // MessageBox.Show("æŽ§åˆ¶å™¨éˆæŽ¥æˆåŠŸ!", "æç¤º"); timer1.Enabled = true; LinkButton.BackColor = Color.FromArgb(200, 255, 200); } else { MessageBox.Show("æŽ§åˆ¶å™¨éˆæŽ¥å¤±æ•—ï¼Œè«‹æª¢æ¸¬IP地å€!", "è¦å‘Š"); LinkButton.BackColor = Color.FromArgb(255, 200, 200); }}
  ②通éŽå®šæ™‚器1監控控制器的IO狀態。
  ·
  //定時器更新IOä¿¡æ¯private void timer1_Tick(object sender, EventArgs e){ int j, k; int TestNum = 50; //快速讀å–輸入å£ç‹€æ…‹æŽ¥å£æ™‚間測試 byte[] InState = new byte[4]; DateTime beforeDT = System.DateTime.Now; for (int count = 0; count < TestNum; count++) { zmcaux.ZAux_GetModbusIn(g_handle, 0, 32, InState); for (int i = 0; i < 32; i++) { j = i / 8; k = i % 8; if (((InState[j] >> k) & 1) == 1) { InStatus[i].BackColor = Color.FromArgb(200, 255, 200); } else { InStatus[i].BackColor = Color.FromArgb(255, 200, 200); } } } DateTime afterDT = System.DateTime.Now; //計算beforeDT與afterDT的時間差 TimeSpan ts = afterDT - beforeDT; InMoitoring.Text = "輸入å£ç›£æŽ§_刷新時間: " + (ts.TotalMilliseconds * 1000 / TestNum).ToString() + " us "; //快速讀å–輸出å£ç‹€æ…‹æŽ¥å£æ™‚間測試 byte[] OutState = new byte[4]; DateTime beforeDTOP = System.DateTime.Now; for (int count = 0; count < TestNum; count++) { zmcaux.ZAux_GetModbusOut(g_handle, 0, 32, OutState); for (int i = 0; i < 32; i++) { j = i / 8; k = i % 8; if (((OutState[j] >> k) & 1) == 1) { OutStatus[i].BackColor = Color.FromArgb(200, 255, 200); } else { OutStatus[i].BackColor = Color.FromArgb(255, 200, 200); } } } DateTime afterDTOP = System.DateTime.Now; //計算beforeDTOP與afterDTOP的時間差 ts = afterDTOP - beforeDTOP; OutMoitoring.Text = "輸出å£ç›£æŽ§_刷新時間: " + (ts.TotalMilliseconds * 1000 / TestNum).ToString() + " us ";}
  ③多個輸入å£ç‹€æ…‹è®€å–速度測試函數。
  ·
  //多個輸入å£ç‹€æ…‹è®€å–交互速度測試private void ReadInTest_Click(object sender, EventArgs e){ int j, k; int testNum = Convert.ToInt32(TestNum.Text.ToString()); int readInNum = Convert.ToInt32(ReadInNum.Text.ToString()); //快速讀å–輸入å£ç‹€æ…‹æŽ¥å£æ™‚間測試 byte[] InState = new byte[4]; DateTime beforeDT = System.DateTime.Now; for (int count = 0; count < testNum; count++) { zmcaux.ZAux_GetModbusIn(g_handle, 0, readInNum, InState); if (count % 100 == 0) { for (int i = 0; i < 32; i++) { j = i / 8; k = i % 8; if (((InState[j] >> k) & 1) == 1) { InStatus[i].BackColor = Color.FromArgb(200, 255, 200); } else { InStatus[i].BackColor = Color.FromArgb(255, 200, 200); } } } } DateTime afterDT = System.DateTime.Now; //計算beforeDT與afterDT的時間差 TimeSpan ts = afterDT - beforeDT; //總耗時 ms ReadInTotTime.Text = ts.TotalMilliseconds.ToString("0.00"); //å¹³å‡è€—時 us ReadInTime.Text = (ts.TotalMilliseconds * 1000 / testNum).ToString("0.00");}
  ④多個輸出å£ç‹€æ…‹è®€å–速度測試函數。
  ·
  //多個輸出å£ç‹€æ…‹è®€å–交互速度測試private void ReadOutTest_Click(object sender, EventArgs e){ int j, k; int testNum = Convert.ToInt32(TestNum.Text.ToString()); int readOutNum = Convert.ToInt32(ReadOutNum.Text.ToString()); //快速讀å–輸入å£ç‹€æ…‹æŽ¥å£æ™‚間測試 byte[] OutState = new byte[4]; DateTime beforeDT = System.DateTime.Now; for (int count = 0; count < testNum; count++) { zmcaux.ZAux_GetModbusOut(g_handle, 0, readOutNum, OutState); if (count % 100 == 0) { for (int i = 0; i < 32; i++) { j = i / 8; k = i % 8; if (((OutState[j] >> k) & 1) == 1) { OutStatus[i].BackColor = Color.FromArgb(200, 255, 200); } else { OutStatus[i].BackColor = Color.FromArgb(255, 200, 200); } } } } DateTime afterDT = System.DateTime.Now; //計算beforeDT與afterDT的時間差 TimeSpan ts = afterDT - beforeDT; //總耗時 ms ReadOutTolTime.Text = ts.TotalMilliseconds.ToString("0.00"); //å¹³å‡è€—時 us ReadOutTime.Text = (ts.TotalMilliseconds * 1000 / testNum).ToString("0.00");}
  ⑤多個輸出å£ç‹€æ…‹è¨ç½®é€Ÿåº¦æ¸¬è©¦å‡½æ•¸ã€‚
  ·
  //多個輸出å£ç‹€æ…‹è¨ç½®äº¤äº’速度測試private void WriteOutTest_Click(object sender, EventArgs e){ int testNum = Convert.ToInt32(TestNum.Text.ToString()); int writeOutNum = Convert.ToInt32(WriteOutNum.Text.ToString()); //快速讀å–輸入å£ç‹€æ…‹æŽ¥å£æ™‚間測試 byte[] OutState = new byte[4]; DateTime beforeDT = System.DateTime.Now; for (int count = 0; count < testNum; count++) { zmcaux.ZAux_GetModbusOut(g_handle, 0, writeOutNum, OutState); } DateTime afterDT = System.DateTime.Now; //計算beforeDT與afterDT的時間差 TimeSpan ts = afterDT - beforeDT; //總耗時 ms WriteOutTolTime.Text = ts.TotalMilliseconds.ToString("0.00"); //å¹³å‡è€—時 us WriteOutTime.Text = (ts.TotalMilliseconds * 1000 / testNum).ToString("0.00");}
  3.多個IOç‹€æ…‹èˆ‡ä¸Šä½æ©Ÿäº¤äº’é€Ÿåº¦æ¸¬è©¦çµæžœ
  (1)32個輸入輸出å£è®€å¯«1000æ¬¡ï¼Œäº¤äº’é€Ÿåº¦æ¸¬è©¦çµæžœã€‚
  (2)32個輸入輸出å£è®€å¯«1Wæ¬¡ï¼Œäº¤äº’é€Ÿåº¦æ¸¬è©¦çµæžœã€‚
  (3)32個輸入輸出å£è®€å¯«10Wæ¬¡ï¼Œäº¤äº’é€Ÿåº¦æ¸¬è©¦çµæžœã€‚
  (4)32個輸入輸出å£å®šæ™‚å™¨å¯¦æ™‚äº¤äº’çš„æ¸¬è©¦çµæžœæ¼”示。
  04分æžèˆ‡çµè«–
  以上分別是å°32個輸入å£çš„讀速度ã€32個輸出å£çš„讀速度以åŠ32個輸出å£çš„寫速度進行測試,從上é¢çš„é‹è¡Œæ•ˆæžœåœ–的數據顯示來看,無論是輸入å£é‚„是輸出å£ï¼Œå®ƒå€‘çš„äº¤äº’é€Ÿåº¦éƒ½ä¿æŒåœ¨200uså·¦å³ã€‚當測試次數從1000æ¬¡å¢žåŠ åˆ°1W次,甚至10W次時,交互速度ä¾èˆŠä¿æŒåœ¨200uså·¦å³ã€‚測試效果å分穩定。測試數據如下表所示:
完整代碼ç²å–地å€
â–¼
  本次,æ£é‹å‹•技術簡單易用的以太網IO控制å¡ï¼šC#讀寫測試,就分享到這里。
  更多精彩內容請關注“æ£é‹å‹•å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿï¼Œéœ€è¦ç›¸é—œé–‹ç™¼ç’°å¢ƒèˆ‡ä¾‹ç¨‹ä»£ç¢¼ï¼Œè«‹å’¨è©¢æ£é‹å‹•技術銷售工程師:400-089-8936。本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
ä¸Šä¸€ç¯‡ï¼šå·¥é »è®Šå£“å™¨çš„åŽŸç†æ˜¯ä»€ä¹ˆ?å·¥é »...
下一篇:鋰離åé›»æ± å„ªé»žåŠæ‡‰ç”¨ç‹€æ³
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊