MODBUS Client
名称:modbus_client
功能:通过 modbus 协议访问远程 slave 设备上的数据。
1. 参数
- name 用于加载配置文件。路径为:design/default/data/<name>.json
- share 是否共享。如果为 TRUE 多个窗口可以共享同一个同名实例。
示例:
<window v-model="modbus_client(name=modbus_demo2)" name="home_page">
这里配置文件路径为:design/default/data/modbus_demo2.json
2. 配置文件格式
使用 JSON 文件描述配置。
2.1 基本配置
- URL slave 设备的 URL。
- unit_id slave 设备 ID(TCP 协议无需设置)
- auto_reconnect 是否自动重连(默认 true)。
示例:
"url":"tcp://localhost:502",
2.2 通道描述
通道可以有多个,放在 channels 数组中。
-
name 用于访问通道中的数据,必须保证唯一性。
-
update_interval 更新数据的时间间隔。
-
unit_id slave 设备 ID(TCP 协议无需设置。如果需要通过同一个串口设备,从多个从站读取数据,则需指定具体从站的 ID)
-
access_type 功能号
- 1 : read_bits
- 2 : read_input_bits
- 3 : read_registers
- 4 : read_input_registers
- 5 : write_bit
- 6 : write_register
- 16 : write_registers
- 15 : write_bits
-
write/offset 写地址偏移。
-
write/length 写数据个数。
-
read/offset 读地址偏移。
-
read/length 读数据个数。
-
read/error_handling 出错后的处理方式。取值为:
- clear 清除原来的值。
- keep_last_value 保留原来的值。
-
init_by_read 对于写操作的 channel,如果本参数为 true,在初始化时,从远程读取数据来初始化缓存区中的数据。
示例:
"channels" : [
{
"update_interval" : 2000,
"name" : "read_input_registers",
"access_type" : 4,
"read" : {
"offset" : 0,
"length" : 4,
"error_handling": "clear"
}
}
],
2.3 变量定义
UI 可以直接绑定通道中的数据。为了提高可读性和灵活性,可以定义一些变量,将变量映射到通道地址。
- 定义变量
"variables": {
"温度": "read_input_registers.word[0]",
"湿度": "read_input_registers.word[1]"
}
- 使用变量
<progress_circle name="progress_circle" x="c" y="100" w="100" h="100" max="10000" v-data:value="{温度}" />
<progress_circle name="progress_circle" x="c" y="220" w="100" h="100" max="10000" v-data:value="{湿度}" />
2.4 历史数据
如果需要保存历史数据,可以配置 history_data。history_data 是一个数组,数组中的每个元素是一个表达式,表达式中可以引用当前文件中定义的变量,可以调用 fscript 的函数进行计算。
"history_data": [
"一氧化碳/10",
"二氧化氮/10+10",
"悬浮颗粒物/10+20",
"二氧化硫/10+20"
]
注意:
- 必须和历史数据模型的配置保持一致。
- 如何启用历史数据,请参考 演示:数据采样
- 完整示例请参考:demo_history_data_modbus
- 只支持从同一个 URL 的 modbus 设备采集数据。
2.5 初始化请求
初始化请求可以有多个,放在 inits 数组中。
-
access_type 功能号。取值有:
- 5 : write_bit
- 15 : write_bits
- 6 : write_register
- 16 : write_registers
-
offset 写地址偏移。
-
length 写数据个数。
-
value 写入的值。
-
comment 注释。
"inits": [
{
"access_type": 6,
"offset" : 0,
"length" : 1,
"value" : 10,
"comment" : ""
}
]
3. 访问通道中的数据。
格式:<通道名>.<通道数据类型>[offset].(bit_offset|<变量数据类型>)
- 通道名:配置文件中的通道名。
- 通道数据类型:str/bin/byte/word/dword/int8/uint8/int16/uint16/int32/uint32/int64/uint64/float/double
- offset : 读取数据的偏移量。
- bit_offset : 读取数据的位偏移量(可选)。
- 变量数据类型:可选。默认和通道数据类型一致。
说明:
<通道名>.<通道数据类型>[offset]
用于定位在通道中数据的偏移地址。比如:- read_input_bits.byte[1] 为第二个字节。
- read_input_bits.uint16[1] 为第三个字节。
- read_input_bits.uint32[1] 为第五个字节。
- str/bin 在计算偏移时与 int8/uint8 相同。
- str/bin 做为变量类型时,可以指定长度限制。比如:
- read_input_registers.int8[10].str[8] 长度不超过 8 字节
- read_input_registers.int8[10].bin[12] 长度不超过 12 字节
- str 类型的数据必须以空字符’\0’结尾。
示例:
- read_input_bits.byte[0].0 表示读取通道中的第一个字节的第一个位。
- read_input_bits.byte[1].3 表示读取通道中的第二个字节的第四个位。
- read_input_registers.word[1] 表示读取通道中的第二个字。
- read_input_registers.byte[0].str 表示读取字符串。
- read_input_registers.byte[0].bin[16] 表示读取 16 字节的二进制数据。
示例:
<check_button tr_text="DI00" v-data:value="{read_input_bits.byte[0].0}" sensitive="false"/>
<check_button tr_text="DI01" v-data:value="{read_input_bits.byte[0].1}" sensitive="false"/>
<check_button tr_text="DI02" v-data:value="{read_input_bits.byte[0].2}" sensitive="false"/>
<check_button tr_text="DI03" v-data:value="{read_input_bits.byte[0].3}" sensitive="false"/>
<check_button tr_text="DI04" v-data:value="{read_input_bits.byte[0].4}" sensitive="false"/>
<check_button tr_text="DI05" v-data:value="{read_input_bits.byte[0].5}" sensitive="false"/>
<check_button tr_text="DI06" v-data:value="{read_input_bits.byte[0].6}" sensitive="false"/>
<check_button tr_text="DI07" v-data:value="{read_input_bits.byte[0].7}" sensitive="false"/>
<check_button tr_text="DI08" v-data:value="{read_input_bits.byte[1].0}" sensitive="false"/>
<check_button tr_text="DI09" v-data:value="{read_input_bits.byte[1].1}" sensitive="false"/>
<check_button tr_text="DI10" v-data:value="{read_input_bits.byte[1].2}" sensitive="false"/>
<check_button tr_text="DI11" v-data:value="{read_input_bits.byte[1].3}" sensitive="false"/>
<check_button tr_text="DI12" v-data:value="{read_input_bits.byte[1].4}" sensitive="false"/>
<check_button tr_text="DI13" v-data:value="{read_input_bits.byte[1].5}" sensitive="false"/>
<check_button tr_text="DI14" v-data:value="{read_input_bits.byte[1].6}" sensitive="false"/>
<check_button tr_text="DI15" v-data:value="{read_input_bits.byte[1].7}" sensitive="false"/>
<view name="ai" children_layout="default(h=32,c=2,s=10,m=5)">
<label />
<label tr_text="analog in0"/>
<edit input_type="uint" v-data:value="{read_input_registers.word[0]}" max="0xfffff" readonly="true"/>
<label tr_text="analog in1"/>
<edit input_type="uint" v-data:value="{read_input_registers.word[1]}" max="0xfffff" readonly="true"/>
<label tr_text="analog in2"/>
<edit input_type="uint" v-data:value="{read_input_registers.word[2]}" max="0xfffff" readonly="true"/>
<label tr_text="analog in3"/>
<edit input_type="uint" v-data:value="{read_input_registers.word[3]}" max="0xfffff" readonly="true"/>
</view>
内置属性
属性 | 类型 | 说明 |
---|---|---|
url | 字符串 | URL |
connected | 布尔 | 当前是否连接。 |
示例
<label x="c" y="10" w="50%" h="40" v-data:tr_text="{url}" />
<label x="c" y="60" w="50%" h="40" v-data:tr_text="{connected ? 'connected' : 'no connection'}" />
内置命令
命令 | 参数 | 说明 |
---|---|---|
update | 通道名称(不指定则为全部) | 更新通道数据 (read/write) |
示例
<button x="c:-100" y="b:10" w="168" h="36" text="Update" v-on:click="{update, args=read_input_registers}" />
完整示例
请参考:demo_modbus_client
注意
如果数据需要进行字节序转换,可以调用 fscript 函数,具体请参考:https://gitee.com/zlgopen/awtk/blob/master/docs/fscript_endian.md