Modbus RTU Analog Input 8CH

来自Waveshare Wiki
跳转至: 导航搜索

说明

Modbus RTU Relay
{{{name2}}}
{{{name3}}}
功能简介
特性 RS485 模拟量采集模块
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
接口 RS485

硬件说明

  • 每个通道都可以单独配置量程,输入量程可灵活选择更方便用户使用。
    AIN+为正端输入,AIN-为负端输入,模块支持差分输入和单端输入,单独输入时AIN-接地。

Modbus-RTU-Analog-Input-6.png
特别注意:当输入源为不同电源时,要接地线共地,否则采集到的数据会不准确。

  • 打开设备外壳可以发现在靠近设备端子处有跳线,分别对应AI1~AI8八个通道,需要根据测量信号选择跳线模式,否则测量数据不准确。
    • 测量电压信号时,对应通道的跳线断开;
    • 测量电流信号时,对应通道的跳线闭合;

Modbus-RTU-Analog-Input-5.png

  • Modbus RTU Analog Input 8CH 默认为电流模式,跳线闭合;Modbus RTU Analog Input 8CH (B)默认为电压模式,跳线断开。

版本对比

  • 目前模拟输入系列有两个版本,分别默认为电流输入和电压输入。

Modbus-RTU-Analog-Input-8CH-compare.jpg
Modbus-RTU-Analog-Input-8CH-compare2.jpg

版本 Modbus RTU Analog Input 8CH Modbus RTU Analog Input 8CH (B)
默认模式 8路电流模式,0~20mA 8路电压模式,0~10V
量程 0~5V/1~5V
0~20mA/4~20mA
0~10V/2~10V
0~20mA/4~20mA
分辨率 12-bit 12-bit
电流采样电阻 249Ω 499Ω
运放比例 32.4/49.9 10/32.4
通道 8-AI 8-AI
  • 每个版本有0~4五种量程模式,
模式 Modbus RTU Analog Input 8CH Modbus RTU Analog Input 8CH (B)
0 0~5V电压模式 0~10V电压模式
1 1~5V电压模式 2~10V电压模式
2 0~20mA电流模式 0~20mA电流模式
3 4~20mA电流模式 4~20mA电流模式
4 4096量程码模式 4096量程码模式
  • 量程码为AD采集到的数据,需要经过线性转换才能得到电压或者电流数据,换算公式如下。
    • 电压=量程码*3300/4095/运放比例
    • 电流=电压/采样电阻

硬件连接

  • 将USB TO 485和目标板通过杜邦线,将A-->A和B-->B相连,如下图所示:

Modbus-RTU-Analog-Input-8CH-test-01.jpg

软件测试

SSCOM串口调试助手

  • 下载SSCOM 串口调试助手并在电脑上打开,打开对应的端口号,设置波特率为9600,选择hex发送和接收。
    发送如下指令,正常就会返回八路模拟输入数据。
01 04 00 00 00 08 F1 CC

Modbus-RTU-Analog-Input-1.png

  • 如果需要发送其他命令则选择HEX发送,加检验选择ModbusCRC16校验,输入命令的前六个字节点击发送则会自动添加CRC校验码。
    例如发送如下指令,可以设置通道1为4-20mA电流输入模式。
01 06 10 00 00 03

Modbus-RTU-Analog-Input-7.png

  • 更多详细的控制指令请查看请查看开发协议。

Modbus Poll软件

  • 串口软件不方便观察数据,可以选择Modbus Poll软件读取数据。下载并安装Modbus Poll软件。
  • 打开软件,选择setup->Read/Write Definition,Slave ID选择实际设备地址,Function选择04功能码,Quantity改为8通道。点击OK确认。

Modbus-RTU-Analog-Input-2.png

  • 选择Connection->Connect...,选择对应的串口,波特率为9600,八位无校验模式。点击OK连接。

Modbus-RTU-Analog-Input-3.png

  • 连接正常后则可以显示1-8通道模拟输入数据。

Modbus-RTU-Analog-Input-4.png

  • Modbus RTU Analog Input 8CH (A)默认显示的是电流,单位uA;Modbus RTU Analog Input 8CH (B)默认显示的是电压,单位mV。
  • 选择File-New新建一个窗口,选择setup->Read/Write Definition,Slave ID选择实际设备地址,Function选择16功能码,Address Mode选择Hex,Address改为1000,Quantity改为8通道。点击OK确认。

