首页 > 其他分享 >威纶通触摸屏实现九宫格解锁功能

威纶通触摸屏实现九宫格解锁功能

时间:2024-04-05 11:32:19浏览次数:22  
标签:function canvas 威纶通 pattern 解锁 九宫格 num let self

随着人机界面(HMI)深度融合各类IT技术,其应用领域得到了持续拓宽,不仅在工业、医疗、能源等领域发挥着重要作用,还深入到了智能家居等多元化系统之中。HMI的广泛应用,正推动着各行各业的智能化进程,提升着系统操作的便捷性和效率。

然而,随着应用领域的不断扩大,HMI在不同行业中所面临的挑战和瓶颈也日益凸显。为了突破这些应用上的限制,威纶通推出了创新的「JS元件」功能。这一功能不仅赋予了用户扩展HMI现有功能的能力,更通过串接多样化的API,满足了各行业对特殊需求的支持,从而进一步拓展了HMI的应用边界。
图片
JS元件的推出,是威纶通在HMI技术领域的一次重大突破。它打破了传统框架的限制,为开发人员提供了更加灵活、强大的工具。结合自行开发的JavaScript程序码,开发人员能够利用JS元件实现存取PLC设备数据、逻辑运算等多种功能。与Macro所提供的功能相比,JS元件展现出更加出色且多元化的性能,能够轻松应对各种复杂的应用场景。

因此,无论是工业生产的自动化控制,还是医疗设备的智能化管理,亦或是智能家居的便捷操作,JS元件都能发挥出其独特的优势,推动HMI在更多领域实现创新应用。威纶通将继续致力于HMI技术的研发与创新,为各行业提供更高效、更智能的解决方案。
图片

操作方法也很简单:

通过编程软件-JS元件添加

编写JS代码进行功能的实现,JavaScript 是一个相当成熟的程序语言,功能强大且实用,有许多现成的程序码可以提供参考。通过EasyBuilder Pro中的「JS资源」功能,让您在设计JS元件时,方便直接套用现有的JavaScript模块,快速打造出独一无二的HMI应用程序。
图片
源代码如下:


// defs
const SectionInterval = 100;
const SectionCount = 3; // for both horizontal and vertical directions
const NumberCount = SectionCount * SectionCount;
const NumberSensibleWidth = 50;
const encoder = new TextEncoder();
const MatchResult = {
    Undetermined: 0,
    Success: 1,
    Failure: 2,
};

// assign JS object to 'self'
var self = this;

// sets up UI
var patternCanvas = new Canvas();
var floatLineCanvas = new Canvas();
var mouseArea = new MouseArea();
self.widget.add(patternCanvas);
self.widget.add(floatLineCanvas);
self.widget.add(mouseArea);

initNumberSensibleRect();
reset();

mouseArea.on('mousedown', (mouseEvent) => {
    setMatchResult(MatchResult.Undetermined);

    let num = hitTest(mouseEvent);
    if (num >= 0) {
        addNumberToPattern(num);
    }
});

mouseArea.on('mousemove', (mouseEvent) => {
    clearFloatLine();

    // new number?
    let num = hitTest(mouseEvent);
    if (num >= 0 && !isNumberInPattern(num)) {
        addNumberToPattern(num);
    } else if (self.pattern.length > 0 && self.pattern.length < NumberCount) {
        addFloatLine(mouseEvent);
    }
});

mouseArea.on('mouseup', (mouseEvent) => {
    outputPattern();
    outputMatchResult();
    reset();
});

//===================================================================
function initNumberSensibleRect() {
    self.numberSensibleRect = new Array(NumberCount);

    for (let x = 0; x < SectionCount; x++) {
        for (let y = 0; y < SectionCount; y++) {
            let dot = x + y * SectionCount;
            self.numberSensibleRect[dot] = {
                x: x * SectionInterval + SectionInterval / 2 - NumberSensibleWidth / 2,
                y: y * SectionInterval + SectionInterval / 2 - NumberSensibleWidth / 2,
                width: NumberSensibleWidth,
                height: NumberSensibleWidth
            };
        }
    }
}

function reset() {
    console.log('[reset]');
    self.pattern = [];
    updateNumberValues();
    clearCanvas(patternCanvas);
    clearCanvas(floatLineCanvas);
}

