6 运算说明

通过 LUA 脚本配合工程可以完成大部分的运算逻辑,可以做到让MCU 只参与数据处理,不参与屏的逻辑处理 本文使用 LUA 脚本实现简单的逻辑运算以及字符处理,大部分运算函数和字符处理函数均来自于 LUA 的 math 库和 string 库,使用这些函数时可以借助网上的资料了解使用方法 ,本文主要讲述以下功能:

  1. 简单运算:介绍算数运算中的“+”、”-“、”*“、”/“,逻辑”=“、”>“、”<“等等

  2. math函数库:介绍部分math函数

  3. string函数库:介绍部分string函数

  4. 简单逻辑处理演示

注意: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,作为触发运算的按钮,如下所示

arithmetic

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,作为触发运算的按钮,如下所示

math

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,作为触发运算的按钮,如下所示

string

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上,用于切换页面,画面配置如下所示:

dialogbox

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脚本,运行结果如下所示

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2023-03-30 10:42:51

results matching ""

    No results matching ""