专业的微特电机产品发布平台
用户名: 密码: 注册
设为首页 加入收藏 联系我们
免费注册 企业免费建站
新技术论坛 会员产品发布
TB6600QQ群:70241714   步进电机论文   六轴工业机器人解决方案  
步进电机     驱动器     控制器     马达IC     伺服电机     无刷直流电动机     微特电机文献     工控器件     运动控制新产品     六轴工业机器人    
 当前位置:首页--无刷直流电机型号大全--
Modbus 控制方式(ZHM)
2017年9月4日

Modbus 控制方式

1.寄存器说明

    驱动器可以通过 modbus(RTU 模式)来控制驱动器。主机可以

通过 modbus 的读写寄存器功能来设置驱动器参数和控制运行。驱

动器支持的功能码为0x3(读寄存器)、0x6(写寄存器)、0x78(写

目标位置)、0x7a(修改设备地址)。

寄存器列表如下:

blob.png

blob.png

2.Modbus 通信格式

a.modbus 主机读取数据及从机应答格式 (功能码 03)

blob.png

串口接收到的数据都是无符号数,如果寄存器是有符号数,

发送的则是二进制补码的格式,转换成有符号数的算法如下(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) 为目标位置高 16 位 modbus.data(10)

为目标位置低 16 位

   b.modbus 主机写数据及从机应答格式 ( 功能码 06)

blob.png

    c.modbus 主机写脉冲数 (功能码 0x10)

blob.png

    脉冲数是有符号数,一个负数 ( 假设此数为 X) 转换成 32 位

16 进制数的算法如下 (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() 为取整函数

blob.png

    d.modbus 主机写脉冲数 (特殊功能码 0x78)

blob.png

3.CRC 校验示例代码

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg ; /* 要进行 CRC 校验的消息 */

unsigned short usDataLen ; /* 消息中字节数 */

{

unsigned char uchCRCHi = 0xFF ; /* 高 CRC 字节初始化 */

unsigned char uchCRCLo = 0xFF ; /* 低 CRC 字节初始化 */

unsigned uIndex ; /* CRC 循环中的索引 */

while (usDataLen--) /* 传输消息缓冲区 */

{

uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算 CRC */

uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;

uchCRCLo = auchCRCLo[uIndex] ;

}

return (uchCRCHi << 8 | uchCRCLo) ;

}

    /* CRC 高位字节值表 */

    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 低位字节值表 */

    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 方式主机控制过程

a:位置模式

(1)写 设备 1(功能码 0x06 地址 0 Modbus 使能) 1

(2)读 设备 1(功能码 0x03 地址 16 报警代码) (读

到 0 时为运行正常)

(3)写 设备 1(功能码 0x06 地址 3 电机目标速度)2000

(4)写 设备 1(功能码 0x78 电机目标位置)1000

(5)读 设备 1(功能码 0x03 地址 10 目标位置低 16 位)

(6)读 设备 1(功能码 0x03 地址 11 目标位置高 16 位)

以上两个寄存器都为 0 时代表已经到了目标位置

(7)重复(4)(5)(6)过程,控制电机位置。

注:电机的目标速度为电机运行的****速度,如果目标位置

较小,电机可能达不到****速度即停止。加速过程写入的电机目标

位置是在原剩余的位置上加上新的数值。例如,第一次写入 1024

代表运行一圈,运行到还剩 256,代表还有 1/4 圈要运行,但此时

又写入一个 1024,此时电机的目标位置变成 1024+256 而不是 1024

替代 256。这样不会因为还没到位又写入一个数值而导致出现错误。

也可以自己定义误差范围,例如到了>-2且<2,就立刻写入新的数,

这样在有些定位精度要求低的场合提高定位的速度。

b:速度模式

(1)写 设备 1(功能码 0x06 地址 0 Modbus 使能) 1

(2)读 设备 1(功能码 0x03 地址 14 报警代码) (读到

0 时为运行正常)

(3)写 设备 1(功能码 0x06 地址 3 电机加速度) 6000

(4)写 设备 1(功能码 0x06 地址 2 电机目标速度) 2000

(5)重复(4)过程,控制电机转速。

5. modbus 方式主机控制多个从机

a:位置模式 控制多个从机不同时开始运动

(1)写 设备 1(功能码 0x06 地址 0 Modbus 使能) 1

(2)读 设备 1(功能码 0x03 地址 14 报警代码) (读到

0 时为运行正常)

(3)写 设备 2(功能码 0x06 地址 0 Modbus 使能) 1

(4)读 设备 2(功能码 0x03 地址 14 报警代码) (读

到 0 时为运行正常)

(5)写 设备 1(功能码 0x06 地址 3 电机目标速度) 2000

(6)写 设备 1(功能码 0x78 电机目标位置) 1000

(7)读 设备 1(功能码 0x03 地址 12 目标位置低 16 位)

8)读 设备 1(功能码 0x03 地址 13 目标位置高 16 位)

以上两个寄存器都为 0 时代表已经到了目标位置