function hitTest(mouseEvent) {

    for (let i = 0; i < self.numberSensibleRect.length; ++i) {
        let sensibleRect = self.numberSensibleRect[i];
        if (mouseEvent.x >= sensibleRect.x && mouseEvent.x < (sensibleRect.x + sensibleRect.width) &&
            mouseEvent.y >= sensibleRect.y && mouseEvent.y < (sensibleRect.y + sensibleRect.height)) {
            return i;
        }
    }

    return -1;
}

function addNumberToPattern(num) {
    self.pattern.push(num);
    console.log('[addNumberToPattern] pattern =', self.pattern);

    updateNumberValues();
    updatePatternCanvas();
}

function isNumberInPattern(num) {
    return (self.pattern.indexOf(num) >= 0);
}

function clearCanvas(canvas) {
    canvas.clearRect(0, 0, canvas.width, canvas.height);
}

function updatePatternCanvas() {
    if (self.pattern.length >= 2) {
        let canvas = patternCanvas;
        let startingPoint = pointFromNumber(self.pattern[0]);

        clearCanvas(canvas);
        canvas.strokeStyle = self.config.lineColor;
        canvas.lineWidth = 3;
        canvas.beginPath();
        canvas.moveTo(startingPoint.x, startingPoint.y);

        for (let i = 1; i < self.pattern.length; i++) {
            let point = pointFromNumber(self.pattern[i]);
            canvas.lineTo(point.x, point.y);
        }

        canvas.stroke();
    }
}

function addFloatLine(mouseEvent) {
    if (self.pattern.length > 0) {
        let canvas = floatLineCanvas;
        let lastPoint = pointFromNumber(self.pattern[self.pattern.length - 1]);

        canvas.strokeStyle = self.config.lineColor;
        canvas.lineWidth = 3;
        canvas.beginPath();
        canvas.moveTo(lastPoint.x, lastPoint.y);
        canvas.lineTo(mouseEvent.x, mouseEvent.y);
        canvas.stroke();
    }
}

function clearFloatLine() {
    clearCanvas(floatLineCanvas);
}

function outputPattern() {
    // prepare pattern string
    let strPattern = '';
    self.pattern.forEach((num) => {
        strPattern += (num + 1);
    });
    console.log('[outputPattern] pattern =', strPattern);

    // output pattern to address
    let encodedPattern = encoder.encode(strPattern);
    let bufferSize = driver.Address.getDataTypeSize(self.config.savedPatternSub.address.dataType) * self.config.savedPatternSub.length;
    let buffer = new ArrayBuffer(bufferSize);
    let data = new Uint8Array(buffer);
    data.set(encodedPattern);

    driver.setData(self.config.patternAddress, buffer);
    self.patternDataBuffer = buffer;
}

function setMatchResult(value) {
    driver.setData(self.config.matchResultAddress, value);
}

function outputMatchResult() {
    setMatchResult(isBufferEqualTo(self.patternDataBuffer, self.config.savedPatternSub.latestData.buffer)
        ? MatchResult.Success
        : MatchResult.Failure);
}

function updateNumberValues() {
    let values = new Array(NumberCount);
    values.fill(0);

    self.pattern.forEach((num) => {
        values[num] = 1;
    });

    driver.setData(self.config.numberValueAddress, values);
}

function pointFromNumber(num) {
    let x = num % SectionCount;
    let y = Math.floor(num / SectionCount);

    return {
        x: x * SectionInterval + SectionInterval / 2,
        y: y * SectionInterval + SectionInterval / 2
    };
}

function isBufferEqualTo(lhs, rhs) {
    if (lhs.byteLength == rhs.byteLength) {
        let lhs_array = new Uint8Array(lhs);
        let rhs_array = new Uint8Array(rhs);

        for (let i = 0; i < lhs_array.length ; i++) {
            if (lhs_array[i] != rhs_array[i]) {
                return false;
            }
        }

        return true;
    } else {
        return false;
    }
}

标签:function,canvas,威纶通,pattern,解锁,九宫格,num,let,self
From: https://blog.csdn.net/weixin_44633926/article/details/137396689

