時間:2023-10-19 11:38:02來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹å…¨åœ‹ç”¢EtherCATé‹å‹•控制邊緣控制器ZMC432H如何使用Python+QT實ç¾å–®è»¸å›žé›¶é‹å‹•控制開發。
  01ã€åŠŸèƒ½ç°¡ä»‹
  全國產EtherCATé‹å‹•控制邊緣控制器ZMC432H是æ£é‹å‹•çš„ä¸€æ¬¾è»Ÿç¡¬ä»¶å…¨åœ‹ç”¢è‡ªä¸»å¯æŽ§ï¼Œé‹å‹•控制接å£å…¼å®¹EtherCAT總線和脈沖型的ç¨ç«‹å¼é‹å‹•控制器,最多支æŒ32軸é‹å‹•æŽ§åˆ¶ï¼ŒåŒæ™‚æ”¯æŒæ£é‹å‹•é 程HMI功能,能æä¾›ç¶²çµ¡çµ„態顯示,å¯å¯¦æ™‚ç›£æŽ§å’Œèª¿æ•´åƒæ•¸é…置。
  ZMC432Hå…·å‚™è±å¯Œçš„硬件接å£å’ŒæŽ§åˆ¶åŠŸèƒ½æ¨¡å¡Šï¼Œèƒ½å¯¦ç¾é«˜æ•ˆç©©å®šçš„é‹å‹•æŽ§åˆ¶å’Œå¯¦æ™‚æ•¸æ“šé‡‡é›†ï¼Œä»¥æ»¿è¶³å·¥æ¥æŽ§åˆ¶å”åŒå·¥æ¥äº’è¯ç¶²çš„æ‡‰ç”¨éœ€æ±‚。ZMC432H內置了Linux系統,å¯ä»¥ä½¿ç”¨æœ¬åœ°çš„LOCAL接å£é€²è¡Œé€£æŽ¥ï¼Œå¯ä»¥åšåˆ°æ›´å¿«é€Ÿçš„æŒ‡ä»¤äº¤äº’ï¼Œå–®æ¢æŒ‡ä»¤èˆ‡å¤šæ¢æŒ‡ä»¤ä¸€æ¬¡æ€§äº¤äº’時間為40uså·¦å³ã€‚
  02ã€Python+QT進行é‹å‹•控制開發
  一.é…置好python+Qt開發環境,以åŠå®‰è£å¥½æ‰€éœ€å·¥å…·1ã€ä¸‹è¼‰python解釋器。2ã€å®‰è£pyside2或者pyside6æ ¹æ“špythonè§£é‡‹å™¨çš„ç‰ˆæœ¬ä¾†é¸æ“‡ï¼Œé«˜ç‰ˆæœ¬çš„解釋器使用pyside6。安è£pyside2有以下兩種方å¼ï¼šæ–¹å¼ä¸€ï¼šä½¿ç”¨win+r打開é‹è¡Œç•Œé¢ï¼Œç„¶åŽè¼¸å…¥cmd(在安è£pythonè§£é‡‹å™¨çš„æ™‚å€™è¦æ ¹æ“šå®‰è£å‘å°Žé…置好環境變é‡ï¼Œå¦å‰‡åŽé¢çš„æŒ‡ä»¤ä¸æœƒåŸ·è¡ŒæˆåŠŸ),pip install pyside2 -i https://pypi.douban.com/simple/;æ–¹å¼äºŒï¼šåœ¨pycharmä¸å®‰è£ã€‚3ã€å®‰è£å¥½PyCharm Community Edition,在如下界é¢é»žæ“Š+è™Ÿï¼Œå®‰è£æ‰€éœ€çš„工具,如pyside2。
  4ã€åœ¨Pycharmä¸é…置自定義工具(用于qt的界é¢ç·¨è¼¯)。(1)按照如圖æ¥é©Ÿæ‰“é–‹Tool的編輯框。
  (2)自定義Pyside2-uic:a.Program填寫:Python安è£ç›®éŒ„ \Scripts\pyside2-uic.exe;b.Arguments填寫:$FileName$ -o $FileNameWithoutExtension$.py;c.Working directory填寫:$FileDir$。
  (3)自定義QtDesigner:a.Program填寫:Python安è£ç›®éŒ„ \Scripts\pyside2-designer.exe;b.Working directory填寫:$ProjectFileDir$。
  將自定義工具é…置好之åŽå°±å¯ä»¥ç›´æŽ¥åœ¨PyCharmçš„èœå–®ä¸ç›´æŽ¥ä½¿ç”¨äº†ã€‚1ã€é»žæ“ŠTools → Qt → Qtdesignerå³å¯é€²å…¥UIçš„è¨è¨ˆç•Œé¢ã€‚
  2ã€å³éµui文件,點擊Qt → Pyside2-uicå³å¯ç”Ÿæˆui文件的py文件。
  二.新建Pythoné …ç›®å¹¶æ·»åŠ å‡½æ•¸åº«
  1ã€ä½¿ç”¨PyCharm Community Edition 2022打開一個新建的文件夾或者在進入PyCharm Community Edition 2022ä¹‹åŽæ–°å»ºä¸€å€‹ç›®éŒ„ï¼Œå¹¶åœ¨ç›®éŒ„ä¸æ·»åŠ Python文件。
  2ã€æ‰¾åˆ°æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料,路徑如下。A.é€²å…¥å» å•†æä¾›çš„光盤資料找到“04.PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  B.鏿“‡â€œPC函數庫V2.1.1â€æ–‡ä»¶å¤¾ã€‚
  C.鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  D.鏿“‡â€œåº«æ–‡ä»¶èˆ‡ä¾‹ç¨‹â€æ–‡ä»¶å¤¾ã€‚
  E.鏿“‡â€œPYTHONä¾‹ç¨‹â€æ–‡ä»¶å¤¾ã€‚
  F.è§£å£“å°æ‡‰ä½æ•¸çš„壓縮包。
  G.解壓åŽå¦‚下圖所示。
  3ã€å°äºŽWindows系統來說將zauxdll.dllã€zmotion.dll以åŠzauxdllPython.Pyæ–‡ä»¶åŠ å…¥æ‰€å‰µå»ºçš„æ–‡ä»¶å¤¾å…§å³å¯ã€‚