(9)写 设备 2(功能码 0x06 地址 3 电机目标速度 2000

(10)写 设备 2(功能码 0x78 电机目标位置) 1000

(11)读 设备2(功能码0x03 地址12 目标位置低16位)

(12)读 设备2(功能码0x03 地址13 目标位置高16位)

以上两个寄存器都为 0 时代表已经到了目标位置

(13)重复(5)~(12)过程,控制电机位置。

注:驱动器的地址需要先设置,可以通过提供的上位机设置

驱动器地址。由于以上方式在写了目标位置后驱动器会立刻控制电

机运动,而写入地址 2 的控制数据需要一定时间,所以地址 1 和地

址 2 的电机不会同时运动。如果下一次的运行速度不变,可以不必

多次写入电机目标速度。

b:位置模式 控制多个从机同时开始运动

(1)写 设备 1(功能码 0x06 地址 0 Modbus 使能) 1

(2)读 设备1(功能码0x03 地址14 报警代码) (读

到 0 时为运行正常)

(3)写 设备 2(功能码 0x06 地址 0 Modbus 使能) 1

(4)读 设备 2(功能码 0x03 地址 14 报警代码) (读

到 0 时为运行正常)

(5)写 设备 1(功能码 0x06 地址 2 电机目标速度) 2000

(6)写 设备 1(功能码 0x06 地址 3 目标位置缓存) 1000

(7)写 设备 2 (功能码 0x06 地址 2 电机目标速度)2000

(8)写 设备 2 (功能码 0x06 地址 3 目标位置缓存) 1000

(9)写 设备 0(广播)(功能码 0x06 地址 1 使能) 1

(10)读 设备 1(功能码 0x03 地址 12 目标位置低 16 位)

(11)读 设备 1(功能码 0x03 地址 13 目标位置高 16 位)

以上两个寄存器都为 0 时代表已经到了目标位置

(12)读 设备 2(功能码 0x03 地址 12 目标位置低 16 位)

(23)读 设备 2(功能码 0x03 地址 13 目标位置高 16 位)

以上两个寄存器都为 0 时代表已经到了目标位置

(13)重复(5)~(13)过程,控制电机位置。

上位机软件使用说明

本驱动器提供一个上位机软件,用于监测和测试驱动器。可

以通过软件查看和设置驱动器内部参数。

blob.png

如上图所示,软件分为波形显示,电机运行参数等几个部分。

下面介绍一下各个部分的功能和作用。

波形显示:一共有 4 个通道,分别用 4 种颜色表示。颜色和

电机运行参数 内的字体颜、色相同。即:蓝表示电流,绿表示输

出的脉宽,红表示当前转速,黑表示电压。

电机运行参数:表示电机运行的实时数据。

驱动器设置参数:显示驱动器的拨码开关,和方向使能设置。

如果是 modbus 模式,此栏无效。

驱动器运行状态:此栏会显示驱动器的报警状态,如果没有

报警会显示运行正常。

Modbus 控制参数:此栏内的参数是驱动器内部的参数,如果

要修改这些参数,必须先对 modbus 使能写 1。具体的参数含义参考

寄存器说明。

Modbus 读取:此栏可设定驱动器的地址,读取驱动器数据的

周期,和是否读取。

Modbus发送:此栏用于修改驱动器参数,首先选定参数类型,

再设定好参数数据,然后点发送即可。

上位机测试如何开始

1. 连接需要的信号

1. 插上电机动力线和编码器线

2. 驱动器上+VDC 和 GND接上电源,电源根据电机的额定电压来,

电机额定电压 36V 就接 36V.

3 插入附带的 USB 转 485 线在电脑的 485 接口上,另外一端插驱动

器上

2. 安装驱动和上位机软件

1. 安装 USB 线驱动程序,在光盘中,blob.png 。安装好后,插入

附带的 USB 转 485 线在电脑的 485 接口上,另外一端插驱动器上,

然后在电脑中的设备管理器中查看分配的 COM 口号。如下图所示为

COM2

blob.png

2. 安装电脑上位机软件,blob.png

安装好后打开。在驱动

器运行状态中选择刚刚在设备管理器中看到的 COM 口号,这个是

COM2。正常的话可以读到数据。如下图所示:

blob.png

3. 试运行

重新上电,然后在上位机中如操作

选择 modbus 使能 参数数据输入 1 点发送

选择 PU 步数 参数数据输入 4000 点发送

(1000 线编码器,经过内部倍频后有 4000 脉冲一圈)上面发送

4000 电机会转一圈,发送 -4000 发转一圈。 这个是试运行,具体

需要什么控制方式,可以查看说明书。

 常见问题处理

1. 如果脉冲控制端口 DIR 导通方向和我所需要的方向不同怎

么改?

答:可以通过上位机来设置 DIR 的极性,接上上位机后,

modbus 使能写 1 , DIR 极性 写 0. 最后参数保存标志写 1. 重新

上电即可。

2. 上电驱动器不报警,给运行脉冲后驱动器报警,怎么回事?

答:检查接插件是否松动,电机 UVW 和编码器线任何一根断

或顺序交换都会无法正常运行。

3. 怎么通过上位机控制运行

答:连接好电机,驱动器上电,通过提供的 USB 线连接驱动

器和电脑,根据“上位机使用说明”设置好,使得上位机能读取到

数据后。 Modbus 使能 发送 1。然后 PU 步数 发送需要走的距离。


设为首页   |   加入收藏   |   联系我们   |   站长留言   |   广告服务   |   友情链接   |   免费展示
网站实名:步进电机网 步进电机驱动器网 微特电机网 网站地图 新闻中心
版权所有:北京时代四维科技有限公司
© Copyright By www.zgbjdj.com
京ICP备11042559号-1