相关文章

  • 绕过WPS Office登录:轻松解锁所有功能的操作指南
    对于广大WPSOffice用户来说,最近的版本更新带来了一项不太受欢迎的变化:必须登录账户才能完全使用软件。这项更改意味着,如果用户在首次启动软件时拒绝登录,几乎所有的顶部工具栏按钮都会变为不可用状态,显示为灰色。尽管简单的登录过程可以轻松解决这个问题,但许多用户对此感到不满......
  • 立即解锁免费GPT4 API KEY,畅享顶尖资源!
    作者之前曾经探索过很多可以免费使用GPT-4的方法,但在使用一些AI工具或谷歌插件时,却需要填写GPT的APIKEY。而OpenAI是根据token数计费的。那么,有没有办法可以免费获得GPT的APIKEY呢?确实是有的。在这篇文章中,我将介绍如何通过一个开源工具取得免费的GPTAPIKEY,并探索在实际应用......
  • 九宫格按键输入
    华为OD算法题记录–前言一、题目描述九宫格按键输入,输出显示内容,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入""或者其他字符,则循环中断。二、输入描述:输入范围为数字0~9和字符#、/,输出屏幕......
  • 掌握Go语言:Go语言类型转换,解锁高级用法,轻松驾驭复杂数据结构(30)
    在Go语言中,类型转换不仅仅局限于简单的基本类型之间的转换,还可以涉及到自定义类型、接口类型、指针类型等的转换。以下是Go语言类型转换的高级用法详解:Go语言类型转换的高级用法1.自定义类型之间的转换在Go语言中,可以使用类型别名或自定义类型来创建新的数据类型。自定......
  • 解锁极速网络奥秘:网络加速器数据可视化大屏全解析
    在信息爆炸的时代,网络已经成为我们日常生活和工作中不可或缺的一部分。然而,网络速度慢、不稳定等问题时常困扰着我们,让许多重要的工作和学习进度受到严重影响。 网络加速器数据可视化大屏集数据分析、可视化展示于一体,它不仅能够实时监测网络状态,还能将复杂的数据以直观、易懂......
  • AppStore轻松订阅ChatGPT plus解锁GPT4的方法
    1、登录新账户1.1接着再次点击AppStore中右上角的头像,输入前面注册的美区账号&密码,点击 登录 即可。1.2点击付款方式,可以看到绑定成功的卡。这里我用的是556150的美元虚拟信用卡2、下载ChatGPTApp在AppStore里搜索ChatGPT或点击访问 ‎ChatGPTontheA......
  • Yarn命令全攻略:解锁前端开发的更多可能
    在前端开发的世界里,Yarn以其高效、稳定、可靠的特点,赢得了众多开发者的青睐。作为前端包管理工具,Yarn不仅提供了基础的依赖管理功能,还通过一系列丰富的命令,为我们解锁了前端开发的更多可能性。今天,就让我来为大家详细介绍一下Yarn的其他命令,带你领略它们的魅力所在。Yarn命......
  • 【学习革命】主动学习:打破传统,解锁高效学习新密码
    03主动学习:探索高效学习方法,提升自我知识与技能1.主动学习的定义与重要性主动学习是指学习者主动参与到学习过程中,通过探索、发现、思考、实践等手段,以提高自己的知识与技能。与被动学习相比,主动学习更强调学习者的主观能动性和参与性,有利于培养学习者的创新思维和问题解决......
  • 解锁社交媒体图像内容的深度学习之道
            社交媒体已经成为我们日常生活中不可或缺的一部分,人们通过分享图片、视频和文字来交流和表达自己。然而,这些海量的图像数据中蕴含着大量的信息和情感,而要从中准确地提取和理解这些信息,就需要借助先进的技术手段。深度学习作为人工智能领域的热门技术之一,为社交......
  • CAPL 自动化脚本 - UDS 安全解锁 Lv1
    一种简易的UDS$27解锁方式,使用capl脚本去实行自动化。利用CANoe自己的Diagnostic去诊断,返回。首先:声明27012702拿到种子后,使用diagGenerateKeyFromSeed函数去调用工程里面的DLL文件去计算。再将计算好的密钥发送到ECU。voidSecurityAccess_Lv1(){diagRequestDCM.re......