前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >威纶通九宫格解锁触摸屏

威纶通九宫格解锁触摸屏

作者头像
自动化大师
发布2024-08-14 19:40:54
600
发布2024-08-14 19:40:54
举报
文章被收录于专栏:自动化大师

随着人机界面(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应用程序。

源代码如下:

代码语言:javascript
复制
// 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;
    }
}

本文资料来源于威纶通官网

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自动化大师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档