ã€€ã€€ä¸‰ã€æŸ¥çœ‹PC函數手冊,熟悉相關函數接å£ã€‚
  1ã€PC函數手冊也在光盤資料里é¢ï¼Œå…·é«”路徑如下:“光盤資料\04.PC函數\ZMotionPC函數庫編程手冊åŠå…¶ä¾‹ç¨‹æºç¢¼\ZMotionPC函數庫編程手冊 V2.1.1.pdfâ€ã€‚
  2ã€éˆæŽ¥æŽ§åˆ¶å™¨ï¼Œç²å–éˆæŽ¥å¥æŸ„。
  (1)ZAux_OpenEth()接å£èªªæ˜Žï¼š
  (2)é…ç½®IOä¿¡è™Ÿé»žå°æ‡‰å‡½æ•¸æŽ¥å£èªªæ˜Žï¼š
ã€€ã€€å°æŽ¥å£çš„è©³ç´°èªªæ˜Žå¯æŸ¥çœ‹PC函數手冊。(3)以下為回零é‹å‹•調用接å£ï¼Œä»¥åŠå°å›žé›¶æ¨¡å¼çš„è©³ç´°èªªæ˜Žï¼šåŠ 10表示碰到é™ä½åŽå找, 䏿œƒç¢°åˆ°é™ä½åœæ¢,例如13=模å¼3+é™ä½å找10,用于原點在æ£ä¸é–“的情æ³ã€‚
  四.Python+Qt開發控制器單軸回零例程。
  1ã€ä¾‹ç¨‹ç•Œé¢å¦‚下。
  2ã€ç¨‹åºç¤ºä¾‹å¦‚下。
  (1)Pythonä¸åŠ è¼‰qtçš„UI文件;
  ·
  from PySide2.QtWidgets import QMessageBoxfrom PySide2.QtCore import QFile, QTimerfrom PySide2.QtUiTools import QUiLoaderq_state_file = QFile("mainweiget.ui")q_state_file.open(QFile.ReadOnly)self.ui = QUiLoader().load(q_state_file)q_state_file.close()