Modbus-RTU-Analog-Input-8.png

  • 新建窗口2可以设置各种通道的量程模式,例如将1通道模式设置为2,即0~20mA电流模式。窗口1通道1也将显示为电流。

注意:改变电流电压模式需要更改内部跳线,否则测量数据会不准确。
Modbus-RTU-Analog-Input-9.png

程序测试

注意:RS485不可以直接接到树莓派的串口否则可能烧毁设备,需要加485电平转换,树莓派建议搭配RS485 CAN HAT模块使用,NUCLEO-F103RB和Arduino建议搭配RS485 CAN Shield模块使用

树莓派

打开树莓派终端,输入以下指令进入配置界面

sudo raspi-config
选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
L76X GPS Module rpi serial.png

然后重启树莓派:

sudo reboot

打开/boot/config.txt文件,找到如下配置语句使能串口,如果没有,可添加在文件最后面。

enable_uart=1

对于树莓派3B用户,串口用于蓝牙,需要注释掉:

#dtoverlay=pi3-miniuart-bt

然后重启树莓派:

sudo reboot

将RS485 CAN HAT模块插到树莓派,把ModBus RTU Relay模块和RS485 CAN HAT模块的A与B对应连接
如果使用的是其他的485设备,确定连线A-A,B-B即可
运行如下命令运行程序

sudo apt-get install unzip
sudo apt-get install python3-pip
pip install modbus_tk
wget https://www.waveshare.net/w/upload/1/14/Modbus_RTU_Analog_Input_Code.zip
unzip Modbus_RTU_Analog_Input_Code.zip
cd Modbus_RTU_Analog_Input_Code/Python3
sudo python3 modbus.py

STM32

STM32的例程是基于NUCLEO-F103RB和RS485 CAN Shield模块。
找到STM32程序文件目录并打开STM32工程。注意使用前先确保电脑已经安装好keil5软件,下载将程序下载到开发板即可。
正常运行串口将会输出八个通道采集到的数据。

Arduino

Arduino例程是基于NUO PLUS和RS485 CAN Shield模块。
使用Arduino IDE 打开程序,选择对应的开发板然后下载程序。
正常运行串口将会输出八个通道采集到的数据。

开发协议 V2

功能码介绍

功能码 备注
03 读取保持寄存器
04 读取输入寄存器
06 写单个保持寄存器
10 写多个保持寄存器

寄存器地址介绍

地址(HEX) 地址存储内容 寄存器取值 权限 Modbus 功能码
3x0000
……
3x0007
道通1~通道8输入数据 读取数值为无符号十六进制 0x04
4x1000
……
4x1007
道通1~通道8数据类型 0x0000~0x0004五种量程范围 读/写 0x03,0x06,0x10
4x2000 串口参数 高八位为校验方式:0x00~0x02
低八位为波特率方式:0x00~0x07
读/写 0x03,0x06
4x4000 设备地址 直接存储 Modbus 地址
设备地址:0x0001-0x00FF
读/写 0x03,0x06
4x8000 软件版本 转为十进制然后小数点左移两位即表示软件版本
0x0064 = 100 = V1.00
0x03

操作指令介绍

读取模拟输入指令

发送码:01 04 00 00 00 08 F1 CC

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
04 04指令 读取输入寄存器
00 00 寄存器起始地址 0x0000 - 0x0007对应1~8输入通道
00 08 寄存器数量 读取寄存器数量,不能超过最大通道数量
F1 CC CRC16 前6字节数据的CRC16校验和

返回码: 01 04 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 2C

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
04 04指令 读取输入寄存器
10 字节数量 数据长度
00 00
……
00 00
寄存器数据 表示0 - 7 通道采集模拟量的数值
无符号十六位标识一个通道,高位在前,低位在后
数据范围根据输出数据类型确定
55 2C CRC16 前6字节数据的CRC16校验和

示例:[1号地址设备]

读取1-8通道 : 01 04 00 00 00 08 F1 CC
读取  1通道 : 01 04 00 00 00 01 31 CA
读取  2通道 : 01 04 00 01 00 01 60 0A
读取3-5通道 : 01 04 00 02 00 03 11 CB

读取通道数据类型指令

