常用寄存器介绍
matt 2024-11-06
什么是Modbus?
Modbus是一种串行通信协议,由Modicon公司于1979年发明,是用于连接工业电子设备的最广泛使用的协议之一。它允许不同制造商生产的设备之间进行数据交换,支持的数据类型包括数字输入输出状态、模拟量值等。Modbus协议简单、开放,易于实现,因此在自动化控制领域得到了广泛应用。
四种寄存器是什么?
寄存器类型 | 相对地址范围 | 绝对地址范围 | 读写属性 |
---|---|---|---|
线圈(Coils) | 00001-09999 | 0x0000-0x270F | 可读可写 |
离散输入(Discrete Input) | 10001-19999 | 0x1000-0x270F | 只读 |
保持寄存器(Holding Registers) | 40001-49999 | 0x10000-0x1FFFF | 可读可写 |
输入寄存器(Input Registers) | 30001-39999 | 0x08000-0x0FFFF | 只读 |
在Modbus协议中,存在四种主要的寄存器类型,每种寄存器都有其特定的功能和使用场景:
1. 线圈(Coils):
• 读写:读写
• 特点:线圈通常用于表示二进制状态,如开关或接触器的状态。每个线圈占用一个位,可以表示两种状态:开启(1)或关闭(0)。
• 使用场景:适用于需要远程控制的数字信号,例如启动/停止电机、打开/关闭阀门等。
2. 离散输入(Discrete Inputs):
• 读写:只读
• 特点:与线圈类似,离散输入也代表二进制状态,但它反映的是设备内部的状态或外部传感器的状态,不能被外部修改。
• 使用场景:常用于监测系统状态,如检测门是否关闭、机器是否运行等。
3. 保持寄存器(Holding Registers):
• 读写:读写
• 特点:保持寄存器用于存储可以被读取和写入的数据值,通常用于保存模拟量值,如温度、压力等。
• 使用场景:适用于需要频繁读写的数据,例如调整控制器参数、记录测量值等。
4. 输入寄存器(Input Registers):
• 读写:只读
• 特点:输入寄存器用于存储只能被读取的数据值,这些数据通常来源于传感器或其他外部设备,反映了系统的实际状态。
• 使用场景:适合用于监控系统运行状态,如读取温度传感器的数据、电流表的读数等。
总结
- Modbus协议通过定义不同的寄存器类型来满足各种工业控制需求。线圈和保持寄存器支持读写操作,能够实现对设备状态的远程控制和参数设置;而离散输入和输入寄存器则提供了一种查看设备状态或外部条件的方式,但不允许直接修改。了解这四种寄存器的特点及其应用场景,对于设计高效、可靠的工业控制系统至关重要。随着技术的发展,Modbus协议也在不断进化,以适应更加复杂的应用需求。
在以上四种的基础上,可细分为8种,如下:
0x01 | 读线圈寄存器 | 对应json指令的read_coils |
---|---|---|
0x02 | 读离散输入寄存器 | 对应json指令的read_input_status |
0x03 | 读保持寄存器 | 对应json指令的read_holding_registers |
0x04 | 读输入寄存器 | 对应json指令的read_input_registers |
0x05 | 写单个线圈寄存器 | 对应json指令的write_single_coil |
0x06 | 写单个保持寄存器 | 对应json指令的write_single_register |
0x0f | 写多个线圈寄存器 | 对应json指令的write_coils |
0x10 | 写多个保持寄存器 | 对应json指令的write_registers |
接下来我们将以支持modbus rtu通信的舵机为例:
该舵机支持 modbus的0x03(读保持寄存器)、0x06(写单个寄存器)、0x10(写多个寄存器),0x83(异常码),异常码支持0x01(操作码错误)与0x02(地址错误)。
舵机使用MODBUS-RTU标准协议,出厂时的串口默认配置,特率默认为115200,数据位 8,无校验,停止位 1;波特率可配置范围9600~256Kbps,默认通信地址(站号)为1。
下图为寄存器表:
1,版本信息
2,EPROM配置
3,SRAM控制
4,SRAM反馈
5,出厂参数
6 特殊字节解释
6.1 舵机相位
• 位数/位权重:说明
• BIT0(1):驱动方向相位;(0)正向,(1)反向
• BIT1(2):驱动桥模式;(0)无刷,(1)有刷,重启生效
• BIT2(4):----
• BIT3(8):----
• BIT4(16):角度反馈模式;(0)反馈单圈角度,(1)反馈全角度
• BIT5(32):
• BIT6(64):PWM频率,(0)24kHz无死区,(1)16kHz有死区
• BIT7(128):伺服方向,(0)正向,(1)反向
• 如果同时设置多个位,舵机的相位值为各个位值之和。例如:原相位值为0,舵机运行反向,则相位值为128+1=129;
6.2 舵机状态
舵机状态:0表示正常,1表示异常
• 位数/位权重:说明
• BIT0(1):电压状态
• BIT1(2):磁编码状态
• BIT2(4):温度状态
• BIT3(8):电流状态
• BIT4(16):扭矩状态:0表示扭矩关闭,1表示扭矩打开
• BIT5(32):负载状态
• 如果同时有多种状态,舵机的状态值为各个位值之和。例如:电压过压/欠压与舵机过热,则舵机状态值为4+1=5;
6.3 卸载条件
卸载条件:0表示关闭,1表示开启
• 位数/位权重:说明
• BIT0(1):电压保护
• BIT1(2):磁编码保护
• BIT2(4):过热保护
• BIT3(8):过流保护
• BIT4(16):----
• BIT5(32):负载过载
• 如果同时设置多个位,舵机的卸载条件值为各位值之和。例如:电压保护与过热保护同时开启,则卸载条件值为4+1=5;
6.4 LED报警条件
LED报警条件:0表示关闭,1表示开启
• 位数/位权重:说明
• BIT0(1):电压报警
• BIT1(2):磁编码报警
• BIT2(4):过热报警
• BIT3(8):过流报警
• BIT4(16):----
• BIT5(32):负载过载报警
• 如果同时设置多个位,舵机的LED报警条件值为各位值之和。例如:电压报警与过热报警同时开启,则报警条件值为4+1=5;
6.5 故障复位
故障复位:0无效,1表示复位
• 位数/位权重:说明
• BIT0(1):复位过载故障
• BIT1(2):复位过流故障
• BIT2(4):中位设置,当前位置设置为2048中位
• 如果同时设置多个位,复位过载故障与复位过流故障的值为各位值之和。例如:复位过载故障同时复位过流故障,则复位故障值为1+2=3;
参考链接:
磁编码SMSMD-内存表解析:
http://ftdoc.longbos.com/#/prodinfodownload?srcType=FT-SMSMD-emanual-991dbd0a55b14e7f84baf0c0
MODBUS-RTU协议:
http://ftdoc.longbos.com/#/prodinfodownload?srcType=FT-MODBUS-PROT-43ac6d5a788f457ab27d0d96
7,JSON指令
根据寄存器地址抓换为JSON指令如下:
*******使用前需要设置末端24V电源输出*******
{"command":"set_tool_voltage","voltage_type":3} //设置工具端电源输出 24V
配置通讯端口 ModbusRTU 模式
{"command":"set_modbus_mode","port":1,"baudrate":115200,"timeout ":2}
读当前位置,单位是度
{"command":"read_holding_registers","port":1,"address":257,"device":1}
读当前电流
{"command":"read_holding_registers","port":1,"address":263,"device":1}
读当前电压
{"command":"read_holding_registers","port":1,"address":260,"device":1}
返回值 {"command":"read_holding_registers","data":227}
227为22.7V
读当前温度
{"command":"read_holding_registers","port":1,"address":261,"device":1}
目标位置控制,舵机回到0*0.0879度,
{"command":"write_single_register","port":1,"address":128,"data":0,"device":1}
目标位置控制,舵机转360度,360/0.0879=4095
{"command":"write_single_register","port":1,"address":128,"data":4095,"device":1}
"port":1 代表机械臂末端接口板RS485接口为RTU主站
"address":128,代表寄存器地址 0x80
"data":代表写入寄存器的数据
运动360度,将360除以单位0.0879等于4095,写入“data“
"device":1 代表设备通信地址
目标位置控制,舵机转-360度,-360/0.0879=-4095
{"command":"write_registers","port":1,"address":128,"num":2,"data":[0, 240, 0, 1],"device":1}
"port":1 代表机械臂末端接口板RS485接口为RTU主站
"address":128,代表寄存器地址 0x80
"num":1,代表写入到地址128的寄存器数量为 2
"data":代表写入寄存器的数据
运动-360度,将-360除以单位0.0879等于-4095,负数取补码后写入“data“
"device":1 代表设备通信地址
解析:
负数取补码
例:给出-100,求其16进制的补码。
先求正数100的16进制为:0X64,
然后套用公式:FFFF-0064+1=FF9C。
FF9C即为所求。
根据以上换算得出-4095的补码是F001
将F001分为F0和01,十六进制转换F0为十进制为240,01十六进制转换为十进制为01。
以上JSON指令可以通过网络串口调试助手、python和示教器下发控制。
撰写评论