首先采用有人物联网的模块 ,连接有人云平台服务器 看云平台相关配置
USR-C322 连接有人云Modbus RTU设备组态测试
一、说明
USR-C322 软件设计手册:【软件设计手册】USR-C322 软件设计手册 V2.8.0-济南有人物联网技术有限公司官网
本案例测试说明:用modbus slave软件模拟modbus rtu协议的串口设备;
数据流向:modbus slave软件----C322-----有人云(组态显示)
客户实际应用:modbus rtu设备---C322---有人云(组态显示)
二、有人云设置参数
具体步骤如下:
1、登录有人云(如果没有账号先申请通信证)
2.在有人云上添加设备选择【SN不支持】添加,ID是系统自动生成的。
3.模板更改名称,选择“Modbus” - “ModbusRTU” - “云端采集”,点击“确认添加”。
4.添加从机,设置从机名称,串口号为1,从机地址是接在WIFI模块的串口上的终端设备的从机地址(如果不清楚,可以咨询终端设备的厂家)。
5.设置数据节点的名称,寄存器地址,数据格式,采集频率(最低只能是一分钟,);
寄存器地址填写规则:
格式为 功能码+寄存器地址(需要16进制转为10进制)+1
与组态软件的寄存器写法相同,填十进制寄存器地址,寄存器为起始地址+1。
如:
功能码03H或06H,起始地址0000H,则填:40001;
以这个为例,操作为只读就是功能码为03则就是4,寄存器地址16进制转换为10进制就是0000,然后+1
所以组态地址就是40001。
三、C322参数设置
1.下面设置C322,电脑连接C322的WiFi。
2.内置网页192.168.1.1的账号和密码都是admin,进入以后选择模式选择为sta模式,设置要连接的wifi名称、密码,点击保存;(先不要重启,等设置完所有的参数再重启设备)。
3. 进入到“透传参数”,串口参数设置为和您终端设备的串口参数一致。
4. 网络设置上设置为Tcp Client,透传云的域名为clouddata.usr.cn,透传云的端口为15000。
附加功能,注册包选择透传云,填上透传云上新建立的设备id,和密码(如下图所示),点击保存并重启C322使配置参数生效。
5. 设置完所有的参数要重启C322设备,稍等一会,在有人云界面,您会看到设备已经上线。
网络配置也可按照下图
您的网关SN为: 00002000263277000001; 通讯密码为: XXXXXXXXX;
云平台接入地址为: 263277.cnsh.iot-tcp.com; 端口号: 15000;
(后续您也可以在“查看”页面查看网关的通讯密码,也可以通过“网关管理-编辑网关”,查看和修改网关的通讯密码)
四、数据调试
1.打开modbus软件,点击连接。选择串口com13(C322的串口用usb转232接到电脑上的),串口参数要和C322一致。
2.可以在联网设备--数据查看,看到采集的从机数据。
配置连接设备在线后 添加设备

添加设备完成后 添加变量模板

变量模板的添加方式如下 :
本次采用的是标准的MODbus 协议

添加一个温度变量

温度变量如下显示

