一、簡(jiǎn)介 ? ? ?
?EPOS給的這個(gè)VC代碼是用MFC編寫(xiě)的上位機(jī),由圖1可知EPOS控制器最多可以設(shè)置九種控制方式,而這個(gè)上位機(jī)默認(rèn)只能使用“Profile Position Mode”,電機(jī)參數(shù)配置界面和驅(qū)動(dòng)界面分別如圖2圖3所示。注意選擇EPOS2控制器,連接方式一般都是默認(rèn)串口發(fā)送。
二、控制思路
? ? ? 1、配置完控制器參數(shù)后進(jìn)入圖3控制界面,在對(duì)話框初始化函數(shù)BOOL CDemo_WinDLLDlg::OnInitDialog()中調(diào)用OpenDevice()函數(shù)判斷控制器與電機(jī)是否成功打開(kāi),若打開(kāi)則開(kāi)啟定時(shí)器,以100ms的周期更新數(shù)據(jù)并改變界面顯示。其中OpenDevice()函數(shù)核心代碼如下圖所示。
下面簡(jiǎn)要介紹圖4中主要的幾個(gè)函數(shù),詳細(xì)介紹請(qǐng)見(jiàn)EPOS2-24-2文件夾下《EPOS Command Library》的PDF文件。
VCS_ClearFault(m_KeyHandle, m_usNodeId, &m_ulErrorCode):清除錯(cuò)誤狀態(tài),使電機(jī)由錯(cuò)誤狀態(tài)轉(zhuǎn)到關(guān)閉狀態(tài)。
VCS_GetOperationMode(m_KeyHandle, m_usNodeId, &m_bMode, &m_ulErrorCode):讀取電機(jī)驅(qū)動(dòng)狀態(tài),變量m_bMode返回驅(qū)動(dòng)方式編號(hào)。
VCS_GetPositionProfile(m_KeyHandle, m_usNodeId, &m_ulProfileVelocity, &m_ulProfileAcceleration, &m_ulProfileDeceleration, &m_ulErrorCode):讀取位置驅(qū)動(dòng)方式的各項(xiàng)參數(shù),m_ulProfileVelocity返回穩(wěn)定時(shí)轉(zhuǎn)速,m_ulProfileAcceleration和m_ulProfileDeceleration分別返回電機(jī)加速和減速時(shí)的加速度。
VCS_SetOperationMode(m_KeyHandle, m_usNodeId, OMD_PROFILE_POSITION_MODE, &m_ulErrorCode):將電機(jī)驅(qū)動(dòng)方式通過(guò)OMD_PROFILE_POSITION_MODE配置成Profile Position Mode。
VCS_SetPositionProfile(m_KeyHandle, m_usNodeId, 10000, 1000, 1000, &m_ulErrorCode):配置電機(jī)在Profile Position Mode方式驅(qū)動(dòng)下的各項(xiàng)參數(shù),10000表示電機(jī)穩(wěn)定時(shí)的轉(zhuǎn)速,兩個(gè)1000形參表示電機(jī)加速和減速時(shí)的加速度。
VCS_GetPositionIs(m_KeyHandle, m_usNodeId, &m_lStartPosition, &m_ulErrorCode):獲取電機(jī)此時(shí)的各項(xiàng)位置參數(shù),m_lStartPosition返回函數(shù)被調(diào)用時(shí)電機(jī)實(shí)際位置,即為初始位置。
2、在圖3界面配置控制器節(jié)點(diǎn)ID和目標(biāo)位置信息,通過(guò)m_lTargetPosition變量獲取設(shè)定的目標(biāo)位置信息,并且選擇是相對(duì)轉(zhuǎn)動(dòng)方式還是絕對(duì)轉(zhuǎn)動(dòng)方式,若為前者則電機(jī)會(huì)轉(zhuǎn)動(dòng)目標(biāo)位置距離,否則則是電機(jī)轉(zhuǎn)動(dòng)到設(shè)定的絕對(duì)位置處為止。
3、點(diǎn)擊ENABLE按鈕,使能電機(jī),注意此時(shí)并沒(méi)有開(kāi)始驅(qū)動(dòng)電機(jī)。主要采用的核心代碼如圖5所示
簡(jiǎn)要介紹相關(guān)函數(shù):
UpdateNodeIdString():將節(jié)點(diǎn)ID編輯框中的數(shù)值轉(zhuǎn)換成字符串類型,即更新參數(shù)m_usNodeId。
VCS_GetFaultState(m_KeyHandle, m_usNodeId, &oFault, &m_ulErrorCode):判斷電機(jī)是否處于錯(cuò)誤狀態(tài),是則oFault=true,判斷失敗則函數(shù)返回0。
VCS_ClearFault(m_KeyHandle, m_usNodeId, &m_ulErrorCode):清除存在的錯(cuò)誤,使電機(jī)從錯(cuò)誤狀態(tài)變成失能狀態(tài)。
4、點(diǎn)擊MOVE按鈕,實(shí)現(xiàn)電機(jī)轉(zhuǎn)動(dòng),驅(qū)動(dòng)代碼如圖6所示。
簡(jiǎn)要介紹相關(guān)代碼:
m_lFirstTargetPosition用來(lái)存儲(chǔ)初次設(shè)置的目標(biāo)位置(比如9722000表示90圈)。
VCS_GetPositionIs(m_KeyHandle, m_usNodeId, &m_lStartPosition, &m_ulErrorCode):獲取此時(shí)位置信息,通過(guò)m_lStartPosition返回顯示在初始位置編輯框。
VCS_MoveToPosition(m_KeyHandle, m_usNodeId, m_lTargetPosition, m_oRadio, m_oImmediately, &m_ulErrorCode):驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng)到響應(yīng)位置,m_oRadio表示相對(duì)轉(zhuǎn)動(dòng)還是絕對(duì)轉(zhuǎn)動(dòng),m_oImmediately為true表示立即驅(qū)動(dòng),若為false則表示等上次驅(qū)動(dòng)到指定位置,才開(kāi)始本次驅(qū)動(dòng)。
UpdateStatus():更新對(duì)話框顯示。
5、點(diǎn)擊HALT按鈕,使電機(jī)處于暫停狀態(tài),按照設(shè)定的減速時(shí)加速度值減速到0,。停止后點(diǎn)擊MOVE按鈕電機(jī)會(huì)重新轉(zhuǎn)動(dòng)到目標(biāo)位置為止。
只調(diào)用一個(gè)函數(shù)VCS_HaltPositionMovement(m_KeyHandle, m_usNodeId, &m_ulErrorCode)。
6、點(diǎn)擊DISABLE按鈕,使電機(jī)處于停止?fàn)顟B(tài),電機(jī)立刻停止而不是勻減速停止,并且停止后再點(diǎn)擊MOVE按鈕并不會(huì)繼續(xù)轉(zhuǎn)動(dòng)。
核心函數(shù)只有一個(gè):VCS_SetDisableState(m_KeyHandle, m_usNodeId, &m_ulErrorCode)。
7、定時(shí)器中電機(jī)正反向驅(qū)動(dòng)切換的實(shí)現(xiàn),實(shí)現(xiàn)代碼如圖7所示。(本部分代碼不屬于官方范例,自己修改)
代碼解析:
調(diào)用VCS_GetPositionIs()函數(shù)使m_lActualValue始終獲得實(shí)時(shí)電機(jī)位置信息。
通過(guò)先前m_lFirstTargetPosition變量存儲(chǔ)了初次設(shè)定的非0目標(biāo)位置值,通過(guò)判斷語(yǔ)句使目標(biāo)位置m_lTargetPosition在非0值和0之間切換,實(shí)現(xiàn)自動(dòng)正反向切換。