Modbus 控制方式 1.寄存器說明 驅(qū)動器可以通過 modbus(RTU 模式)來控制驅(qū)動器。主機(jī)可以 通過 modbus 的讀寫寄存器功能來設(shè)置驅(qū)動器參數(shù)和控制運(yùn)行。驅(qū) 動器支持的功能碼為0x3(讀寄存器)、0x6(寫寄存器)、0x78(寫 目標(biāo)位置)、0x7a(修改設(shè)備地址)。 寄存器列表如下: 

2.Modbus 通信格式 a.modbus 主機(jī)讀取數(shù)據(jù)及從機(jī)應(yīng)答格式 (功能碼 03) 
串口接收到的數(shù)據(jù)都是無符號數(shù),如果寄存器是有符號數(shù), 發(fā)送的則是二進(jìn)制補(bǔ)碼的格式,轉(zhuǎn)換成有符號數(shù)的算法如下(VB 代碼): If modbus.data(11) > 32767 Then disp_modbus_data.PU = (modbus.data(11) - 32768) * 65536 + modbus.data(10) disp_modbus_data.PU = -((&H7FFFFFFF - disp_modbus_data. PU) + 1) Else disp_modbus_data.PU = dmodbus.data(11) * 65536 + modbus. data(10) End If 注 : modbus.data(11) 為目標(biāo)位置高 16 位 modbus.data(10) 為目標(biāo)位置低 16 位 b.modbus 主機(jī)寫數(shù)據(jù)及從機(jī)應(yīng)答格式 ( 功能碼 06) 
c.modbus 主機(jī)寫脈沖數(shù) (功能碼 0x10) 
脈沖數(shù)是有符號數(shù),一個負(fù)數(shù) ( 假設(shè)此數(shù)為 X) 轉(zhuǎn)換成 32 位 16 進(jìn)制數(shù)的算法如下 (vb 代碼 ): If X < 0 Then X = &H7FFFFFFF + (X + 1) PU24_31 = Fix(X / (256 * 65536)) + &H80 Else PU24_31 = Fix(X / (256 * 65536)) End If PU16_23 = Fix(X / 65536) mod 256 PU8_15 = Fix(X / 256) mod 256 PU0_7 = X mod 256 注:fix() 為取整函數(shù) 
d.modbus 主機(jī)寫脈沖數(shù) (特殊功能碼 0x78) 
3.CRC 校驗(yàn)示例代碼 unsigned short CRC16(puchMsg, usDataLen) unsigned char *puchMsg ; /* 要進(jìn)行 CRC 校驗(yàn)的消息 */ unsigned short usDataLen ; /* 消息中字節(jié)數(shù) */ { unsigned char uchCRCHi = 0xFF ; /* 高 CRC 字節(jié)初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低 CRC 字節(jié)初始化 */ unsigned uIndex ; /* CRC 循環(huán)中的索引 */ while (usDataLen--) /* 傳輸消息緩沖區(qū) */ { uIndex = uchCRCHi ^ *puchMsgg++ ; /* 計(jì)算 CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ; uchCRCLo = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } /* CRC 高位字節(jié)值表 */ static unsigned char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC 低位字節(jié)值表 */ static char auchCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } 4.modbus 方式主機(jī)控制過程 a:位置模式 (1)寫 設(shè)備 1(功能碼 0x06 地址 0 Modbus 使能) 1 (2)讀 設(shè)備 1(功能碼 0x03 地址 16 報(bào)警代碼) (讀 到 0 時為運(yùn)行正常) (3)寫 設(shè)備 1(功能碼 0x06 地址 3 電機(jī)目標(biāo)速度)2000 (4)寫 設(shè)備 1(功能碼 0x78 電機(jī)目標(biāo)位置)1000 (5)讀 設(shè)備 1(功能碼 0x03 地址 10 目標(biāo)位置低 16 位) (6)讀 設(shè)備 1(功能碼 0x03 地址 11 目標(biāo)位置高 16 位) 以上兩個寄存器都為 0 時代表已經(jīng)到了目標(biāo)位置 (7)重復(fù)(4)(5)(6)過程,控制電機(jī)位置。 注:電機(jī)的目標(biāo)速度為電機(jī)運(yùn)行的****速度,如果目標(biāo)位置 較小,電機(jī)可能達(dá)不到****速度即停止。加速過程寫入的電機(jī)目標(biāo) 位置是在原剩余的位置上加上新的數(shù)值。例如,第一次寫入 1024 代表運(yùn)行一圈,運(yùn)行到還剩 256,代表還有 1/4 圈要運(yùn)行,但此時 又寫入一個 1024,此時電機(jī)的目標(biāo)位置變成 1024+256 而不是 1024 替代 256。這樣不會因?yàn)檫沒到位又寫入一個數(shù)值而導(dǎo)致出現(xiàn)錯誤。 也可以自己定義誤差范圍,例如到了>-2且<2,就立刻寫入新的數(shù), 這樣在有些定位精度要求低的場合提高定位的速度。 b:速度模式 (1)寫 設(shè)備 1(功能碼 0x06 地址 0 Modbus 使能) 1 (2)讀 設(shè)備 1(功能碼 0x03 地址 14 報(bào)警代碼) (讀到 0 時為運(yùn)行正常) (3)寫 設(shè)備 1(功能碼 0x06 地址 3 電機(jī)加速度) 6000 (4)寫 設(shè)備 1(功能碼 0x06 地址 2 電機(jī)目標(biāo)速度) 2000 (5)重復(fù)(4)過程,控制電機(jī)轉(zhuǎn)速。 5. modbus 方式主機(jī)控制多個從機(jī) a:位置模式 控制多個從機(jī)不同時開始運(yùn)動 (1)寫 設(shè)備 1(功能碼 0x06 地址 0 Modbus 使能) 1 (2)讀 設(shè)備 1(功能碼 0x03 地址 14 報(bào)警代碼) (讀到 0 時為運(yùn)行正常) (3)寫 設(shè)備 2(功能碼 0x06 地址 0 Modbus 使能) 1 (4)讀 設(shè)備 2(功能碼 0x03 地址 14 報(bào)警代碼) (讀 到 0 時為運(yùn)行正常) (5)寫 設(shè)備 1(功能碼 0x06 地址 3 電機(jī)目標(biāo)速度) 2000 (6)寫 設(shè)備 1(功能碼 0x78 電機(jī)目標(biāo)位置) 1000 (7)讀 設(shè)備 1(功能碼 0x03 地址 12 目標(biāo)位置低 16 位) 8)讀 設(shè)備 1(功能碼 0x03 地址 13 目標(biāo)位置高 16 位) 以上兩個寄存器都為 0 時代表已經(jīng)到了目標(biāo)位置 (9)寫 設(shè)備 2(功能碼 0x06 地址 3 電機(jī)目標(biāo)速度 2000 (10)寫 設(shè)備 2(功能碼 0x78 電機(jī)目標(biāo)位置) 1000 (11)讀 設(shè)備2(功能碼0x03 地址12 目標(biāo)位置低16位) (12)讀 設(shè)備2(功能碼0x03 地址13 目標(biāo)位置高16位) 以上兩個寄存器都為 0 時代表已經(jīng)到了目標(biāo)位置 (13)重復(fù)(5)~(12)過程,控制電機(jī)位置。 注:驅(qū)動器的地址需要先設(shè)置,可以通過提供的上位機(jī)設(shè)置 驅(qū)動器地址。由于以上方式在寫了目標(biāo)位置后驅(qū)動器會立刻控制電 機(jī)運(yùn)動,而寫入地址 2 的控制數(shù)據(jù)需要一定時間,所以地址 1 和地 址 2 的電機(jī)不會同時運(yùn)動。如果下一次的運(yùn)行速度不變,可以不必 多次寫入電機(jī)目標(biāo)速度。 b:位置模式 控制多個從機(jī)同時開始運(yùn)動 (1)寫 設(shè)備 1(功能碼 0x06 地址 0 Modbus 使能) 1 (2)讀 設(shè)備1(功能碼0x03 地址14 報(bào)警代碼) (讀 到 0 時為運(yùn)行正常) (3)寫 設(shè)備 2(功能碼 0x06 地址 0 Modbus 使能) 1 (4)讀 設(shè)備 2(功能碼 0x03 地址 14 報(bào)警代碼) (讀 到 0 時為運(yùn)行正常) (5)寫 設(shè)備 1(功能碼 0x06 地址 2 電機(jī)目標(biāo)速度) 2000 (6)寫 設(shè)備 1(功能碼 0x06 地址 3 目標(biāo)位置緩存) 1000 (7)寫 設(shè)備 2 (功能碼 0x06 地址 2 電機(jī)目標(biāo)速度)2000 (8)寫 設(shè)備 2 (功能碼 0x06 地址 3 目標(biāo)位置緩存) 1000 (9)寫 設(shè)備 0(廣播)(功能碼 0x06 地址 1 使能) 1 (10)讀 設(shè)備 1(功能碼 0x03 地址 12 目標(biāo)位置低 16 位) (11)讀 設(shè)備 1(功能碼 0x03 地址 13 目標(biāo)位置高 16 位) 以上兩個寄存器都為 0 時代表已經(jīng)到了目標(biāo)位置 (12)讀 設(shè)備 2(功能碼 0x03 地址 12 目標(biāo)位置低 16 位) (23)讀 設(shè)備 2(功能碼 0x03 地址 13 目標(biāo)位置高 16 位) 以上兩個寄存器都為 0 時代表已經(jīng)到了目標(biāo)位置 (13)重復(fù)(5)~(13)過程,控制電機(jī)位置。 上位機(jī)軟件使用說明 本驅(qū)動器提供一個上位機(jī)軟件,用于監(jiān)測和測試驅(qū)動器? 以通過軟件查看和設(shè)置驅(qū)動器內(nèi)部參數(shù)。 
如上圖所示,軟件分為波形顯示,電機(jī)運(yùn)行參數(shù)等幾個部分。 下面介紹一下各個部分的功能和作用。 波形顯示:一共有 4 個通道,分別用 4 種顏色表示。顏色和 電機(jī)運(yùn)行參數(shù) 內(nèi)的字體顏、色相同。即:藍(lán)表示電流,綠表示輸 出的脈寬,紅表示當(dāng)前轉(zhuǎn)速,黑表示電壓。 電機(jī)運(yùn)行參數(shù):表示電機(jī)運(yùn)行的實(shí)時數(shù)據(jù)。 驅(qū)動器設(shè)置參數(shù):顯示驅(qū)動器的撥碼開關(guān),和方向使能設(shè)置。 如果是 modbus 模式,此欄無效。 驅(qū)動器運(yùn)行狀態(tài):此欄會顯示驅(qū)動器的報(bào)警狀態(tài),如果沒有 報(bào)警會顯示運(yùn)行正常。 Modbus 控制參數(shù):此欄內(nèi)的參數(shù)是驅(qū)動器內(nèi)部的參數(shù),如果 要修改這些參數(shù),必須先對 modbus 使能寫 1。具體的參數(shù)含義參考 寄存器說明。 Modbus 讀。捍藱诳稍O(shè)定驅(qū)動器的地址,讀取驅(qū)動器數(shù)據(jù)的 周期,和是否讀取。 Modbus發(fā)送:此欄用于修改驅(qū)動器參數(shù),首先選定參數(shù)類型, 再設(shè)定好參數(shù)數(shù)據(jù),然后點(diǎn)發(fā)送即可。 上位機(jī)測試如何開始 1. 連接需要的信號
1. 插上電機(jī)動力線和編碼器線 2. 驅(qū)動器上+VDC 和 GND接上電源,電源根據(jù)電機(jī)的額定電壓來, 電機(jī)額定電壓 36V 就接 36V. 3 插入附帶的 USB 轉(zhuǎn) 485 線在電腦的 485 接口上,另外一端插驅(qū)動 器上 2. 安裝驅(qū)動和上位機(jī)軟件
1. 安裝 USB 線驅(qū)動程序,在光盤中, 。安裝好后,插入 附帶的 USB 轉(zhuǎn) 485 線在電腦的 485 接口上,另外一端插驅(qū)動器上, 然后在電腦中的設(shè)備管理器中查看分配的 COM 口號。如下圖所示為 COM2 
2. 安裝電腦上位機(jī)軟件, 安裝好后打開。在驅(qū)動 器運(yùn)行狀態(tài)中選擇剛剛在設(shè)備管理器中看到的 COM 口號,這個是 COM2。正常的話可以讀到數(shù)據(jù)。如下圖所示: 
3. 試運(yùn)行 重新上電,然后在上位機(jī)中如操作 選擇 modbus 使能 參數(shù)數(shù)據(jù)輸入 1 點(diǎn)發(fā)送 選擇 PU 步數(shù) 參數(shù)數(shù)據(jù)輸入 4000 點(diǎn)發(fā)送 (1000 線編碼器,經(jīng)過內(nèi)部倍頻后有 4000 脈沖一圈)上面發(fā)送 4000 電機(jī)會轉(zhuǎn)一圈,發(fā)送 -4000 發(fā)轉(zhuǎn)一圈。 這個是試運(yùn)行,具體 需要什么控制方式,可以查看說明書。 常見問題處理 1. 如果脈沖控制端口 DIR 導(dǎo)通方向和我所需要的方向不同怎 么改? 答:可以通過上位機(jī)來設(shè)置 DIR 的極性,接上上位機(jī)后, modbus 使能寫 1 , DIR 極性 寫 0. 最后參數(shù)保存標(biāo)志寫 1. 重新 上電即可。 2. 上電驅(qū)動器不報(bào)警,給運(yùn)行脈沖后驅(qū)動器報(bào)警,怎么回事? 答:檢查接插件是否松動,電機(jī) UVW 和編碼器線任何一根斷 或順序交換都會無法正常運(yùn)行。 3. 怎么通過上位機(jī)控制運(yùn)行 答:連接好電機(jī),驅(qū)動器上電,通過提供的 USB 線連接驅(qū)動 器和電腦,根據(jù)“上位機(jī)使用說明”設(shè)置好,使得上位機(jī)能讀取到 數(shù)據(jù)后。 Modbus 使能 發(fā)送 1。然后 PU 步數(shù) 發(fā)送需要走的距離。
|