自定义指令是为了方便用户在使用过程中在某些项目里面需要使用到其他协议,而不仅局限于 GVS 标准协议, 扩大了使用协议的范围,如:可在项目中使用 modbus 协议, 自定义协议主要包括两个大模块,一个是自定 义协议发送模块,另一个是自定义指令接收解析模块。
2.如何发送自定义协议
新建或打开已有的工程文件,选中控件,现以按钮控件为例,添加事件,设置处理方法为“命令发送→【自 定义协议】发送串口命令” ,可添加控件自定义协议发送,如图 2.1 所示。
图2.1 添加自定义协议发送
3.如何发送自定义协议报文
1、 自定义指令函数说明
点击命令下的输入框,弹出自定义指令函数说明窗口,在输入框中可输入 16 进制数字,也可进行算法运算以 及 CRC 算法,根据自定义指令函数说明窗口设置自定义协议发送,如图 3.1 所示。
图3.1 自定义指令函数说明
BYTE
该关键字为单字节,比如$BYTE(#3000),意思就是将索引为 3000 的变量的值在该位置上取最低字节,比如索引 3000 变量的值为 0x1024,例如需要发送自定义协议 55 AA $BYTE(#3000) 10 ff ,那么发送的自定义协议指令为:
55 AA 24 10 FF。
同时也可以实现运算:55 AA $BYTE(#3000+2) 10 ff ,那么发送的自定义协议指令为:55 AA 26 10 FF。
2BYTEM
与 BYTE 用法一致,但是该关键字表示为两个字节,结尾的’ M’代表高位在前,例如索引3000 变量的值为 0x1234, 那么,该位置就是 0x12 0x34 ,假设需要发送自定义协议 55 AA $2BYTEM(#3000) 10 ff ,那么发送的自定义协议 指令为:55 AA 12 34 10 FF。
2BYTEL
与 2BYTEM 用法一致,结尾的’ L’代表低位在前,例如索引 3000 变量的值为 0x1234,那么,该位置就是 0x34 0x12, 假设需要发送自定义协议 55 AA $2BYTEL(#3000) 10 ff ,那么发送的自定义协议指令为:55 AA 34 12 10 FF。
4BYTEM
与 BYTE 用法一致,但是该关键字表示为四个字节,结尾的’M’代表高位在前,例如索引 3000 变量的值为 0x12345678,那么,该位置就是 0x12 0x34 0x56 0x78 ,假设需要发送自定义协议 55 AA $4BYTEM(#3000) 10 ff, 那么发送的自定义协议指令为:55 AA 12 34 56 78 10 FF。
4BYTEL
与 4BYTEL 用法一致,有四个字节且低位在前,同理也是用于运算以及取变量值,例如$4BYTEL(#3000) ,假如 该变量值为 1 ,那么该位置为 01
00
00
00 ,假设需要发送自定义协议 55 AA $4BYTEL(#3000) 10 ff ,那么发送的 自定义协议指令为:55 AA 01 00 00 00 10 FF。
CRC16MODBUS
该关键字表示在该位置上使用标准 MODBUS 的校验方式,大小为两个字节,写法为$CRC16MODBUS(a,b) ,参 数 a 代表从哪个位置开始校验,比如从第 1 位开始 (这里没有第 0 位) 则参数 a 为 1 ,参数 b 代表所需校验 长度,如 AB CD $BYTE(#3000) $CRC16MODBUS( 1,3)其中参数 a 为 1 即从第一个字节开始校验,参数 b 为 3 即 校验长度为 3.
DELAY
该关键字写在自定义指令后边表示该指令需要延迟多少毫秒再发出,如$DELAY(1000)即延迟 1000ms 发送,例 如需要发送自定义协议 55 AA 11 10 ff $DELAY(1000),那么延迟 1000ms 发送的自定义协议指令为:55 AA 11 10
FF。
SUM8
该关键字表示在该位置是一个 1 字节的累加校验,写法为$SUM8(a,b),ab 用法同 CRC16MODBUS
WAIT
该关键字表示是个阻塞,搭配专属关键字 WAITBYTES 一起使用,比如$WAIT(300,9,$WAITBYTES(0x45,0xaa)),那 么他的意思是发送完该指令后,等待接收到数据头部为 0x45,0xaa,长度为 9 的应答后才能发送下一帧指令或 者等待 300 毫秒接收超时 (无应答) 再发送下一帧指令,避免数据混乱,WAITBYTES 关键字的等待接收数据 段可变长
BITS
该关键字表示 1 个字节处理,固定 8 位,比如:$BITS(1,0,0,0, 1, 1,0, 1),它表示:0x8d, 同时他也可以使用变量: $BITS(#3000,#3001, 1, 1,0,0,0,0), 当括号内元素为非 0 时候,固定为 1 ,元素不足 8 个, 自动填充 0
2、如何设置帧头 ( 自定义协议发送帧头设置)
帧头设置,帧头为 16 进制数字组成,可根据需求进行设置,如帧头输入
3、如何设置数据位
数据设置,确定好需要发送的变量数据,再确定其字节数,其中数据可进行算法运算,如$BYTE((#3000+45)*2): 假如#3000 变量的值为 6 ,那么,该位置的值为: (6+45) *2=102=0x66 ,则数据位应显示 66
4、仿真演示
点击仿真运行按钮
,弹出仿真运行窗口。
发送指令:FF AA 04 05 06 $BYTE((#3000+45)*2) $CRC16MODBUS( 1,6) $DELAY(3000)
即点击按钮控件,在接收端 3000ms 后可接收到指令“FF AA 04 05 06 66 9E B7” ,如图 3.2 所示。
图3.2 自定义协议发送
4.如何添加自定义解析
点击项目弹出项目窗口,点击协议设置→协议类型设置为“自定义协议”→点击自定义协议解析设置→弹出 解析设置窗口→点击添加弹出自定义解析设置窗口,根据需求和要求进行设置可添加一个自定义协议解析, 如图 4.1 所示。
图4.1 添加自定义协议解析
5.如何设置自定义协议解析
1、如何设置帧头 ( 自定义协议解析帧头设置)
帧头可输入小于等于 10 字节长度的帧头,每个解析帧头必须不同,点击帧头弹出自定义指令函数说明窗口, 在帧头中输入指令函数,可起到精确设备进行解析的作用,如在帧头中输入$BYTE(#3000) ,则变量索引为 0x3000 这个变量作为地址变量,通过变量索引为 0x3000 变量设置设备地址后,通过帧头 AB CD $BYTE(#3000) 可准确地让该设备进行解析,如图 5.1 所示。
图5.1 帧头设置
2、如何设置帧尾
勾选校验帧尾,即添加帧尾校验,可输入小于等于 10 字节长度数据,不勾选校验帧尾,即不添加。点击校验 帧尾输入框,弹出自定义指令函数说明窗口,在帧尾中输入指令函数$CRC16MODBUS(1,6) ,可对指令进行 MODBUS 校验,帧尾 00 $CRC16MODBUS( 1,6)如图 5.2 所示。
图5.2 帧尾设置
3、如何设置帧总长度
帧总长度即将接收的帧总长度,包括帧头、数据位和帧尾,如图 5.3 所示。
图5.3 帧总长度设置
4、如何设置关联变量
关联变量,用于将该解析方法与变量关联起来,填写的数值为变量的变量索引,比如 201 ,即最终解析出来 的值是变量 201 的值,例如索引为 201 的变量是系统时间年份,通过指令可设置系统时间年份。
图5.4 关联变量设置
5、如何设置数据起始偏移(字节)
数据起始偏移字节即这一帧里面的数据内容是从哪个字节开始的,如图 5.5 所示。
图5.5 设置数据起始偏移字节
6、如何设置数据长度 (字节)
数据长度字节即从数据起始偏移字节开始之后多少字节是数据,如图 5.6 所示。
图5.6 设置数据长度(字节)
7、如何设置数据位偏移
数据位偏移:只有当选择数据类型为 1 位或者 2 位时候才出现,它的意思是选取该字节的第几位 (从 0 开始 数) ,比如数据格式选了 1 位,数据位偏移为 3 ,接收到的数据为 0xaa ,二进制显示为:10101010 ,那么这 时候获取到的值为 1 。假如数据格式选了 2 位,10101010 ,那么这时候获取到的值为 01 (二进制) ,如图 5.7
所示。
图5.7 设置数据位偏移
8、如何设置数据格式
1 位:单字节例如 0x41 ,那么其二进制显示为 01000001 ,每一个都是一个位,例如 (右数) 第一位为:1,
第二位为:0 ,依次类推
2 位:和 1 位一样,是以二进制进行运算,但是取其两个位,比如 01 或 00。
1 字节:数据格式是单字节,如 a1。
2 字节 (高位在前) :数据假如是 1 ,那么接收到的数据必须为 00 01
2 字节 (低位在前) :数据假如是 1 ,那么接收到的数据必须为 01 00
4 字节 (高位在前) :数据假如是 1 ,那么接收到的数据必须为 00 00 00 01
4 字节 (低位在前) :数据假如是 1 ,那么接收到的数据必须为 01 00 00 00
如图 5.8 所示。
图5.8 数据格式设置
9、如何设置数据类型
开关量:这里必须与数据比较这一栏一起看:
当获取到的数据内容与数据比较填入的值完全相同时候,数据值为 1,反之则为 0.假如数据比较写入:26 14, 接收到的数据为 26 14 ,那么该数据正确,开关量变为开,也就是 1 ,反之,开关量为关,也就是 0 ,从而达 到开关目的。1 位的数据比较是与 0, 1 进行比较,2 位取出来数据为 0, 1,2,3 ,故比较数据为 0-3。
连续量:
在连续量里,对应可以填入公式,假如不填,那么数据接收后就是原数据,假如加入公式,如上图所示:@ 代表接收到的数据,#3000 代表变量 3000 ,全部变量均要加上#号。
10、如何设置事件编号
设置事件处理,即接收到指令解析后,同时执行事件处理方法,填写事件处理编号,如图 5.9 所示。
图5.9 设置事件编号
6.如何设置事件处理
设置事件处理,即接收到指令解析后,同时执行事件处理方法。
1、如何添加事件处理
点击菜单栏中的事件,选择事件处理→弹出事件处理窗口→点击添加→设置事件编号(事件编号为 100-65535) 如图 6.1。
图6.1 添加事件处理
2、如何设置数据格式
数据格式设置其数据类型,如图 6.2 所示。
图6.2 设置数据格式
3、如何设置处理方法
点击添加事件处理方法→点击“… ”按钮弹出处理方法窗口→根据设置需求进行设置处理方法 ( 一个事件可
添加多个处理方法) ,如图 6.3 所示。
图6.3 添加事件处理方法
4、仿真演示
接收到指令 AB CD 00 07 E4 00 CE D1,系统时间年份修改为 2020,同时界面切换至 NEW2 窗口且发送指令 11 22 33 44
指令解析前,如图 6.4 所示
图6.4 仿真演示
指令解析后,如图 6.5 所示。
图6.5 仿真演示
7.如何通过自定义指令解析触发事件
通过自定义指令解析触发事件分为两种类型,分别通过开关量对比触发及连续量直接触发
1、通过开关量触发,设置如下
关联变量不填,帧尾选择性填,其他必填,意思是当长度,数据长度以及帧头 (帧尾) 符合时候,通过对比 数据是否为 00 01 (必须与数据格式对应) 决定是否触发编号为 100 的事件
2 、直接触发,设置如下:
转换公式与关联变量不填,帧尾可选择性填,其他必填,当长度,数据长度以及帧头 (帧尾) 符合时候直接 触发。
若有收获,就点个赞吧