发送码:01 03 10 00 00 08 40 CC

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读取保持寄存器
10 00 寄存器起始地址 0x1000 - 0x1007对应1~8输入通道
00 08 寄存器数量 读取寄存器数量,不能超过最大通道数量
40 CC CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 03 10 00 02 00 02 00 02 00 02 00 02 00 02 00 02 00 02 09 C3

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读保持寄存器
10 字节数 返回状态信息的所有字节数。
00 02
……
00 02
数据类型 表示0 - 7 通道数据类型,0x0000~0x0004表示五种量程范围
0x0000:量程0~5V,输出范围0~5000,单位mV;
0x0001:量程1~5V,输出范围1000~5000,单位mV;
0x0002:量程0~20mA,输出范围0~20000,单位uA;
0x0003:量程4~20mA,输出范围4000~20000,单位uV;
0x0004:直接输出数值码,输出范围0~4096,需要经过线性转换才能得到实际测量电压和电流;
09 C3 CRC16 前 6 字节数据的 CRC16 校验和

示例:[1号地址设备]

读取1-8通道数据类型 : 01 03 10 00 00 08 40 CC
读取  1通道数据类型 : 01 03 10 00 00 01 80 CA
读取  2通道数据类型 : 01 03 10 01 00 01 D1 0A
读取3-5通道数据类型 : 01 03 10 02 00 03 A0 CB

设置单通道数据类型指令

发送码:01 06 10 00 00 03 CD 0B

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 写单个寄存器指令
10 00 寄存器起始地址 0x1000 - 0x1007对应1~8输入通道输出数据类型
00 03 通道数据类型 通道数据类型,0x0000~0x0004表示五种量程范围
0x0000:量程0~5V,输出范围0~5000,单位mV;
0x0001:量程1~5V,输出范围1000~5000,单位mV;
0x0002:量程0~20mA,输出范围0~20000,单位uA;
0x0003:量程4~20mA,输出范围4000~20000,单位uA;
0x0004:直接输出数值码,输出范围0~4096,需要经过线性转换才能得到实际测量电压和电流;
CD 0B CRC16 前6字节数据的CRC16校验和

返回码: 01 06 10 00 00 03 CD 0B

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 写单个寄存器指令
10 00 通道数据类型地址 0x1000 - 0x1007对应1~8输入通道数据类型
00 03 通道数据类型 通道数据类型,0x0000~0x0004表示五种量程范围>
CD 0B CRC16 前6字节数据的CRC16校验和

示例:[1号地址设备]

设置  1通道数据类型为0~20mA : 01 06 10 00 00 02 0C CB
读取  2通道数据类型为4~20mA : 01 06 10 01 00 03 9C CB

设置多通道数据类型指令

发送码:01 10 10 00 00 08 10 00 03 00 03 00 03 00 03 00 03 00 03 00 03 00 03 91 2B

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
10 写多寄存器指令
10 00 寄存器起始地址 0x1000 - 0x1007对应1~8输入通道数据类型
00 08 寄存器数量 设置寄存器数量,不能超过最大通道数量
10 字节数量 设置输出字节数
00 03
……
00 03
指令 对应0 - 7 通道数据类型,0x0000~0x0004表示五种量程范围
0x0000:量程0~5V,输出范围0~5000,单位mV;
0x0001:量程1~5V,输出范围1000~5000,单位mV;
0x0002:量程0~20mA,输出范围0~20000,单位uA;
0x0003:量程4~20mA,输出范围4000~20000,单位uA;
0x0004:直接输出数值码,输出范围0~4096,需要经过线性转换才能得到实际测量电压和电流;
91 2B CRC16 前6字节数据的CRC16校验和

返回码: 01 10 10 00 00 08 C5 0F

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
10 写多寄存器指令
10 00 寄存器起始地址 0x1000 - 0x1007对应1~8输入通道数据类型
00 08 寄存器数量 设置寄存器数量,不能超过最大通道数量
C5 0F CRC16 前6字节数据的CRC16校验和

示例:[1号地址设备]

读取1-8通道数据类型为4~20mA : 01 10 10 00 00 08 10 00 03 00 03 00 03 00 03 00 03 00 03 00 03 00 03 91 2B
读取3-5通道数据类型为 1 ~ 5V : 01 10 10 02 00 03 06 00 01 00 01 00 01 BE 4A

