時間:2024-05-20 14:33:07來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  導讀
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹ä»¥å¤ªç¶²IOå¡ä¹‹ECI0016PA系列數據采集å¡çš„用法,C#語言進行ECI數據采集å¡çš„é–‹ç™¼ä»¥åŠæ¸¬è©¦å¤šå€‹IO讀寫的交互速度,以åŠç¤ºæ³¢å™¨æ›²ç·šé‡‡é›†ã€‚
  硬件介紹
  ECI0016PA/ECI00PABç‰ECI0系列é‹å‹•æŽ§åˆ¶å¡æ”¯æŒä»¥å¤ªç¶²ã€RS232通訊接å£å’Œé›»è…¦ç›¸é€£ï¼ŒæŽ¥æ”¶é›»è…¦çš„æŒ‡ä»¤é‹è¡Œï¼Œå¯ä»¥é€šéŽCAN總線連接å„個擴展模塊,從而擴展輸入輸出點數。ECI0016PAB與ECI0016PAå€åˆ¥ï¼šECI0016PAB支æŒè„«æ©ŸBasic語言。
  ECI0016PA\ECI0016PAB 數據采集å¡
  ECI0016PA/ECI0016PABç‰ECI0系列采用了優化的網絡通訊å”è°ï¼Œå¯ä»¥å¯¦ç¾å¯¦æ™‚çš„é‚輯控制和IO狀態的監控。
  ECI0016PA/ECI0016PABç‰ECI0系列IOå¡çš„æ‡‰ç”¨ç¨‹åºå¯ä»¥ä½¿ç”¨VCã€VBã€VSã€C++ã€C#ç‰è»Ÿä»¶é–‹ç™¼ï¼Œç¨‹åºé‹è¡Œæ™‚需è¦å‹•態庫zmotion.dll,調試時å¯ä»¥å°‡RTSysè»Ÿä»¶åŒæ™‚é€£æŽ¥æŽ§åˆ¶å™¨ï¼Œå¾žè€Œæ–¹ä¾¿èª¿è©¦ã€æ–¹ä¾¿è§€å¯Ÿã€‚
  ECI0016PA/ECI0016PAB產å“特點
  ECI0016PA/ECI0016PAB基本資æº8個NPN輸入,8個NPN輸出,12個模擬é‡è¼¸å…¥(16ä½åˆ†è¾¨çŽ‡ï¼Œ-10V-+10Vé‡ç¨‹),2個模擬é‡è¼¸å‡º(12ä½åˆ†è¾¨çŽ‡ï¼Œ-10V-+10Vé‡ç¨‹)。
  ECI0016PAï¼Œåœ¨é»˜èªæœªé€£æŽ¥ï¼Œé»˜èªè‡ªå¸¶æµ®åœ°å€¼2.5V左峿µ®åœ°å€¼ï¼Œé€™å€‹ä¸å…·åƒè€ƒæ„ç¾©ï¼Œé€£æŽ¥åˆ°è² è¼‰ä¹‹åŽï¼Œä»¥å¾—到的電壓為準。
  ECI0016PAä»¥å¤ªç¶²çš„é€šè¨Šäº¤äº’é€ŸçŽ‡ï¼Œä¸€è¬æ¬¡ä»¥å¤ªç¶²ç¶²çµ¡ç²å–基本資æº(ps:æ¿å上12個AD,2個DA,8個IN,8個OUT為基本硬件資æº)為7秒,也就是平å‡1次ç²å–資æºä¿¡æ¯å°äºŽ1mså·¦å³(å¯¦éš›é€šè¨Šæ•ˆçŽ‡èˆ‡ç¶²å¡æœ‰é—œ),如果ç²å–傳輸資æºä¿¡æ¯æ¸›å°‘å‰‡é€šè¨Šé€ŸçŽ‡å¯æå‡è‡³æ›´å¿«ã€‚
  ECI0016PABï¼Œå¯æ”¯æŒæŽ‰ç·šæª¢æ¸¬ï¼Œè»Ÿä»¶æŽ‰ç·šï¼Œæ¿å¡è‡ªå‹•ç½®ä½è¼¸å‡º;æ¿å¡æŽ‰ç·šï¼Œè»Ÿä»¶å±¤å¯ä»¥é€šéŽå®šæ™‚心跳檢測,ç²å–掉線情æ³ç‰ã€‚
  接線åƒè€ƒ
  1ã€é€šç”¨è¼¸å…¥å£é›»è·¯åœ–
  2ã€é€šç”¨è¼¸å…¥å£æŽ¥ç·šåƒè€ƒåœ–
  3ã€é€šç”¨è¼¸å‡ºå£é›»è·¯åœ–
  4ã€é€šç”¨è¼¸å‡ºå£æŽ¥ç·šåƒè€ƒåœ–
  5ã€æ¨¡æ“¬é‡è¼¸å…¥è¼¸å‡ºè¦æ ¼
  6ã€æ¨¡æ“¬é‡è¼¸å…¥è¼¸å‡ºæŽ¥ç·šåƒè€ƒåœ–
  7ã€æŽ§åˆ¶å™¨åŸºæœ¬ä¿¡æ¯
  ZCAN擴展方法
  1ã€ç•¶ECI0016PA本體所帶的IO數é‡ä¸æ»¿è¶³ä½¿ç”¨æ™‚,å¯é€šéŽZCAN把ECI0016PAç•¶æˆä¸»ç«™ï¼Œæé…ZIO擴展版擴展所需IO數é‡ã€‚
  ECI0016PA當主站接線示æ„圖如下:
  ECI0016PA控制å¡é‡‡ç”¨é›™é›»æºä¾›é›»ï¼ŒZIO擴展模塊采用雙電æºä¾›é›»ï¼Œä½¿ç”¨æ™‚擴展模塊的主電æºå’ŒæŽ§åˆ¶å¡çš„主電æºå¯å…±ç”¨ä¸€è·¯é›»æºã€‚ECI0016PA控制å¡å’ŒZIO擴展模塊用ä¸åŒé›»æºä¾›é›»æ™‚,控制å¡é›»æºGNDè¦é€£æŽ¥æ“´å±•模塊電æºçš„GND,å¦å‰‡å¯èƒ½ç‡’壞CAN。
  CAN總線上連接多個ZIO擴展模塊時,在CAN總線的左å³å…©ç«¯å„接一個120æçš„電阻,å°äºŽå…·æœ‰8使’¥ç¢¼çš„æ“´å±•模塊,終端電阻å¯é€šéŽæ’¥ç¢¼å¯¦ç¾ã€‚
  2ã€ç•¶æœ‰åˆ¥çš„主å¡ï¼Œä¸éœ€è¦ECI0016PA當主站,想把ECI0016PAçš„è³‡æºæ“´å±•到主å¡ä¸Šï¼Œæé…主å¡ä½¿ç”¨æ™‚,å¯ä»¥æŠŠECI0016PAç•¶æˆå¾žç«™æ“´å±•上去。ECI0016PAç•¶æˆå¾žç«™æŽ¥ç·šç¤ºæ„圖如下:
CAN總線上連接多個ZIO擴展模塊時,在CAN總線的左å³å…©ç«¯å„接一個120æçš„電阻,å°äºŽå…·æœ‰8使’¥ç¢¼çš„æ“´å±•模塊,終端電阻å¯é€šéŽæ’¥ç¢¼å¯¦ç¾ã€‚為ä¿è‰é€šè¨Šè³ªé‡ï¼Œè«‹ä½¿ç”¨é›™çµžå±è”½ç·šï¼Œå±è”½å±¤æŽ¥åœ°ï¼ŒæŽ§åˆ¶å™¨å’Œæ“´å±•模塊內部電æºè«‹ä½¿ç”¨åŒä¸€å€‹é›»æºã€‚
ã€€ã€€å› ç‚ºECI0016PA沒有撥碼開關,所以當ECI0016PAè¨ç½®ç‚ºå¾žç«™æ™‚,需用RTSys軟件連接到ECI0016PAæ¿å¡ï¼Œæ‰‹å‹•è¨ç½®å¾žç«™ID。
  ·
  CANIO_ADDRESS = 1 'è¨ç½®CAN ID為1ï¼Œæ¤æ™‚為從端,波特率500Kbps,作為ZCAN從站使用,IO起始地å€ç‚º32(16+16*1).CANIO_ADDRESS = 2 'è¨ç½®CAN ID為2ï¼Œæ¤æ™‚為從端,波特500Kbps,作為ZCAN從站使用,IO起始地å€ç‚º48(16+16*2).CANIO_ADDRESS = 3 'è¨ç½®CAN ID為3ï¼Œæ¤æ™‚為從端,波特500Kbps,作為ZCAN從站使用,IO起始地å€ç‚º64(16+16*3).CANIO_ADDRESS = 4 'è¨ç½®CAN ID為4ï¼Œæ¤æ™‚為從端,波特500Kbps,作為ZCAN從站使用,IO起始地å€ç‚º80(16+16*4).CANIO_ADDRESS = 2 +256 'è¨ç½®CAN ID為2ï¼Œæ¤æ™‚為從端,波特250Kbps,作為ZCAN從站使用,IO起始地å€ç‚º48(16+16*2).CANIO_ADDRESS = 2 +512 'è¨ç½®CAN ID為2ï¼Œæ¤æ™‚為從端,波特125Kbps,作為ZCAN從站使用,IO起始地å€ç‚º48(16+16*2).CANIO_ADDRESS = 2+768 'è¨ç½®CAN ID為2ï¼Œæ¤æ™‚為從端,波特1Mbps,作為ZCAN從站使用,IO起始地å€ç‚º48(16+16*2).
  C#語言進行ECI IO控制å¡çš„開發
  1. 在VS2010èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’â€œé …ç›®â€ï¼Œå•Ÿå‹•å‰µå»ºé …ç›®å‘導。
  2.鏿“‡é–‹ç™¼èªžè¨€ç‚ºâ€œVisual C#â€å’Œ.NET Framework 4以åŠWindows窗體應用程åºã€‚
  3.æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料里é¢çš„C#函數庫,路徑如下(32ä½åº«ç‚ºä¾‹)。
  1)é€²å…¥å» å•†æä¾›çš„光盤資料找到“04PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  2)鏿“‡â€œå‡½æ•¸åº«2.1â€æ–‡ä»¶å¤¾ã€‚
  3)鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  4)æ ¹æ“šéœ€è¦é¸æ“‡å°æ‡‰çš„å‡½æ•¸åº«ï¼Œé€™é‡Œé¸æ“‡32ä½åº«ã€‚
  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.OCX控件注冊。zmotion.dll,ZScope.libã€ZScope.ocx放到C盤文件目錄下,然åŽç®¡ç†å“¡æ¬Šé™æ‰“é–‹CMD,發é€regsvr32 C:\ZScope.ocx注冊控件,注冊æˆåŠŸï¼Œæœƒå½ˆçª—æç¤ºã€‚
  8.å·¥å…·æ¬„æ·»åŠ COMçµ„ä»¶ã€‚å·¥å…·â†’é¸æ“‡å·¥å…·ç®±é …→COM組件→勾é¸ZScope組件→確定。
  9.至æ¤ï¼Œé …目新建完æˆï¼Œå¯é€²è¡ŒC#é …ç›®é–‹ç™¼ã€‚
  PC函數介紹
  1ã€PC函數手冊å¯åœ¨å…‰ç›¤è³‡æ–™æŸ¥çœ‹ï¼Œå…·é«”路徑如下。
  2ã€éˆæŽ¥æŽ§åˆ¶å™¨ï¼Œç²å–éˆæŽ¥å¥æŸ„。
  3ã€å¿«é€Ÿè®€å–多個輸入å£ç•¶å‰ç‹€æ…‹æŽ¥å£èªªæ˜Žã€‚
  4ã€å¿«é€Ÿè®€å–多個輸出å£ç•¶å‰ç‹€æ…‹æŽ¥å£èªªæ˜Žã€‚
  C#快速讀å–多個IO狀態的測試例程
  1.例程界é¢
  2.相關代碼
  (1)éˆæŽ¥æŒ‰éˆ•çš„äº‹ä»¶è™•ç†å‡½æ•¸ä¸èª¿ç”¨éˆæŽ¥æŽ§åˆ¶å™¨çš„æŽ¥å£å‡½æ•¸ZAux_FastOpen()ï¼Œèˆ‡æŽ§åˆ¶å™¨é€²è¡ŒéˆæŽ¥ï¼ŒéˆæŽ¥æˆåŠŸåŽå®šæ™‚器2,自動監控控制器的IOä»¥åŠæ¨¡æ“¬é‡ç‹€æ…‹ã€‚
  ·
  //éˆæŽ¥private void button3_Click(object sender, EventArgs e){ LinkType = comboBox1.Text; if (LinkType == "ç¶²å£") { byte[] tempbuff = new byte[257]; //接收的返回的å—符 if (g_handle == (IntPtr)0) { Adrr = comboBox2.Text; if (System.Text.RegularExpressions.Regex.IsMatch(Adrr, "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}")) //ç¶²å£å—ç¬¦ä¸²æ ¼å¼åˆ¤æ–· { string[] ips = Adrr.Split('.'); if (ips.Length == 4 || ips.Length == 6) { if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1]) < 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256) { //ret = zmcaux.ZAux_OpenEth(Adrr, out g_handle); ret = zmcaux.ZAux_FastOpen(2, Adrr, 1000, out g_handle); if (0 != ret) { MessageBox.Show("找ä¸åˆ°æŽ§åˆ¶å™¨"); return; } this.Text = "簡單易用的以太網模擬é‡é‡‡é›†æŽ§åˆ¶å¡(已連接,連接方å¼:ç¶²å£)"; axZScope1.SetControllerIP((int)IPToUInt64(Adrr)); //axZScope1.SetControllerIP(100772032); } else { MessageBox.Show("Ip地å€è¼¸å…¥æ ¼å¼éŒ¯èª¤!"); return; } } else { MessageBox.Show("Ip地å€è¼¸å…¥æ ¼å¼éŒ¯èª¤!"); return; } } else { MessageBox.Show("Ip地å€è¼¸å…¥æ ¼å¼éŒ¯èª¤!"); return; } }}else{ byte[] tempbuff = new byte[1024]; //接收的返回的å—符 if (g_handle == (IntPtr)0) { ret = zmcaux.ZAux_FastOpen(1, comboBox2.Text, 1000, out g_handle); f (0 != ret) { MessageBox.Show("找ä¸åˆ°æŽ§åˆ¶å™¨"); return; } this.Text = "簡單易用的以太網模擬é‡é‡‡é›†æŽ§åˆ¶å¡(已連接,連接方å¼:串å£)"; StringBuilder radBuff= new StringBuilder(2048); ret=zmcaux.ZAux_Execute(g_handle, "?IP_ADDRESS", radBuff, 2048); if (ret == 0) { int ival = Convert.ToInt32(radBuff.ToString()); axZScope1.SetControllerIP(ival); } }}//åŠ è¼‰å¿ƒè·³é…置文件,若ECI0016PAB(脫機版本支æŒ)float pfValue=0;int times = 0; StringBuilder radBuff1= new StringBuilder(2048); StringBuilder radBuff2= new StringBuilder(2048); StringBuilder radBuff3= new StringBuilder(2048); zmcaux.ZAux_GetControllerInfo(g_handle, radBuff1, radBuff2, radBuff3); textBox12.Text = radBuff1.ToString(); ret = zmcaux.ZAux_Direct_GetUserVar(g_handle, "Heart_Time", ref pfValue);//ç²å–æ¿å¡è…³æœ¬(basic)變é‡ï¼Œç¢ºèªè…³æœ¬æœ‰ç„¡åŠ è¼‰ if (ret!=0) { textBox1.Text="æœªåŠ è¼‰"; textBox2.Text = "æœªåŠ è¼‰"; } else { ret = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "Heart_StarFlag", ref Sys_HeartStarFlag);//ç²å–心跳是å¦å•Ÿç”¨ ret += zmcaux.ZAux_Direct_GetVariableInt(g_handle, "Heart_Time", ref times);//超時時間 ret += zmcaux.ZAux_Direct_GetVariableInt(g_handle, "OutList_Address", ref Sys_HeartModbusStar);//急åœOUTmodbus_long起始地å€(Ps:3系列以下,自定義變é‡ç‚º24使µ®é»žæ•¸ï¼Œ32ä½ç²¾åº¦ä¸Ÿå¤±ï¼Œç”¨modbus_long來代替) ret += zmcaux.ZAux_Modbus_Get4x_Long(g_handle, 0, 4, Sys_HeartIo); if (ret != 0) { MessageBox.Show("err:å¿ƒè·³åƒæ•¸ç²å–異常!"); } if (Sys_HeartStarFlag == 1) { textBox1.Text = "啟用"; } else { textBox1.Text = "未啟用"; } textBox2.Text = times.ToString(); textBox4.Text = Sys_HeartModbusStar.ToString(); List_Draw(sender, e); }}
  (2)通éŽå®šæ™‚器,監控控制器的多個IOç‹€æ…‹ï¼Œä»¥åŠæ¨¡æ“¬é‡ç‹€æ…‹ã€‚以下演示,實際接線把OUT0接入到了IN0,DA0接入到了AD0ï¼Œå³æ“作OUT0以åŠDA0æ™‚ï¼Œå°æ‡‰çš„輸入會有變化。
  ·
  public void draw_io(){ if (g_handle != (IntPtr)0) { Graphics g = this.groupBox4.CreateGraphics(); Pen redPen = new Pen(Color.FromArgb(245, 115, 103), 13);//紅色 Pen greenPen = new Pen(Color.FromArgb(132,239,109), 13);//ç¶ è‰² Font drawFont = new Font("Arial", 9); SolidBrush drawBrush = new SolidBrush(Color.Black);//畫刷é¡è‰² zmcaux.ZAux_GetModbusIn(g_handle,0,7,in_state); zmcaux.ZAux_GetModbusOut(g_handle, 0, 7, out_state); for (int i = 0; i < 8; i++) { if (((in_state[0] >> i) & 1) == 1) { g.DrawEllipse(greenPen, new Rectangle(60 + 50 * i, 38, 13, 13)); //紅色,無信號 g.DrawString("IN" + i.ToString(), drawFont, drawBrush, new PointF(55 + 50 * i, 38)); } else { g.DrawEllipse(redPen, new Rectangle(60 + 50 * i, 38, 13, 13)); //紅色,無信號 g.DrawString("IN" + i.ToString(), drawFont, drawBrush, new PointF(55 + 50 * i, 38)); } if (((out_state[0] >> i) & 1) == 1) { btn[i].BackColor = Color.FromArgb(132, 239, 109); btn[i].Checked = true; } else { btn[i].BackColor = Color.FromArgb(245, 115, 103); btn[i].Checked = false; } } }}//定時器2private void timer2_Tick(object sender, EventArgs e){ if (g_handle != (IntPtr)0) { draw_io(); int iret = zmcaux.ZAux_Direct_GetAD(g_handle, Convert.ToInt32(comboBox3.Text), ref mAd_rVal); if (iret == 0) { textBox5.Text = mAd_rVal.ToString(); mAd_rVal1 = ((mAd_rVal - 32768) / 32768)*10; textBox8.Text = mAd_rVal1.ToString(); }else { textBox5.Text = "err"; textBox8.Text = "err"; } iret = zmcaux.ZAux_Direct_GetDA(g_handle, Convert.ToInt32(comboBox4.Text), ref mDa_rVal); if (iret == 0) { textBox6.Text = mDa_rVal.ToString(); mDa_rVal1 = ((mDa_rVal - 2047) / 2048) * 10; textBox7.Text = mDa_rVal1.ToString(); } else { textBox6.Text = "err"; textBox7.Text = "err"; } }}
  (3)å¿ƒè·³æª¢æ¸¬è…³æœ¬åŠ è¼‰ï¼Œå¿ƒè·³å•Ÿå‹•åŽï¼Œè»Ÿä»¶æŽ‰ç·šï¼Œæ¿å¡è‡ªå‹•打開è¨ç½®è¼¸å‡ºå£ï¼Œæ¿å¡æŽ‰ç·šï¼Œè»Ÿä»¶æª¢æ¸¬å½ˆçª—。(ECI0016PA䏿”¯æŒ)
  ①é…ç½®åŠ è¼‰ï¼š
  ·
  //é…ç½®åŠ è¼‰private void button9_Click(object sender, EventArgs e){ if (g_handle != (IntPtr)0) { string currentPath = System.AppDomain.CurrentDomain.BaseDirectory; m_FilePath = currentPath + "config\\Heartbeat.bas"; // MessageBox.Show(m_FilePath);//ç²å–軟件目錄下的心跳bas文件 ret = zmcaux.ZAux_BasDown(g_handle, m_FilePath, 1); //心跳下載到ROM if (0 != ret) { MessageBox.Show("心跳下載到ROM失敗"); return; } else { Thread.Sleep(1000);//延時1S,確ä¿ç¨‹åºåŠ è¼‰å®Œæˆ int times = 0; ret = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "Heart_StarFlag", ref Sys_HeartStarFlag);//ç²å–心跳是å¦å•Ÿç”¨ if (ret != 0) { MessageBox.Show("err:å¿ƒè·³åƒæ•¸ç²å–異常!"); return; } ret = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "Heart_Time", ref times);//超時時間 if (ret != 0) { MessageBox.Show("err:å¿ƒè·³åƒæ•¸ç²å–異常!"); return; } ret = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "OutList_Address", ref Sys_HeartModbusStar);//急åœOUTmodbus_long起始地å€(Ps:3系列以下,自定義變é‡ç‚º24使µ®é»žæ•¸ï¼Œ32ä½ç²¾åº¦ä¸Ÿå¤±ï¼Œç”¨modbus_long來代替) if (ret != 0) { MessageBox.Show("err:å¿ƒè·³åƒæ•¸ç²å–異常!"); return; } ret = zmcaux.ZAux_Modbus_Get4x_Long(g_handle, 0, 4, Sys_HeartIo); if (ret != 0) { MessageBox.Show("err:å¿ƒè·³åƒæ•¸ç²å–異常!"); return; } if (Sys_HeartStarFlag == 1) { textBox1.Text = "啟用"; } else { textBox1.Text = "未啟用"; } textBox2.Text = times.ToString(); textBox4.Text = Sys_HeartModbusStar.ToString(); List_Draw( sender, e); MessageBox.Show("心跳é…置文件下載到ROMæˆåŠŸ!"); } } else { MessageBox.Show("æœªéˆæŽ¥!"); }}
  ②心跳啟åœï¼š
  ·
  //心跳啟動private void button1_Click(object sender, EventArgs e){ Sys_HeartIo[0] = 0; for (int i = 0; i < 8; i++) { if (Convert.ToInt32(dataGridView1.Rows[i].Cells["Column1"].Value) == 1) { Sys_HeartIo[0] = (Sys_HeartIo[0]) | (1 << i); } } ushort start = (ushort)Convert.ToInt32(textBox4.Text); ret = zmcaux.ZAux_Modbus_Set4x_Long(g_handle, start, 4, Sys_HeartIo); if (ret != 0) { MessageBox.Show("啟動失敗!"); return; } int iret = zmcaux.ZAux_Direct_SetUserVar(g_handle, "Heart_StarFlag", 1); //發é€å¿ƒè·³ä¿¡è™Ÿ if (ret != 0) { MessageBox.Show("啟動失敗!"); return; } textBox1.Text = "啟用"; timer1.Interval = Convert.ToInt32(textBox3.Text); timer1.Enabled = true;//使能定時器1}//心跳關閉private void button2_Click(object sender, EventArgs e){ timer1.Stop(); textBox1.Text = "未啟用";}
  ③軟件心跳掃æï¼š
  ·
  //定時器1private void timer1_Tick(object sender, EventArgs e){ if (g_handle != (IntPtr)0) { int iret = zmcaux.ZAux_Direct_SetUserVar(g_handle, "Heart_Status", 0); //發é€å¿ƒè·³ä¿¡è™Ÿ if (iret == 3402 || iret > 20000) //é€šä¿¡è¶…æ™‚æˆ–éˆæŽ¥æ–·é–‹ { //PC通信異常 Sys_HeartAddNum++; if (Sys_HeartAddNum > 3) { g_handle = (IntPtr)0; this.Text = "簡單易用的以太網模擬é‡é‡‡é›†æŽ§åˆ¶å¡"; textBox1.Text = "未啟用"; timer1.Enabled = false;//定時器1 MessageBox.Show("éˆæŽ¥æ–·é–‹!"); } } else { Sys_HeartAddNum = 0; } }}
  ④æ¿å¡å…§éƒ¨basic掃æï¼š
  ·
  '*************************************心跳相關變é‡å®šç¾©************************Global Heart_StarFlag '通訊標è˜è®Šé‡Global Heart_Status '通訊標è˜è®Šé‡Global CONST Heart_Time=200 '心跳超時時間Global Heart_OutNum '急åœOP數é‡Global OutList_Address '急åœOUTmodbus_long起始地å€(Ps:3系列以下,自定義變é‡ç‚º24使µ®é»žæ•¸ï¼Œ32ä½ç²¾åº¦ä¸Ÿå¤±ï¼Œç”¨modbus_long來代替)GLOBAL CONST cVer=CONTROLHeart_StarFlag =-1Heart_Status = 0Heart_OutNum = 10OutList_Address =0dim i,jWHILE TRUE WAIT until Heart_StarFlag = 1 'ç‰å¾…PC軟件連接 wa Heart_Time 'PC連接之åŽï¼Œå»¶æ™‚一個超時時間,é¿å…ä¸Šä½ if cVer>0 and cVer<2619 THEN 'eci1408,2418,2618䏿”¯æŒmodbus用法 WHILE TRUE if Heart_Status = 0 then Heart_Status = 1 'ç‰å¾…PCä¸Šä¿®æ”¹é€šè¨Šè®Šé‡ ticks = Heart_Time '超時判斷處ç†ï¼Œç‰å¾…PC上修改Heart_Flag = 0 WAIT until ticks < 0 or Heart_Status=0 if Heart_Status = 1 THEN RAPIDSTOP(2) WAIT IDLE for i = 0 to 3 for j=0 to 31 if ((MODBUS_LONG(OutList_Address+i*2)>>j)and 1) THEN op(i*32+j, ON) ELSE op(i*32+j, OFF) ENDIF NEXT next Heart_StarFlag=-1 Heart_Status = 0 EXIT WHILE Endif WEND ELSE WHILE TRUE if Heart_Status = 0 then Heart_Status = 1 'ç‰å¾…PCä¸Šä¿®æ”¹é€šè¨Šè®Šé‡ ticks = Heart_Time '超時判斷處ç†ï¼Œç‰å¾…PC上修改Heart_Flag = 0 WAIT until ticks < 0 or Heart_Status=0 if Heart_Status = 1 THEN RAPIDSTOP(2) WAIT IDLE for i = 0 to 3 MODBUS_BIT(20000+i*32,20031+i*32)=MODBUS_LONG(OutList_Address+i*2) next Heart_StarFlag=-1 Heart_Status = 0 EXIT WHILE Endif WEND ENDIF WENDend
  (4)DA波形仿真測試。實際接線把DA0接入到了AD0ï¼Œå³æ“作DA0æ™‚ï¼Œå°æ‡‰çš„AINä¹Ÿæœƒæœ‰è®ŠåŒ–ã€‚æ¤æ“作,æ“作DA0,模擬一個幅值為+-10V,周期在400mså·¦å³çš„一個æ£å¼¦æ³¢å½¢ã€‚
  ·
  //DA輸出波形模擬private void button6_Click(object sender, EventArgs e){ if (g_handle != (IntPtr)0) { // å®šç¾©åƒæ•¸ int tmp= Convert.ToInt32(comboBox4.Text); // 創建線程,并在lambda表é”å¼ä¸ä½¿ç”¨åƒæ•¸ Thread t = new Thread(() => { // 在這里å¯ä»¥ä½¿ç”¨myParameter ret = zmcaux.ZAux_Direct_SetDA(g_handle, tmp, 0); if (ret != 0) { MessageBox.Show("è¨ç½®å¤±æ•—!"); return; } zmcaux.ZAux_Trigger(g_handle); for (int i = 0; i < 799; i++) { mDa_wVal = (float)(2047 * Math.Sin((Math.PI * i) / 100) + 2048); zmcaux.ZAux_Direct_SetDA(g_handle, tmp, mDa_wVal); Thread.Sleep(1); } MessageBox.Show("模擬完æˆ!"); }); t.Start(); }}
  (5)ç¶²å£é€šè¨Šé€Ÿçއ驗è‰ã€‚
  ·
  //通訊速度測試函數private void button7_Click(object sender, EventArgs e){ StringBuilder radBuff = new StringBuilder(20480); String tmp="?IN(0,8)\n"; //ç²å–å¡ä¸Šçš„æ‰€æœ‰IN tmp = tmp + "?OP(0,8)\n"; //ç²å–å¡ä¸Šæ‰€æœ‰OUT狀態 int i; for (i = 0; i < 12; i++) //ç²å–å¡ä¸Šæ‰€æœ‰AIN值 { tmp = tmp + "?AIN(" + i.ToString() + ")\n"; } for (i = 0; i < 2; i++) //ç²å–å¡ä¸Šæ‰€æœ‰Aout值 { tmp = tmp + "?AOUT(" + i.ToString() + ")\n"; } DateTime beforeDT = System.DateTime.Now; int k = 0; for (i = 0; i < 10000; i++) { ret = zmcaux.ZAux_DirectCommand(g_handle, tmp, radBuff, 20480);//一次通訊,ç²å–å¡ä¸Šæ‰€æœ‰ç¡¬ä»¶è³‡æºç‹€æ…‹ if (ret != 0) { k++; } } DateTime afterDT = System.DateTime.Now; TimeSpan ts = afterDT - beforeDT; //總耗時 ms textBox10.Text = ts.TotalMilliseconds.ToString("0.00"); MessageBox.Show("失敗次數:" + k.ToString());}private void button8_Click(object sender, EventArgs e){ StringBuilder radBuff = new StringBuilder(20480); int i; String tmp = "?IN(0,32)\n"; //ç²å–å¡ä¸Šçš„æ‰€æœ‰IN int k; for (i = 1; i < 8; i++) //ç²å–å¡ä¸Šæ‰€æœ‰AIN值 { k = i * 32; tmp = tmp + "?IN(" + k.ToString() + ",32)\n"; } tmp = tmp + "?IN(256,16)\n"; for (i = 0; i < 8; i++) //ç²å–å¡ä¸Šæ‰€æœ‰AIN值 { k = i * 32; tmp = tmp + "?OP(" + k.ToString() + ",32)\n"; } tmp = tmp + "?OP(256,16)\n"; int length = tmp.Length; for (i = 0; i < 64; i++) { tmp = tmp + "?AIN(" + i.ToString() + ")\n"; tmp = tmp + "?AOUT(" + i.ToString() + ")\n"; length = tmp.Length; if (length > 1000) //åœ¨ç·šå‘½ä»¤ï¼Œæ¯æ¬¡æœ€å¤šç™¼é€1000個å—節 { break; } } DateTime beforeDT = System.DateTime.Now; k=0; for (i = 0; i < 10000; i++) { ret = zmcaux.ZAux_DirectCommand(g_handle, tmp, radBuff, 20480);//一次通訊,ç²å–å¡ä¸Šæ‰€æœ‰ç¡¬ä»¶è³‡æºç‹€æ…‹ if (ret!=0) { k ++; } } DateTime afterDT = System.DateTime.Now; TimeSpan ts = afterDT - beforeDT; //總耗時 ms textBox11.Text = ts.TotalMilliseconds.ToString("0.00"); MessageBox.Show("失敗次數:"+k.ToString());}
ã€€ã€€äº¤äº’é€Ÿåº¦æ¸¬è©¦çµæžœ
  1.基本資æºç²å–耗時/ms(è¬æ¢å‡½æ•¸ç²å–ECI0016PA的基本資æºï¼Œ8個IN,8個OUT,12個AIN,2個DA)。
  2.極é™è³‡æºç²å–耗時/ms(è¬æ¢å‡½æ•¸ç²å–ECI0016PA的極é™è³‡æºï¼Œæœ€å¤§272個IN,272個OUT,拼接DA/AD,é”到一次通訊å—符串極é™é•·åº¦1000個å—節)。
完整代碼ç²å–地å€
â–¼
  本次,æ£é‹å‹•æŠ€è¡“ç°¡å–®æ˜“ç”¨çš„ä»¥å¤ªç¶²æ•¸æ“šé‡‡é›†å¡æ‡‰ç”¨é–‹ç™¼ä¹‹C#,就分享到這里。
  更多精彩內容請關注“æ£é‹å‹•å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿï¼Œéœ€è¦ç›¸é—œé–‹ç™¼ç’°å¢ƒèˆ‡ä¾‹ç¨‹ä»£ç¢¼ï¼Œè«‹å’¨è©¢æ£é‹å‹•技術銷售工程師:400-089-8936。
  本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
上一篇:LeadSys Studio 梯形圖更新介紹
ä¸‹ä¸€ç¯‡ï¼šå·¥æŽ§æ©Ÿæ¨™æº–æ“‹æ¿æ€Žä¹ˆå®‰è£
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