云平台 下发数据 采集
01 03 00 00 00 01 84 0A
丛机返回数据
01 03 02 00 07 f9 86
云平台 下发数据 采集
01 03 00 01 00 01 D5 CA
丛机返回数据
01 03 04 00 11 98 49
01 03 00 00 00 03 05 CB
丛机返回数据
01 03 02 00 11 78 48
01 03 04 00 22 00 33 1A 2C
01 03 06 00 55 00 66 00 77 8D 40
以下想采用 主动上报的方式 其拓展码 如下
标准Modbus RTU指令 |
| ||||||||||||||||
寄存器单元(十进制) | 功能码 | 作用 | 请求及响应格式 |
| |||||||||||||
线圈寄存器 CoilStatus (00001 - 09999) 1位 读写 | 0x01 | 读线圈 | 指示状态1 = ON,0 = OFF 示例:读取0x0001到0x000A单元的开关状态,现场状态为全开(即全1) |
| |||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 01 | 00 | 00 | 00 | 0A | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 字节数 | 数据 | CRC校验 |
|
|
|
|
|
|
| |||
|
|
| id | 01 | 02 | FF | 03 | crcl | crch |
|
|
|
|
|
|
| |
0x05 | 写单个线圈 | 十六进制FF 00置状态为ON,十六进制00 00 置状态为OFF 示例:将0x00AD单元状态置为ON/OFF |
| ||||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 置为ON/OFF | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 05 | 00 | AC | FF | 00 | crcl | crch |
|
|
|
|
|
| |
|
|
| id | 05 | 00 | AC | 00 | 00 | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 寄存器起始地址 | 置为ON/OFF | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 05 | 00 | AC | FF | 00 | crcl | crch |
|
|
|
|
|
| |
|
|
| id | 05 | 00 | AC | 00 | 00 | crcl | crch |
|
|
|
|
|
| |
0x0F | 写多个线圈 | 示例:从0x0014开始写入10个状态值,数据内容为2个字节:十六进制CD 01(二进制 1100 1101 0000 0001) |
| ||||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | 字节数 | 数据 | CRC校验 |
|
|
| |||||
|
|
| id | 0F | 00 | 13 | 00 | 0A | 02 | CD | 01 | crcl | crch |
|
|
| |
|
| 响应: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 0F | 00 | 13 | 00 | 0A | crcl | crch |
|
|
|
|
|
| |
离散寄存器 InputStatus (10001 - 19999) 1位 只读 | 0x02 | 读离散输入 | 示例:读取197—218的开关状态,204-197内容为0xAC(即二进制1010 1100),212-205内容为0xDB(即二进制1101 1011),218-213内容为0x35(即二进制0011 0101) |
| |||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 02 | 00 | C4 | 00 | 16 | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 字节数 | 数据 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 02 | 03 | AC | DB | 35 | crcl | crch |
|
|
|
|
|
| |
保持寄存器 Holding Register(40001 - 49999) 16位 读写 | 0x03 | 读保持寄存器 | 示例:读取寄存器108—110的值,108的内容为0x022B(即555),109的内容为0x0000(即0),110的内容为0x0064(即100) |
| |||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 03 | 00 | 6B | 00 | 03 | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 字节数 | 数据 | CRC校验 |
|
|
| |||||||
|
|
| id | 03 | 06 | 02 | 2B | 00 | 00 | 00 | 64 | crcl | crch |
|
|
| |
0x06 | 写单个寄存器 | 示例:将数据0x0003写入寄存器单元0x0002 |
| ||||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 数据 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 06 | 00 | 01 | 00 | 03 | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 寄存器起始地址 | 数据 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 06 | 00 | 01 | 00 | 03 | crcl | crch |
|
|
|
|
|
| |
0x10 | 写多个寄存器 | 示例:将数据0x000A和0x0102写入从0x0002开始的两个寄存器单元 |
| ||||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | 字节数 | 数据 | CRC校验 |
| |||||||
|
|
| id | 10 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | crcl | crch |
| |
|
| 响应: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 10 | 00 | 01 | 00 | 02 | crcl | crch |
|
|
|
|
|
| |
输入寄存器 Input Register(30001 - 39999) 16位 只读 | 0x04 | 读输入寄存器 | 示例:读取输入寄存器0x0009单元的值,现场数据为0x000A |
| |||||||||||||
|
| 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||
|
|
| id | 04 | 00 | 08 | 00 | 01 | crcl | crch |
|
|
|
|
|
| |
|
| 响应: | 设备号 | 功能码 | 字节数 | 数据 | CRC校验 |
|
|
|
|
|
|
| |||
|
|
| id | 04 | 02 | 00 | 0A | crcl | crch |
|
|
|
|
|
|
| |
有人扩展指令(本扩展指令非Modbus RTU标准,仅适用于设备与透传云网络通讯的规则) |
| ||||||||||||||||
为什么要做扩展指令 | 由于Modbus RTU协议适用于半双工的总线协议,只能一问一答,服务器做主机,接入设备做从机,可以实现主机主动采集和控制。 但由于网络通讯考虑流量、服务器并发量、网络延迟等原因,无法实现类似在总线中毫秒级的轮询读取,而网络通讯属于全双工,能够同时双向对话,故扩展指令提出支持从机状态主动上报的规则。 |
| |||||||||||||||
应用场景1 从机主动上报状态 | 如Modbus协议的环境控制器,服务器做主机10分钟轮询采集,但若前端人工主动控制,服务器必须等到下个轮询才能得知状态变化。 利用扩展指令可实现人工主动控制,从机主动上报当前的状态。 注:本协议仅适用于使用有人网络模块自主开发的产品,若在RS-485总线中使用,会造成总线混乱。 |
| |||||||||||||||
应用场景2 低功耗通讯上报格式 | 如NB-IoT、Lora这类低功耗通讯方式,低功耗模式仅支持主动向服务器上报,上报后断电断网休眠,此时服务器无法做主机主动采集数据。 利用扩展指令格式主动上报数据解决上述问题,服务器按照Modbus协议解析,完成后面的数据存储、报警、推送等功能。 补充:NB-IoT在高功耗模式下也可支持云端主动下发查询指令。 |
| |||||||||||||||
寄存器单元(十进制) | 功能码 | 作用 | 请求及响应格式 |
| |||||||||||||
线圈寄存器 CoilStatus (00001 - 09999) 1位 读写 | 0x45 | 上报多个线圈 | 示例:从0x0014开始写入10个状态值,数据内容为2个字节:十六进制CD 01(二进制 1100 1101 0000 0001) |
| |||||||||||||
(格式与写多个线圈相同) | 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | 字节数 | 数据 | CRC校验 |
|
|
| ||||||
| id | 45 | 00 | 13 | 00 | 0A | 02 | CD | 01 | crcl | crch |
|
|
| |||
响应: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||||
| id | 45 | 00 | 13 | 00 | 0A | crcl | crch |
|
|
|
|
|
| |||
离散寄存器 InputStatus(10001 - 19999) 1位 只读 | 0x42 | 上报多个离散寄存器 | (格式与写多个线圈相同) |
|
|
| |||||||||||
保持寄存器 Holding Register(40001 - 49999) 16位 读写 | 0x46 | 上报多个保持寄存器 | 示例:将数据0x000A和0x0102写入从0x0002开始的两个寄存器单元 |
| |||||||||||||
(格式与写多个保持寄存器相同) | 请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | 字节数 | 数据 | CRC校验 |
| ||||||||
| id | 46 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | crcl | crch |
| |||
响应: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | CRC校验 |
|
|
|
|
|
| ||||||
| id | 46 | 00 | 01 | 00 | 02 | crcl | crch |
|
|
|
|
|
| |||
输入寄存器 Input Register(30001 - 39999) 16位 只读 | 0x44 | 上报多个输入寄存器 | (格式与写多个保持寄存器相同) |
|
|
| |||||||||||
注意和补充 |
| ||||||||||||||||
协议解释: 1、数据、地址、长度等默认大端在前,但CRC校验是小端在前(低字节在前)crcl crch; 2、有人扩展协议仅适用于设备与透传云的网络通讯层; |
| ||||||||||||||||
| |||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
测试结果如下图所示:

请求: | 设备号 | 功能码 | 寄存器起始地址 | 寄存器单元长度 | 字节数 | 数据 | CRC校验2 | ||||||
| id | 46 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | crcl crch |
[13:26:47.860]发→◇01 46 00 06 00 03 06 00 04 00 03 00 04 CE 54 □
[13:26:47.980]收←◆01 46 00 06 00 03 28 05

[13:21:18.156]收←◆01 46 00 07 00 02 B8 05

改变单个寄存器值
[13:28:11.795]发→◇01 46 00 07 00 01 02 00 25 E3 2A □
[13:28:12.226]收←◆01 46 00 07 00 01 F8 04