设置波特率指令

发送码:00 06 20 00 00 05 43 D8

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
20 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 校验方式 0x00为无校验,0x01为偶检验,0x02为奇校验
05 波特率数值 波特率数值对应
0x00 : 4800
0x01 : 9600
0x02 : 19200
0x03 : 38400
0x04 : 57600
0x05 : 115200
0x06 : 128000
0x07 : 256000
43 D8 CRC16 前 6 字节数据的 CRC16 校验和

返回码:00 06 20 00 00 05 43 D8

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
20 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 校验方式 0x00为无校验,0x01为奇检验,0x02为偶校验
05 波特率 波特率数值对应
0x00 : 4800
0x01 : 9600
0x02 : 19200
0x03 : 38400
0x04 : 57600
0x05 : 115200
0x06 : 128000
0x07 : 256000
43 D8 CRC16 前 6 字节数据的 CRC16 校验和

示例:[1号地址设备]

设置波特率  4800 :00 06 20 00 00 00 83 DB
设置波特率  9600 :00 06 20 00 00 01 42 1B
设置波特率115200 :00 06 20 00 00 05 43 D8

设置设备地址指令

发送码:00 06 40 00 00 01 5C 1B

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
40 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 01 设备地址 设置的设备地址,0x0001-0x00FF
5C 1B CRC16 前 6 字节数据的 CRC16 校验和

返回码:00 06 40 00 00 01 5C 1B

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
40 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 01 设备地址 设置的设备地址,0x0001-0x00FF
5C 1B CRC16 前 6 字节数据的 CRC16 校验和

示例[1号地址设备]:

设置设备地址为0x01 :00 06 40 00 00 01 5C 1B
设置设备地址为0x02 :00 06 40 00 00 02 1C 1A
设置设备地址为0x03 :00 06 40 00 00 03 DD DA

读取设备地址指令

发送码:00 03 40 00 00 01 90 1B

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读取设备地址指令
40 00 指令寄存器 0x4000为读取设备地址,0x8000为读取软件版本
00 01 字节数 固定0x0001
90 1B CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 03 02 00 01 79 84

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读取软件版本,读取设备地址指令
02 字节数 返回字节数
00 01 设备地址 设置的设备地址,0x0001-0x00FF
79 84 CRC16 前 6 字节数据的 CRC16 校验和

示例:[2号地址设备]

发送 : 00 03 40 00 00 01 90 1B
返回 : 02 03 02 00 02 7D 85     //地址0x02

读取软件版本指令

发送码:00 03 80 00 00 01 AC 1B

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读取软件版本,读取设备地址指令
80 00 指令寄存器 0x4000为读取设备地址,0x8000为读取软件版本
00 01 字节数 固定0x0001
8F CA CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 03 02 00 64 B9 AF

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
03 03指令 读取软件版本,读取设备地址指令
02 字节数 返回字节数
00 64 软件版本 转为十进制然后小数点左移两位即表示软件版本
0x0064 = 100 = V1.00
B9 AF CRC16 前 6 字节数据的 CRC16 校验和

示例:

发送:00 03 80 00 00 01 AC 1B
返回:01 03 02 00 64 B9 AF       //0x0064 = 100 =V1.00

异常功能码

当接收到的指令出错或者异常设备将会返回异常响应,异常响应格式如下。

返回码:01 85 03 02 91

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
85 异常功能吗 异常功能码 = 请求功能码 + 0x80
03 字节数 异常码
02 91 CRC16 前 6 字节数据的 CRC16 校验和

异常码是一个单字节值,用于指示错误的类型。Modbus协议定义的几个常用异常码:

异常码 名称 描述
0x01 非法功能 请求的功能码不支持
0x02 非法数据地址 请求的数据地址错误
0x03 非法数据值 请求的数据值或操作无法执行
0x04 服务器故障 服务器设备故障
0x05 应答 已接收到请求并正在处理
0x06 设备繁忙 设备当前正忙无法执行请求的操作

FAQ


技术支持


联系人:林工
EMAIL:services@waveshare.net
电话:0755-83040712
QQ:3004506335
微信:扫下方二维码添加
Lxw.jpg

说明:进行售后服务前,请准备好客户信息(定货单位、定货人等),以供验证