Modbus-DTU 示例
场景描述
数据传输单元DTU是专门用于将串口数据通过无线通信网络进行传送的无线终端设备。广义地讲,在进行通信时,传输数据的链路两端负责发送数据信息的模块单元都称之为DTU,在它的作用下对所传信息进行格式转换和数据整理校验。此示例讲述一个 具有Modbus通讯协议的温湿度传感器 通过 移远DTU模块 连接上 开发者中心 并进行数据交互。
涉及API接口
函数 | 说明 |
---|---|
Ql_iotMBInit() | 初始化 modbus 组件 |
Ql_iotMBCloudRecv() | 转换平台下发的物模型数据为 ModBus 格式后发送到 ModBus 从机设备 |
Ql_iotMBLocalRecv() | 转发串口接收到的 ModBus 数据至 ModBus 组件中并处理 |
Ql_iotMBDeinit() | 注销modbus组件 |
提示:详情请参考DTU-Modbus 相关接口。
平台侧操作步骤
一、登录开发者中心
二、创建产品
创建产品是产品开发流程的第一步,产品是开发者中心定义一类设备的抽象描述,用于对同类设备进行管理。例如您有一台具备WiFi联网能力的温湿度,需要接入开发者中心完成设备监控,则您可以定义它为一个产品:“智能温湿度”。
DTU-Modbus配置工具操作步骤
DTU-Modbus配置工具是一款能帮助您快速通过Modbus协议对从机设备进行功能定义等操作,在工具内配置产品信息以及功能定义操作后,只需将配置文件烧写进DTU模组上与导入开发者中心即可完成从机设备连接平台的操作。
主页总览如下图所示
一、配置产品信息
点击左侧配置栏 添加产品 按钮。
添加产品信息弹窗如下图所示。
- 产品名称:DTU产品所具有的产品命名。
- ProductKey:在开发者中心创建产品生成的 ProductKey。
- ProductSecret:在开发者中心创建产品生成的 ProductSecret。
- 上报方式:分别为变化上报与全部上报。
- 全部上报:设备每次轮询到的数据都会直接上报到开发者中心。
- 变化上报:设备每次轮询到的数据与上次数据进行比较,发生变化才上报到开发者中心。
- 设备类型:分为直连版与网关版。
- 直连版本:从机设备和网关共用产品信息,以一个整体设备在平台展示。
- 网关版本:从机设备拥有独立的产品信息和设备信息,在平台单独展示。
提示:产品信息仅可添加一条,需要添加新的请通过修改或删除旧的产品信息。
二、配置串口信息
点击左侧配置栏 添加串口 按钮。
添加串口配置弹窗如下图所示。
- 端口号:实际DTU接入从机设备的端口号。
- 波特率:表示每秒钟传送的字节的个数,常用有9600, 115200等,需与从机设备相匹配。
- 数据位:衡量通信中有效数据的参数,默认为8个,需与从机设备相匹配。
- 停止位:可设置为1位、1.5位或2位,标志着传输一个字符的结束,需与从机设备相匹配。
- 校验位:分为"None"(无校验)、"Even"(偶校验)、"Odd"(奇校验)、"Mark"(Mark校验)和"Space"(Space校验),默认为"None",需与从机设备相匹配。
- 轮询周期(s):DTU设备向从机设备轮询发送Modbus协议周期。例如每60秒向从机设备读取一次温湿度值。
- 命令间隔(ms):因可能存在黏包情况,需设置DTU向从机设备发送每条Modbus协议的最小时间间隔。
- 重发次数:当DTU设备发送Modbus协议问询数据帧时,子设备(传感器)端未在命令间隔时间内响应,则DTU会再次重新发送,为 0 时则不重新发送。
三、添加设备信息
提示:当选择设备类型为“网关版”时,需要为每一款Modbus设备填写对应的产品信息。
1 、点击 添加设备(+) 按钮添加从机设备。
2、添加从机设备弹窗详情
i. 在弹窗页面中 设备名称 填写从机设备的命名,例如填写 温湿度传感器 。
ii. 在对应串口端口号的列表下输入该设备的Modbus从机地址,例如温湿度传感器放置于串口1,Modbus地址为1,则输入1,若有多个设备需要设置为不同的Modbus从机地址,则添加多个从机地址即可。
四、添加功能寄存器
1、添加寄存器地址
选择页签中从机设备并点击 添加寄存器地址 按钮。
在弹窗页面中分别输入 起始地址、数量 参数。
提示:可以通过勾选 Hex 勾选框,切换 起始地址 输入框是以十进制还是十六进制显示。
2、添加寄存器配置信息
点击右侧的功能标签址中 + 控件添加寄存器配置信息。
五、配置功能信息
假设一款 Modbus协议 温湿度传感器 接入到开发者中心,通过开发者中心可以远程查看传感器的温度、湿度,并可远程配置传感器开关与设置实时时间。以下以温湿度传感器为例演示如何在配置工具桌面添加功能信息。
需添加的功能如下表所示。
类型 | 功能名称 | 读写权限 | 数据类型 | 字节顺序 | 换算公式 | 字节长度 |
---|---|---|---|---|---|---|
布尔型 | 温湿度开关 | 可读可写 | -- | -- | -- | -- |
数值型 | 温度 | 只读 | 十六位有符号整型 | 大端模式 | x0.01+0 | -- |
数值型 | 湿度 | 只读 | 十六位无符号整型 | 大端模式 | x0.01+0 | -- |
字节流 | 时间戳 | 可读可写 | -- | -- | -- | 13 |
枚举 | 工作模式 | 可读可写 | 十六位无符号整型 | 大端模式 | -- | -- |
1、添加布尔型
添加温湿度开关,可远程控制温湿度开关状态。
- 类型:选择布尔型,例如温湿度开启:True
- 功能名称:从机设备功能所具有的功能命名,例如开关。
- 读写类型:分为只读、只写、可读可写。
配置事件(可选)
- 事件名称:事件所具有的命名。
- 事件类型:包括故障、告警、信息等三个选项。
- 触发条件:该事件的触发条件,当DTU设备查询到的Modbus从机设备数据与设定值一致时,触发相应事件。
2、添加数值型
添加温湿度功能,可在平台查看当前传感器温湿度值。
类型:选择数值型,例如温度值为:“25.63”度。
功能名称:从机设备功能所具有的功能命名,例如温度。
读写类型:分为只读、只写、可读可写。
数据类型:该类型的变量所能存储的最大值和最小值,例如因温度值可能为负摄氏度且范围为-40~85,所以定义为16位有符号整型较为合适。
字节顺序:数据在内存中的存放顺序。用32位整型举例:数值(ABCD)使用两个字节储存:高位字节是(AB),低位字节是(CD)。
大端模式:高位字节在前,低位字节在后,即以(ABCD)形式储存。
小端模式:低位字节在前,高位字节在后,即以(DCBA)形式储存。
大端模式字节交换 :大端模式并高低位字节间两两交换,即以(BADC)形式储存。
小端模式字节交换 :小端模式并高低位字节间两两交换,即以(CDAB)形式储存。
换算公式:对该数值进行换算,例如从传感器读取到的数值为:0x0A 0x03 (十进制为2563),2563 *0.01+0=25.63,则25.63则为实际的温度值。
配置事件(可选)
- 事件名称:事件所具有的命名。
- 事件类型:包括故障、告警、信息等三个选项。
- 触发条件:该事件的触发条件,后一个输入框内的值需要大于前一个输入框内的值。当DTU设备查询到的Modbus子设备数据处于设定范围内时,触发相应事件。
3、添加字节流型
添加时间戳设置功能,可在平台读取或设置温湿度传感器时间戳。
- 类型:选择字节流型,例如字节流值为:“ABCabc123#&*”。
- 功能名称:从机设备功能所具有的功能命名,例如时间戳。
- 读写类型:分为只读、只写、可读可写。
- 字节长度:根据字节流数据的最大字节长度设定。
配置事件(可选)
- 事件名称:事件所具有的命名。
- 事件类型:包括故障、告警、信息等三个选项。
- 触发条件:该事件的触发条件,触发的条件为该输入内容。
4、添加枚举型
添加设置模式功能,可在平台读取或设置温湿度传感器当前模式。
- 类型:选择枚举型。
- 功能名称:从机设备功能所具有的功能命名,例如工作模式。
- 读写类型:分为只读、只写、可读可写。
- 数据类型:选择与寄存器相符合的数据类型。
- 字节顺序:数据在内存中的存放顺序。用32位整型举例:数值(ABCD)使用两个字节储存:高位字节是(AB),低位字节是(CD)。
- 大端模式:高位字节在前,低位字节在后,即以(ABCD)形式储存。
- 小端模式:低位字节在前,高位字节在后,即以(DCBA)形式储存。
- 大端模式字节交换 :大端模式并高低位字节间两两交换,即以(BADC)形式储存。
- 小端模式字节交换 :小端模式并高低位字节间两两交换,即以(CDAB)形式储存。
配置事件(可选)
- 事件名称:事件所具有的命名。
- 事件类型:包括故障、告警、信息等三个选项。
- 触发条件:该事件的触发条件,触发的条件为该选择的枚举值(可多选)。
六、生成配置文件
在工作栏中点击 配置文件 >生成配置文件 , 在弹窗页面中选择需要保存的文件路径。
若成功生成配置文件后则会在选择的文件目录生成以下两种格式的文件。
- xxxxxx_xxxxxxxxxx_cloud.json:物模型定义文件,用于在开发者中心导入
- xxxxxx_xxxxxxxxxx_local.bin:Modbus定义文件,用于在设备烧写
七、导入配置文件至开发者中心
1、登录开发者中心,打开对应的产品页面,并切换到 功能定义 页面,点击 草稿模式 进入编辑模式。
2、点击 快速导入 >导入物模型 >点击上传
3、 在弹窗页面中选择生成的xxxxxx_xxxxxxxxxx_cloud.json文件,最后点击 确认按钮 即可导入功能配置文件。
4、点击 发布应用,勾选弹窗中的提示语并点击 确认提交,退出编辑模式。
设备侧操作步骤
一、程序编程
1、QuecThing初始化
QuecThing SDK 提供读写设备信息的接口及参考实现,可根据具体的实际情况进行适配。设备将携带这些信息与开发者中心建立连接。
oprt_ret ret = OPRT_OK;
Qth_eventCb_t event_cb = {0};
Qth_otaEventCb_t otaCb = {0};
ret = Qth_devInit();
if (OPRT_OK != ret)
{
Quos_logPrintf(APPS_OPEN, LL_ERR, "cloud init error:%d", ret);
return;
}
otaCb.planExCb = otaPlanExCb;
otaCb.sotaInfoCb = sotaInfoCb;
otaCb.sotaFileCb = sotaFileCb;
event_cb.devEventCb = devEventCb;
event_cb.ttlvRecvCb = ttlvRecvCb;
event_cb.otaEventCb = otaCb;
Qth_configSetEventCb(event_cb);
2、初始化Modbus组件
初始化Modbus组件,需要注册可用于烧写配置文件的串口列表,以及注册串口发送函数和初始化回调函数。
/* 初始化Modbus */
Ql_iotMBInit(portList,sizeof(portList)/sizeof(quint16_t),modbusUartSend,modbusInitCb);
i. ModBus 组件初始化完成后,将配置文件中的设备信息传入至该回调函数。用户需在该函数中实现串口收发以及设备连接平台的操作。
qbool modbusUartSend(quint16_t port, const quint8_t *buf, quint32_t bufLen)
{
oprt_ret ret = Qhal_uart_write(port, (void *)buf, bufLen);
if(ret >= 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
ii. ModBus 组件需向串口发送数据时会调用该回调函数。用户需在该函数中实现串口发送能力。
void modbusInitCb(char *pk, char *ps, QIot_MBPortCfg_t *portInfo[], quint32_t portNum)
{
if (NULL == pk || NULL == ps || NULL == portInfo || 0 == portNum)
{
Quos_logPrintf(APPS_OPEN, LL_DBG, "MODBUS init fail");
return;
}
/* 配置PK/PS,启动IoT平台连接 */
Qth_configSetProductInfo(pk, ps);
Qth_devStart();
}
3、下行数据处理
在开发者中心发送指令,设备接收后将TTLV数据转为Modbus数据并通过注册的发送接口发送。
void ttlvRecvCb(void *ttlvHead)
{
Quos_logPrintf(APPS_OPEN, LL_DBG, "recv ttlv write");
Ql_iotMBCloudRecv(ttlvHead);
}
二、编译、烧写程序
提示:程序编译、烧录详情参考 程序编码。
三、烧写配置文件至DTU设备
1、在工作栏中点击 下载 >串口下载 按钮。
2、 点击 导入文件 按钮,在弹窗页面中选择生成的 xxxxxx_xxxxxxxxxx_local.bin 文件。
3、 选择对应的PC连接DTU设备端口号与波特率等配置后点击 打开串口 按钮。提示:可以根据开发板上的PIN脚号或对应版本的原理图找到对应的烧录串口位置。
4、最后点击 开始下载 后重启硬件设备,文本框中会显示文件下载进度,下载成功会弹出提示 下载成功 弹窗。 <br
效果呈现
1、设备上线
将程序烧写进模组里,模组会根据代码步骤自动连接到平台。模组连接到平台后会自动在该产品下添加本机设备,并且 自动认证。
2、查看数据日志
在设备详情 >数据日志页可以查看到终端设备规律的每隔60秒即向从机设备获取最新数据并发送至开发者中心。
根据物模型功能定义的 设备调试 > 通讯日志 可以清晰的查看上传的温度值:25.68;湿度值:65.13。
3、下发指令
通过平台下发指令到DTU-Modbus设备,DTU设备进入回调函数处理且通过串口转换成Modbus协议发送给温湿度传感器。此时通过温湿度传感器已通过DTU设备接收到下发的时间戳与开关指令。