结构体参数编辑器用于编辑结构体数据,结构体数据是一种复合数据类型,由多个字段组成。

当请求参数支持HEX时该编辑器可用。
编辑属性名称,属性名称可在脚本或取值模板中引用, 当属性名称为空时,可通过索引来获取属性信息, 例如 $1 即获取第一个属性的信息。
通过下来选项来选择属性数据类型。数据类型不同,属性可配置的选项和操作也不同。
(bits)位数组
(byte) 单字节
bits支持配置选项来配置属性取值列表。
属性可分解子属性至位数据,分解后该属性不可编辑,只可通过子属性来拼装数据。
(char) 字符
字符类型可用于编辑一个 ASCII字符
(uchar)无符号字符
无符号字符类型用于编辑一个无符号字符。
(uint8)无符号8位整型
bits(int8)有符号8位整型
(uint16)无符号16位整型
bits, uint8(int16)有符号16位整型
(uint32) 无符号32位整型
bits, uint8(int32)有符号32位整型
(uint64)无符号64位整型
bits, uint8(int64)有符号64位整型
(float)单精度浮点型
(double)双精度浮点型
(string)字符串
(bytes)字节数组
(array)数组
(struct)结构体
属性取值可直接输入固定值,也可以通过调用函数或者变量来动态生成属性值。
分解用于将一个数据类型的数据分解为更小的数据类型,例如字节可以分解到位,uint16可以分解为两个uint8或者数个bits.
分解后,子属性采取高位在前的原则进行处理,例如 uint8 分解为 bits(1) bits(1) bits(4) bits(2), 则
uint8 BIN => 0b 1 0 0001 10
bits(1) BIN => 1
bits(1) BIN => 0
bits(4) BIN => 1
bits(2) BIN => 10
或将 uint16进行分解 :
uint16 HEX => 0x AA BB
uint8 HEX => AA
uint8 HEX => BB
如果分解子属性的字节数不足父属性时,则会出现无法解析的错误。 例如 uint16 分解为 1 个 uint8 的子属性,则无法进行解析操作。
如果分解子属性的字节数超出父属性时,仅会从解析出的数据中读取有效的父类型数据。例如:将一个 uint16 分解为 3 个 uint8,分别为0x01,0x02,0x03, 则组成的内存数据为[0x10,x02,0x03] ,则解析父属性时,仅会使用前两个字节的数据进行解析操作,即 [0x01,0x02]是有效的。
对于分解到位数据,如果相邻长度累计不足整字节,则会后补0填充直至填充完整字节,例如将一个 uint32 分解
uint32 HEX => 0x80 01 80 01
bits(1) BIN => 1 # 后补0为: 10000000
uint8 HEX => 1
bits(1) BIN => 1 # 后补0为: 10000000
uint8 HEX => 1
<DEC> randomNum (min, max) : 生成指定范围的十进制整形数据
{{ randomNum(0, 100) }}
// 输出: 55
<String> randomStr(len) : 生成指定长度的随机字符串
{{ randomStr(5) }}
// 输出 : asdfd
<DEC> crcModbus16([ items ]) :计算给定属性列表的CRC值,该值计算完毕后需要手动指定属性字节序为小端模式方可正确发送。
{{ crcModbus16($(1,2,3,4)) }}
// 输出 : 52677
<DEC> byteCount([ items ]) : 获取属性字节数
// 假设 属性01 的值为 "12345"
{{ byteCount($("属性01")) }}
// 输出 : 5
// 假设 属性02 的值为 "12345"
{{ byteCount($("属性01"), $("属性02")) }}
// 输出 : 10
在取值模板中, 可以通过 $() 函数来获取变量,支持的访问方式如下:
$(index) : 根据索引号获取属性, 当单独使用时,$(index) 输出的值为对应属性的取值字符串,其中 index 以 1 为起始位置。 例如 : 假设第一个属性的取值属性输入的是 FF, 则 {{$(1)}} 输出 FF 。$(path) : 根据属性路径获取属性,例如: {{$("name.age")}} 则可获取name属性的子属性 age 的取值。属性路径以 . 分割属性的每一个部分。当属性名称为数值时则会作为索引处理, 例如 $("user.1.age") 则会将1作为索引,而不会作为路径名来使用。$(path, path) : 不再建议使用,当指定多个属性时,则返回属性列表数组。$([path1,path2]) : 根据路径数组获取属性列表, 该模式下,即使结果仅有一个或者为空也会返回为数组。需要注意的是, $() 函数返回的数据是属性实例,而不是属性的取值,因此需要通过 .value 来获取属性编译后的取值。
如果需要获取属性的输入值,则可以通过 .input 来获取。 另外,当属性被分解之后,例如uint8被分解为bits, 则input属性不可用, 因为被分解的属性不可再手动输入值。
<object> $this.parameter.attribute(path) : 获取属性值,当属性未被编译时,该函数返回值为 null 。
let attr = $this.paramter.attribute(1);
attr.value // 属性编译后的值
attr.input // 属性输入值
attr.buffer // 属性在Buffer中的值