Modbus 控制方式 1.寄存器说明 驱动器可以通过 modbus(RTU 模式)来控制驱动器。主机可以 通过 modbus 的读写寄存器功能来设置驱动器参数和控制运行。驱 动器支持的功能码为0x3(读寄存器)、0x6(写寄存器)、0x78(写 目标位置)、0x7a(修改设备地址)。 寄存器列表如下: 2.Modbus 通信格式 a.modbus 主机读取数据及从机应答格式 (功能码 03) 串口接收到的数据都是无符号数,如果寄存器是有符号数, 发送的则是二进制补码的格式,转换成有符号数的算法如下(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) c.modbus 主机写脉冲数 (功能码 0x10) 脉冲数是有符号数,一个负数 ( 假设此数为 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() 为取整函数 d.modbus 主机写脉冲数 (特殊功能码 0x78) 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)过程,控制电机位置。 上位机软件使用说明 本驱动器提供一个上位机软件,用于监测和测试驱动器。可 以通过软件查看和设置驱动器内部参数。 如上图所示,软件分为波形显示,电机运行参数等几个部分。 下面介绍一下各个部分的功能和作用。 波形显示:一共有 4 个通道,分别用 4 种颜色表示。颜色和 电机运行参数 内的字体颜、色相同。即:蓝表示电流,绿表示输 出的脉宽,红表示当前转速,黑表示电压。 电机运行参数:表示电机运行的实时数据。 驱动器设置参数:显示驱动器的拨码开关,和方向使能设置。 如果是 modbus 模式,此栏无效。 驱动器运行状态:此栏会显示驱动器的报警状态,如果没有 报警会显示运行正常。 Modbus 控制参数:此栏内的参数是驱动器内部的参数,如果 要修改这些参数,必须先对 modbus 使能写 1。具体的参数含义参考 寄存器说明。 Modbus 读取:此栏可设定驱动器的地址,读取驱动器数据的 周期,和是否读取。 Modbus发送:此栏用于修改驱动器参数,首先选定参数类型, 再设定好参数数据,然后点发送即可。 上位机测试如何开始 1. 连接需要的信号
1. 插上电机动力线和编码器线 2. 驱动器上+VDC 和 GND接上电源,电源根据电机的额定电压来, 电机额定电压 36V 就接 36V. 3 插入附带的 USB 转 485 线在电脑的 485 接口上,另外一端插驱动 器上 2. 安装驱动和上位机软件
1. 安装 USB 线驱动程序,在光盘中, 。安装好后,插入 附带的 USB 转 485 线在电脑的 485 接口上,另外一端插驱动器上, 然后在电脑中的设备管理器中查看分配的 COM 口号。如下图所示为 COM2 2. 安装电脑上位机软件, 安装好后打开。在驱动 器运行状态中选择刚刚在设备管理器中看到的 COM 口号,这个是 COM2。正常的话可以读到数据。如下图所示: 3. 试运行 重新上电,然后在上位机中如操作 选择 modbus 使能 参数数据输入 1 点发送 选择 PU 步数 参数数据输入 4000 点发送 (1000 线编码器,经过内部倍频后有 4000 脉冲一圈)上面发送 4000 电机会转一圈,发送 -4000 发转一圈。 这个是试运行,具体 需要什么控制方式,可以查看说明书。 常见问题处理 1. 如果脉冲控制端口 DIR 导通方向和我所需要的方向不同怎 么改? 答:可以通过上位机来设置 DIR 的极性,接上上位机后, modbus 使能写 1 , DIR 极性 写 0. 最后参数保存标志写 1. 重新 上电即可。 2. 上电驱动器不报警,给运行脉冲后驱动器报警,怎么回事? 答:检查接插件是否松动,电机 UVW 和编码器线任何一根断 或顺序交换都会无法正常运行。 3. 怎么通过上位机控制运行 答:连接好电机,驱动器上电,通过提供的 USB 线连接驱动 器和电脑,根据“上位机使用说明”设置好,使得上位机能读取到 数据后。 Modbus 使能 发送 1。然后 PU 步数 发送需要走的距离。
|