在 AWTK 串口屏中,内置了 MODBUS Client Channel 的模型,不用编写代码即可实现在 ListView 中显示数组数据。
MODBUS 协议一次只能读取 125 个 WORD,AWTK-MODBUS Client Channel 支持长数据,自动分成多个请求访问。
1. 功能
不用编写代码,实现对远程设备上数组数据的显示。
2. 创建项目
从模板创建项目,将 hmi/template_app 拷贝 hmi/modbus_client_channel_input_registers 即可。
第一个项目最好不要放到其它目录,因为放到其它目录需要修改配置文件中的路径,等熟悉之后再考虑放到其它目录。路径中也不要中文和空格,避免不必要的麻烦。
3. 制作界面
用 AWStudio 打开上面 modbus_client_channel_input_registers 目录下的 project.json 文件。里面有一个空的窗口,做出类似下面的界面。
4. 添加绑定规则
第一次用到列表视图,有几点需要特别说明一下:
列表视图中的滚动视图需要指定 v-for-items 属性:
属性 | 值 | 说明 |
---|---|---|
v-for-items | true | 它保证其下的列表项,会根据数据自动生成| |
4.0 几个特殊的变量
- index 特指序数。
- item 特指当前的数据。比如在这里 ‘item.level’ 表示告警级别,‘item.time’ 表示时间,‘item.device’ 表示设备,‘item.message’ 表示告警信息。
- selected_index 表示当前选中的序数(可在列表视图之外绑定)。
- items 表示当前列表视图中的数据个数(可在列表视图之外绑定)。
4.1 序数
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {index} | index 特指序数。 |
4.2 告警级别
前面提到告警级别是正数,可以通过 item.level 来获取它。它的意义对应为:调试 (0); 信息 (1); 警告 (2); 错误 (3),我们需要用 one_of 函数将它转换为对应的字符串。
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {one_of(‘调试;信息;警告;错误’, item.level)} | 这里的 one_of 的功能是从指定的字符串数组中取出对应的子串。 |
4.3 时间
时间是整数(秒数),可以通过 item.time 来获取。
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {date_time_format(item.time, ‘Y-M-D hⓂ️s’)} | 需要用 date_time_format 将 epoch 时间转换成人类可读的时间。 |
4.4 告警信息
告警信息是一个字符串,可以通过 item.message 来获取。
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {item.message} |
4.5 URL
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {url} | url 表示远程设备的 URL |
4.6 连接状态
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-data:value | {connected ? ‘connected’ : ‘no connection’} | connected 表示当前是否连接 |
4.7 窗口模型
- 指定窗口的模型为
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-model | modbus_client(name=modbus_demo) | 配置文件名对应于 modbus_demo.json |
modbus_client 是内置的模型,name 是配置文件的名称,不需要加后缀。
4.8 视图模型
- 为了使用 channel 的模型,还需要在窗口的下一级控件指定 modbus_client_channel 模型。
绑定属性 | 绑定规则 | 说明 |
---|---|---|
v-model | modbus_client_channel(name=modbus_demo_input_register) | 配置文件名对应于 modbus_demo_input_register.json |
modbus_client_channel 是内置的模型,name 是配置文件的名称,不需要加后缀。
5. 配置文件
配置文件路径 design/default/data/modbus_demo.json
{
"url":"tcp://localhost:502",
"channels" : [
{
"update_interval" : 5000,
"name" : "read_input_registers",
"access_type" : 4,
"read" : {
"offset" : 0,
"length" : 3200
}
}
]
}
在上面的配置中,定义了通道 read_input_registers,长度为 3200 个 registers,共 6400 字节。
配置文件路径 design/default/data/modbus_demo_input_register.json
{
"channel":"read_input_registers",
"items": 100,
"variables": {
"level": "byte[0].uint32",
"time": "byte[4].uint32",
"message": "byte[8].str[56]"
}
}
在上面的配置中,将通道 read_input_registers 中的数据,分成 100 等份,也就是看作 100 元素的数组,每个元素 64 字节。这 64 字节的数据为三个成员:
- level: 4 字节,无符号整数
- time: 4 字节,无符号整数
- message: 56 字节,字符串
6. 描述需要持久化的数据
无
7. 编译运行
运行 bin 目录下的 demo 程序:
点击 Update 按钮,可以手工刷新数据
8. 注意
-
本项目并没有编写界面相关的代码,AWStudio 在 src/pages 目录下生成了一些代码框架,这些代码并没有用到,可以删除也可以不用管它,但是不能加入编译。
-
完整示例请参考:demo_modbus_client_channel_input_registers
-
使用 TCP 协议时,如果使用 modbus slave 工具 配套测试,需要将 unit id 设置为 255