ã€€ã€€æ³¨ï¼šæ¤æ™‚self.ui表示了qtä¸çš„ui。
  (2)éˆæŽ¥æŒ‰éˆ•çš„äº‹ä»¶è™•ç†å‡½æ•¸ä¸èª¿ç”¨éˆæŽ¥æŽ§åˆ¶å™¨çš„æŽ¥å£å‡½æ•¸ZAux_OpenEth()ï¼Œèˆ‡æŽ§åˆ¶å™¨é€²è¡ŒéˆæŽ¥,éˆæŽ¥æˆåŠŸåŽå•Ÿå‹•定時器1監控控制器狀態。
  ·
  def on_btn_open_clicked(self): strtemp = self.ui.comboBox.currentText() print("ç•¶å‰çš„ip是 :", strtemp) if self.Zmc.handle.value is not None: self.Zmc.close() self.time1.stop() self.ui.setWindowTitle("單軸回零") iresult = self.Zmc.open_eth(strtemp) if 0 != iresult: QMessageBox.warning(self.ui, "æç¤º", "連接失敗") else: QMessageBox.warning(self.ui, "æç¤º", "連接æˆåŠŸ") str_title = self.ui.windowTitle() + strtemp self.ui.setWindowTitle(str_title) self.Up_State() self.time1.start(100)
  (3)通éŽå®šæ™‚器監控控制器狀態。
  ·
  def Up_State(self): idlelist = [ctypes.c_int(-1) for i in range(0, 4)] fdposlist = [ctypes.c_float(0) for i in range(0, 4)] for i in range(0, 4): self.Zmc.get_target_pos(i, fdposlist[i]) # ç²å–ç•¶å‰è»¸ä½ç½® self.Zmc.get_idle(i, idlelist[i]) # 判斷當å‰è»¸ç‹€æ…‹ str1 = " {} {} ".format("åœæ¢ä¸" if idlelist[0].value else "é‹è¡Œä¸", round(fdposlist[0].value, 2)) self.ui.lineEdit_X.setText(str1) str1 = " {} {} ".format("åœæ¢ä¸" if idlelist[1].value else "é‹è¡Œä¸", round(fdposlist[1].value, 2)) self.ui.lineEdit_Y.setText(str1) str1 = " {} {} ".format("åœæ¢ä¸" if idlelist[2].value else "é‹è¡Œä¸", round(fdposlist[2].value, 2)) self.ui.lineEdit_Z.setText(str1) str1 = " {} {} ".format("åœæ¢ä¸" if idlelist[3].value else "é‹è¡Œä¸", round(fdposlist[3].value, 2)) self.ui.lineEdit_R.setText(str1)
  (4)使用回零按鈕的事件處ç†å‡½æ•¸å°å›žé›¶é‹å‹•å‰çš„åƒæ•¸é€²è¡Œåˆå§‹åŒ–以åŠèª¿ç”¨å°æ‡‰çš„å›žé›¶æ¨¡å¼æ“作回零é‹å‹•。
  ·
  def on_btn_run_clicked(self): if self.Zmc.handle.value is None: QMessageBox.warning(self.ui, "è¦å‘Š", "未連接控制器") return ifidle = ctypes.c_int(0) self.Zmc.get_idle(self.axis_Num,ifidle) if 0 == ifidle: QMessageBox.warning(self.ui, "æç¤º", "é‹å‹•æœªåœæ¢") return # è¨å®šè»¸é¡žåž‹ 7 - 脈沖軸類型 + 編碼器Z信號 ä¸ç”¨EZ回零也å¯ä»¥è¨ç½®ç‚º1 self.Zmc.set_axis_type(self.axis_Num,7 if self.mode < 3 else 1) # è¨å®šè„ˆæ²–模å¼åŠé‚輯方å‘(脈沖 + æ–¹å‘) self.Zmc.set_invert_step(self.axis_Num,0) # è¨ç½®ç•¶é‡ str_tmp = self.ui.edit_Units.text() float_tmp = float(str_tmp) self.Zmc.set_units(self.axis_Num,float_tmp) # è¨ç½®çˆ¬è¡Œé€Ÿåº¦ str_tmp = self.ui.edit_CLSpeed.text() float_tmp = float(str_tmp) self.Zmc.set_creep(self.axis_Num,float_tmp) # è¨ç½®é€Ÿåº¦ str_tmp = self.ui.edit_Speed.text() float_tmp = float(str_tmp) self.Zmc.set_speed(self.axis_Num,float_tmp) # è¨ç½®åŠ é€Ÿåº¦ str_tmp = self.ui.edit_Accel.text() float_tmp = float(str_tmp) self.Zmc.set_acceleration(self.axis_Num,float_tmp) # è¨ç½®æ¸›é€Ÿåº¦ str_tmp = self.ui.edit_Decel.text() float_tmp = float(str_tmp) self.Zmc.set_deceleration(self.axis_Num,float_tmp) # è¨ç½®åŽŸé»žé–‹é—œ str_tmp = self.ui.edit_zeroIO.text() float_tmp = int(str_tmp) self.Zmc.set_datum_in(self.axis_Num,float_tmp) # å轉 ZMC系列èªç‚ºOFF時碰到了原點信號(常閉) ,如果是常開傳感器則需è¦å轉輸入å£ï¼ŒECI系列的ä¸éœ€è¦å轉 if float_tmp != -1: self.Zmc.set_invert_in(float_tmp,1) # è¨ç½®æ£é™ä½è¼¸å…¥ä¿¡è™Ÿé–‹é—œ str_tmp = self.ui.edit_FWDIO.text() float_tmp = int(str_tmp) self.Zmc.set_fwd_in(self.axis_Num,float_tmp) if float_tmp != -1: self.Zmc.set_invert_in(float_tmp,1) # è¨ç½®è² é™ä½è¼¸å…¥ä¿¡è™Ÿé–‹é—œ str_tmp = self.ui.edit_REVIO.text() float_tmp = int(str_tmp) self.Zmc.set_rev_in(self.axis_Num, float_tmp) if float_tmp != -1: self.Zmc.set_invert_in(float_tmp, 1) # 單軸回零 self.Zmc.single_datum(self.axis_Num,self.mode)
  (5)通éŽåœæ¢é‹å‹•按鈕的事件處ç†å‡½æ•¸ä¾†åœæ¢ç•¶å‰çš„é‹å‹•。
  ·
  def on_btn_stop_clicked(self): if self.Zmc.handle.value is None: QMessageBox.warning(self.ui,"è¦å‘Š","未連接控制器") return #å¦‚æžœå·²ç¶“åœæ¢å‰‡ç„¡éœ€æ“作 isidle = ctypes.c_int(-1) self.Zmc.get_idle(self.axis_Num,isidle) if isidle: return self.Zmc.single_cancel(self.axis_Num,2)
  (6)通éŽå標清零按鈕的事件處ç†å‡½æ•¸ä¾†å°ç•¶å‰è»¸çš„忍™é€²è¡Œå°æ‡‰æ¸…零。
  ·
  def on_btn_clear_clicked(self): if self.Zmc.handle.value is None: QMessageBox.warning(self.ui,"è¦å‘Š","未連接控制器") return isidle = ctypes.c_int(-1) self.Zmc.get_idle(self.axis_Num,isidle) if not isidle: QMessageBox.warning(self.ui,"è¦å‘Š","é‹å‹•未暫åœï¼Œä¸å¯æ¸…é›¶") return self.Zmc.set_target_pos(self.axis_Num,0)
  03
  調試與監控
  編è¯é‹è¡Œä¾‹ç¨‹ï¼ŒåŒæ™‚通éŽRtSysè»Ÿä»¶é€£æŽ¥æŽ§åˆ¶å™¨å°æŽ§åˆ¶å™¨ç‹€æ…‹é€²è¡Œç›£æŽ§ã€‚
  Python+QT進行單軸回零é‹å‹•例程講解。
上一篇:在戶外使用PLC時,我們該注æ„...
下一篇:M系列教å¸ï¼ˆåŸºç¤Žæ•™ç¨‹ç¯‡ï¼‰| å¨...
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