6 运算说明
通过 LUA 脚本配合工程可以完成大部分的运算逻辑,可以做到让MCU 只参与数据处理,不参与屏的逻辑处理 本文使用 LUA 脚本实现简单的逻辑运算以及字符处理,大部分运算函数和字符处理函数均来自于 LUA 的 math 库和 string 库,使用这些函数时可以借助网上的资料了解使用方法 ,本文主要讲述以下功能:
简单运算:介绍算数运算中的“+”、”-“、”*“、”/“,逻辑”=“、”>“、”<“等等
math函数库:介绍部分math函数
string函数库:介绍部分string函数
简单逻辑处理演示
注意:math库和string库不全部包含,不支持部分的函数,需要用户自己编辑功能函数
适用范围:M系列、W系列、X系列、F系列(固件版本 >= V4.2.401.0)
例程下载链接:《控件属性设置》(点击跳转)
1.本教程文档中所涉及到的部分的相关接口函数如下
在用户触摸修改控件回调函数:on_control_notify(screen,control,value)
- screen: 表示目标画面ID
- control:表示目标组态控件ID
- value :表示目标控件的值
获取组态控件的控件值:get_value(screen,control)
获取控件值,返回的是数值,eg: local value = get_value(0, 1)
设置组态控件的控件值:set_value(screen,control,value)
- screen: 表示目标画面ID
- control:表示目标组态控件ID
- value :表示目标控件的值,数值
按钮控件 | 文本控件 | 进度条/仪表/滑块/GIF/图标/菜单/滑动选择/旋转/子画面控件等 |
---|---|---|
Value = 0-弹起,1-按下,2-长按 | 帧数或小数 | 整数 |
获取文本/二维码控件的值:get_text(screen,control)
获取文本控件/二维码控件的控件值,eg: local text = get_text(screen,control)
设置文本/二维码控件的值 set_text(screen,control,text)
screen: 表示目标画面ID
control:表示目标组态控件ID
text :表示目标控件的值,字符串
2.math 数学库函数
开平方:math.sqrt(num)
- num:被开方的数值
取模运算(类求 x/y 余):math.fmod(x,y)
- x:需要取模的数值
- y:模数
取绝对值:math.abs(x)
- x:数值
获取数值的整数部分及小数部分:math.modf(x)
- x:数值
eg:local integer, decimal = math.modf(1.23) ,–-得到 integer =1,decimal = 23
3.string 字符串库函数
获取字符串长度:string.len(str)
- str:字符串
裁剪字符串:string.sub(str,i,j)
- str:字符串
- i:字符串的裁剪起始坐标
- j:字符串的裁剪终止坐标
6.1 简单运算
此画面中简单的演示了 LUA 基础运算中的加减乘除和关系比较运算
画面配置
画面中添加文本控件ID1~ID12,其中文本控件ID1为运算参数A、文本控件ID2为运算参数B,ID3~ID12参数A和B的各种运算的结果;添加一个按钮控件ID13,作为触发运算的按钮,如下所示
LUA脚本
根据上述的画面配置,编辑LUA脚本,当按钮控件ID13按下的时候,将参数A、参数B的结果显示出来。关系逻辑运算,得出的结果为真显示1,为假显示0,代码如下所示
--[[***************************************************************************
** Function name: on_control_notify
** Descriptions: 用户通过触摸修改控件后,执行此回调函数。
点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
注意:回调函数的参数和函数名固定不能修改
** Input value : screen 画面ID
control 控件ID
value 控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
--******************************************************
--功能:算数运算
--调用函数:set_value(screen,control,value)
--调用函数:get_value(screen,control)
--Input value : screen 画面ID
-- control 控件ID
-- value 控件值
--******************************************************
if screen == 1 then
if control == 13 and value == 1 then --按下按钮显示运算结果
local A = get_value(1,1)
local B = get_value(1,2)
set_value(1,3,A+B) --显示A+B的结果
set_value(1,4,A-B) --显示A-B的结果
set_value(1,5,A*B) --显示A*B的结果
set_value(1,6,A/B) --显示A/B的结果
if A < B
then
set_value(1,7,1)
else
set_value(1,7,0)
end
if A > B
then
set_value(1,8,1)
else
set_value(1,8,0)
end
if A <= B
then
set_value(1,9,1)
else
set_value(1,9,0)
end
if A >= B
then
set_value(1,10,1)
else
set_value(1,10,0)
end
if A == B
then
set_value(1,11,1)
else
set_value(1,11,0)
end
if A ~= B
then
set_value(1,12,1)
else
set_value(1,12,0)
end
end
end
......
end
运行结果
根据画面配置和LUA脚本,运行结果如下所示
6.2 math函数库
LUA 的 math 库函数中提供了各种数学运算函数, 对于大部分数据处理可以直接在屏内使用脚本进行处理,无需外部 MCU 的参与
注意math库函数会有裁剪,测试时候应以实体屏为准,不能实现的函数,需要用户编辑功能函数实现
画面配置
画面中添加文本控件ID2~ID11、ID13;添加一个按钮控件ID13,作为触发运算的按钮,如下所示
LUA脚本
根据上述的画面配置,编辑LUA脚本,当按钮控件ID12按下的时候,执行相对于的数学函数,代码如下所示
--[[***************************************************************************
** Function name: on_control_notify
** Descriptions: 用户通过触摸修改控件后,执行此回调函数。
点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
注意:回调函数的参数和函数名固定不能修改
** Input value : screen 画面ID
control 控件ID
value 控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
......
--******************************************************
--功能:math库函数
--调用函数:set_value(screen,control,value)
-- set_text(screen,control,value)
-- get_value(screen,control)
-- get_text (screen,control)
--Input value : screen 画面ID
-- control 控件ID
-- value 控件值(包括文本控件输入的值)
--*******************************************************
if screen == 2 then
if control == 12 and value == 1 then --按下按钮12,运行函数
local value = 0
local value2 = 0
--********************************************************
--功能:开方
--调用函数:math.sqrt(num)
--参数 : num 数值
--*********************************************************
value = math.sqrt(16)
set_value(2,2,value)
--********************************************************
--功能:取模运算(类求x/y余)
--调用函数:math.fmod(x,y)
--参数 : x 数值
--参数 : y 数值
--*********************************************************
value = math.fmod(14,5)
set_value(2,3,value)
--********************************************************
--功能:取绝对值
--调用函数:math.abs(x)
--参数 : x 数值
--*********************************************************
value = math.abs(-16)
set_value(2,4,value)
--********************************************************
--功能:获取数值的整数部分及小数部分
--调用函数:math.modf(x)
--参数 : x 数值
--*********************************************************
value,value2 = math.modf(15.98)
set_value(2,5,value)
set_value(2,13,value2)
--********************************************************
--功能:余弦函数
--调用函数:math.cos(x)
--参数 : x 弧度
--*********************************************************
value = math.cos(0.5)
set_value(2,6,value)
--********************************************************
--功能:正弦函数
--调用函数:math.sin(x)
-- math.rad(30) 角度转换弧度
--参数 : 30 角度
--*********************************************************
value = math.sin(math.rad(30))
set_value(2,7,value)
--********************************************************
--功能:正切函数
--调用函数:math.tan(x)
--参数 : x 弧度
--*********************************************************
value = math.tan(0.5)
set_value(2,8,value)
--********************************************************
--功能:筛选出输入的参数中最大的参数
--调用函数:math.max(arg...)
--参数 : arg 数值(可多个参数,参数数量不定)
--*********************************************************
value = math.max(2.71,100,-98,23)
set_value(2,9,value)
--********************************************************
--功能:筛选出输入的参数中最小的参数
--调用函数:math.min(arg...)
--参数 : arg 数值(可多个参数,参数数量不定)
--*********************************************************
value = math.min(2.71,100,-98,23)
set_value(2,10,value)
end
end
......
end
运行预览
根据画面配置和LUA脚本,运行结果如下所示
6.3 string函数库
通过LUA脚本string库函数以及字符串特性,可以实现将两个或多个字符串拼接起来在一个文本框中显示,而且不需要外部MCU的参与
画面配置
画面中添加文本控件ID1~ID11,其中文本控件ID1为运算参数A、文本控件ID2为运算参数B,ID3~ID7参数A和B的各种运算的结果;添加一个按钮控件ID12,作为触发运算的按钮,如下所示
LUA脚本
根据上述的画面配置,编辑LUA脚本,当按钮控件ID12按下的时候,执行相对于的字符串函数,代码如下所示
--[[***************************************************************************
** Function name: on_control_notify
** Descriptions: 用户通过触摸修改控件后,执行此回调函数。
点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
注意:回调函数的参数和函数名固定不能修改
** Input value : screen 画面ID
control 控件ID
value 控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
......
--********************************************************
--功能:简单的字符串处理
--调用函数:set_value(screen,control,value)
--调用函数:get_value(screen,control)
--参数 : screen 画面ID
-- control 控件ID
-- value 控件值
--*********************************************************
if screen == 3 then
if control == 12 and value == 1 then
local str_value = 0
local str_value2 = 0
str_value2 = get_text(3,2)
str_value = get_value(3,1)
set_text(3,3,str_value..str_value2) --字符串拼接
--********************************************************
--功能:尝试将参数e转换为数字,当不能转换时返回nil
--调用函数:tonumber (e [, base])
--参数 : e 字符串
-- [,base](可选参数,不填时默认转十进制数值,填16转十六进制进制数)
--*********************************************************
if tonumber(str_value2) == nil then --字符串转数值
set_value(3,4,0)
else
set_value(3,4,tonumber(str_value2))
end
--********************************************************
--功能:尝试将参数e转换为字符串,当不能转换时返回nil
--调用函数:tonumber (e)
--参数 : e 数值
--*********************************************************
set_text(3,5,tostring(str_value)) --数值转字符串
--********************************************************
--功能:在文本框中显示获取字符串长度
--调用函数:tonumber (str)
--参数 : str 字符串
--*********************************************************
set_value(3,6,string.len(str_value2)) --string.len获取字符串的长度
--********************************************************
--功能:在文本框中显示截取字的符串str_value的第一个字符
--调用函数:string.sub(str,i,j)
--参数 : str 字符串
-- i 起始索引
-- j 截止索引
--*********************************************************
set_text(3,7,string.sub(str_value2,1,2)) --string.sub获取字符串的长度
end
end
......
end
运行预览
根据画面配置和LUA脚本,运行结果如下所示
6.4 简单逻辑处理演示
画面配置
简单逻辑处理
本文中列举了一个简单的逻辑运算演示,通过放置两个按钮,“+”按下时候文本中的数值加一,“-”按下时文本中的数值减一,并设置最大值为 10,最小值为0,达到最大值后跳出对话框提示已达到最大值
对话框配置
当按钮设置值大于文本值10时,弹出对话框,新建一个画面,画面属性为透明,控件ID1为图片控件,在添加两个按钮控件层叠在图片控件ID1上,用于切换页面,画面配置如下所示:
LUA 脚本
在程序中定义一个变量,按钮“+”/按钮“-”按下变量加一或减一,然后加上判断是否达到最大值或最小值,达到最值后调用函数 change_screen 切换到对话框的画面,提示已经到了最大值。按钮加减变量值以及判断变量大小的的代码如下所示
--[[***************************************************************************
** Function name: on_control_notify
** Descriptions: 用户通过触摸修改控件后,执行此回调函数。
点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
注意:回调函数的参数和函数名固定不能修改
** Input value : screen 画面ID
control 控件ID
value 控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
......
--********************************************************
--功能:达到最大值后弹出提示框。提示已到达最大值
--*********************************************************
if screen == 4
then
--********************************************************
--功能:按一下按钮计数值减一
--*********************************************************
if control == 2 and value == 1
then
test_value = test_value - 1
if test_value < 0 then
test_value = 0
end
set_value(4,3,test_value)
end
--********************************************************
--功能:按一下按钮计数值加一
--*********************************************************
if control == 4 and value == 1 then
test_value = test_value + 1
if test_value > 10 then
change_screen(5)
test_value = 10
end
set_value(4,3,test_value)
end
end
.....
end
运行预览
根据画面配置和LUA脚本,运行结果如下所示