node-red限速分流节点开发

2023-11-09

功能简述

  1. 此节点有一个输入,两个输出;
  2. 此节点可完成信息的限速分流功能,当信息高速输入时,节点进行限速处理(例:两秒一次),到指定时间后信息由一口输出,若未到指定时间(两秒)信息由二口输出。

节点设计

界面设计

节点界面中可设置信息传输速度,每多少秒限制多少条信息。
界面
代码如下:


<script type="text/html" data-template-name="delaytest">
    <div class="form-row">
        <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name">名称</span></label>
        <input type="text" id="node-input-name" date-i18n="[placeholder]node-red:common.label.name" autocomplete="off"
            dir placeholder="name">
    </div>

    <div id="rate-details">
        <div class="form-row">
            <label for="node-input-rate"><i class="fa fa-clock-o"></i> <span data-i18n="delay.rate">速度</span></label>
            <label for="node-input-rateUnits"><span data-i18n="delay.msgper"></span></label>
            <input type="text" id="node-input-nbRateUnits" placeholder="1"
                style="text-align:end; width:40px !important">
            <select id="node-input-rateUnits" style="width:90px !important">
                <option value="second" data-i18n="delay.label.units.second.singular"></option>
                <option value="minute" data-i18n="delay.label.units.minute.singular">分钟</option>
                <option value="hour" data-i18n="delay.label.units.hour.singular">小时</option>
                <option value="day" data-i18n="delay.label.units.day.singular"></option>
            </select>一条信息
        </div>
    </div>
</script>


<script type="text/javascript">
    RED.nodes.registerType('delaytest', {
        category: 'function',
        color: "#E6E0F8",
        defaults: {
            name: {
                value: "name"
            },
            rate: {
                value: "1",
                required: true,
                validate: function (v) {
                    return RED.validators.number(v) && (v >= 0);
                }
            },
            nbRateUnits: {
                value: "1",
                required: false,
                validate: RED.validators.regex(/\d+|/)
            },
            rateUnits: {
                value: "second"
            }
        },
        inputs: 1,
        outputs: 2,
        icon: "timer.svg",
        label: function () {
            if (this.name) {
                return this.name;
            }
            var rate = this.rate + " msg/" + (this.rateUnits ? (this.nbRateUnits > 1 ? this.nbRateUnits :
                '') + this.rateUnits.charAt(0) : "s");
            return this._("delay.label.limit") + " " + rate;
        },
        labelStyle: function () {
            return this.name ? "node_label_italic" : "";
        },
        oneditprepare: function () {
            var node = this;
            $("#node-input-rate").spinner({
                min: 1
            });
            $("#node-input-nbRateUnits").spinner({
                min: 1
            });
            $("#node-input-nbRateUnits").on('change keyup', function () {
                var $this = $(this);
                var val = parseInt($this.val());
                var type = "singular";
                if (val > 1) {
                    type = "plural";
                }
                if ($this.attr("data-type") == type) {
                    return;
                }
                $this.attr("data-type", type);
                $("#node-input-rateUnits option").each(function () {
                    var $option = $(this);
                    var key = "delay.label.units." + $option.val() + "." + type;
                    $option.attr('data-i18n', 'node-red:' + key);
                    $option.html(node._(key));
                });
            });
        }
    });
</script>

功能设计

这里主要参考官方delay节点中的限速部分代码。
代码如下:

module.exports = function (RED) {
    "use strict";
    function DelatTestNode(n) {
        RED.nodes.createNode(this, n);
        this.rateUnits = n.rateUnits;
        // 速率计时时间单位选项
        if (n.rateUnits === "minute") {
            this.rate = (60 * 1000) / n.rate;
        } else if (n.rateUnits === "hour") {
            this.rate = (60 * 60 * 1000) / n.rate;
        } else if (n.rateUnits === "day") {
            this.rate = (24 * 60 * 60 * 1000) / n.rate;
        } else { // Default to seconds
            this.rate = 1000 / n.rate;
        }
        // 规定限制速率:每条信息‘nbRateUnite’秒
        this.rate *= (n.nbRateUnits > 0 ? n.nbRateUnits : 1);
        this.name = n.name;
        this.buffer = [];
        this.intervalID = -1;
        var node = this;
        // reportDepth
        node.reportDepth = function () {
            if (!node.busy) {
                // 赋值node.busy以下函数的运行时间
                node.busy = setTimeout(function () {
                    // 判断node.buffer.length长度是否大于0,即输入的是否为正常字符串
                    if (node.buffer.length > 0) {
                        //显示nodered节点状态
                        node.status({
                            text: node.buffer.length
                        });
                    } else {
                        node.status({});
                    }
                    node.busy = null;
                }, 500);
            }
        }
        // 限制速率、每一个topic函数
        node.intervalID = setInterval(function () {
            while (node.buffer.length > 0) { // send the whole queue
                var msg1 = null;
                var msg2 = {
                    payload: node.buffer.shift()
                };
                node.send([msg1, msg2])
            }
            node.reportDepth();
        }, node.rate);

        node.on("input", function (msg) {
            if (msg.hasOwnProperty("reset")) {
                if (node.intervalID !== -1) {
                    clearInterval(node.intervalID);
                    node.intervalID = -1;
                }
                delete node.lastSent;
                node.buffer = [];
                node.status({
                    text: "reset"
                });
                return;
            }
            var timeSinceLast;

            timeSinceLast = process.hrtime(node.lastSent);
            if (((timeSinceLast[0] * 1000000000) + timeSinceLast[1]) > (node.rate * 1000000)) {
                node.lastSent = process.hrtime();
                var msg1 = null;
                var msg2 = {
                    payload: msg.payload
                };
                node.send([msg2, msg1]);
            } else {
                var msg1 = null;
                var msg2 = {
                    payload: msg.payload
                };
                node.send([msg1, msg2]);
            }
        });
        node.on("close", function () {
            clearInterval(node.intervalID);
            node.buffer = [];
            node.status({});
        });
    }
    RED.nodes.registerType("delaytest", DelatTestNode);
}

功能实现

串行总线(RS485)由于其非平衡传输特性的限制,广泛应用主从MODBUS RTU(ASCII)协议。主从协议严格遵循请求应答机制,尤其在主机向总线中各从机查询数据时,需要逐个设备节点、逐片寄存器发起请求。实际应用中称之为MODBUS总线数据轮询。

基于此节点的分流限速功能,可用于不同采集周期情况下的多设备数据轮询。如下图所示:
采集
假设在某应用场景下,三个设备分别需要每一秒,两秒,三秒采集一次数据,各设备按照指定周期时间采集数据,为避免占用数据传输总线冲突,当设备采集时间相同时,切换为轮询的方式依次采集数据。

即在第一秒时,信息传递路径为:
第一秒
第二秒时,信息传递路径为:
第二秒
第三秒时,信息传递路径为:
第三秒
之后的时间以此类推,在此基础上也可以添加更多设备或设置其他采集周期的设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node-red限速分流节点开发 的相关文章

  • 如何使图像保留在 CSS 网格容器的行中?

    下面的代码显示了当我调整窗口大小时的预期行为 Chrome 60 和 Firefox 55 中 但 iOS Safari 10 3 中除外 这很可能是它在 Safari 中行为不当的另一个问题 html body width 100 hei
  • 如何从下到上显示垂直进度条

    我需要帮助 当 window onload 时 我怎样才能制作进度条 它必须从下到上填充 在这段代码中它的工作原理相反 function move var elem document getElementById myBar var hei
  • 使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP

    我有一个 PHP 脚本 它使用exec函数来执行 Node 脚本并将一些数据返回到同一 PHP 脚本 我的问题是我需要将数据返回给 PHP 而不必等待中的清理代码finally完成 我在下面编写了一些示例代码 向您展示代码的流程并说明我的问
  • div 上的背景图像未显示; div 正在折叠

    CSS body background url ninabg jpg left top no repeat background size 100 auto image background repeat no repeat backgro
  • 在函数中使用node-mysql

    我对 Nodejs 很陌生 有一个问题 尝试创建一个函数 该函数将调用我在表中提到其 ID 的任何字段的值 function getUserInfo userID dynamicField var query connection quer
  • Google 组织结构图数据溢出到 div 之外

    我在一个项目中使用 Google Org 图表 图表的内容在包含的 div 之外流动 该 div 在下面以红色突出显示 我希望图表的节点能够移动到下一行 以防它流到 div 之外 爱丽丝将移动到下一行 数据将继续 See my 在这里摆弄
  • 如何安全地存储 Discord(OAuth2) 用户的访问令牌?

    我正在努力寻找一种安全保存访问令牌的方法 我的 Web 应用程序在用户授权应用程序后从 DiscordAPI 检索到该访问令牌 我正在为 Discord 机器人创建一个网络界面 重要的是 不是每个人都可以使用它 仅应允许特定 Discord
  • AJAX 加载 WordPress 内容

    我一直在遵循 AJAX 教程来尝试将我的 WordPress 帖子内容加载到我网站的主页上 而无需重新加载页面 我不知道为什么 但是当单击链接时 它仍然导航到页面 而不是将内容加载到我指定的 div 中 不管怎样 这对我来说有点太多了 我希
  • 使用 js 并尝试部署到运行 Linux 的个人服务器时找不到节点模块“node:fs”

    Error Cannot find module node fs at Function Module resolveFilename internal modules cjs loader js 636 15 at Function Mo
  • npm 命令不显示任何输出或结果

    npm v 没有给出任何输出 https i stack imgur com 1Z5yf png 请参阅附图 我已经安装了node js 打开我的 git bash 后 如果我运行 node v 它会给我节点版本 但是在我写 npm v 后
  • 如何将 Chosen 合并到我的 React 项目中?

    我想使用 jquery 插件Chosen https harvesthq github io chosen 在我的项目中 我安装了 jQuery 并通过 npm 选择 npm i jquery chosen js S 这两个库现在都位于我的
  • jquery画布图像下载

    我有我的画布元素和一些 div 单击后我希望打开下载 画布快照 现在我有 save live click function e var image canvas toDataURL image png true var imageEleme
  • 如何在WebView中隐藏滚动条?

    我切换到WKWebView因为UIWeb视图Apple 不再建议使用 使用以下代码从 WebView 中的容器加载 HTML 文件 let webview myWKWebViewClass webview for Bundle main f
  • jquery 可以操作用 DOM 创建的临时文档吗?

    我想要实现的目标是通过传递一个大的 html 字符串来操作使用 jquery 使用 DOM 创建的文档 考虑以下示例 var doctype document implementation createDocumentType html v
  • 测量渲染时间的工具

    是否有工具可以测量页面上元素的实际渲染时间 我指的不是资源的下载时间 而是浏览器渲染某些内容所花费的实际时间 我知道这个时间会根据客户端计算机上的因素而有所不同 但对于了解渲染引擎需要一段时间加载的内容仍然非常方便 我想这应该是一个有用的实
  • 如何从自动添加的电子邮件中删除 data-saferedirecturl

    我正在使用 php 发送电子邮件 其中包含 exe 文件的下载链接 但是 gmail 在锚标记中添加了 data saferedirecturl 属性 该属性不允许下载文件 如果复制了网址并粘贴到新选项卡中 则开始下载 a href url
  • 错误:找不到模块“@discordjs/opus”

    每次我运行不和谐的语音识别代码时 它都会上线 但一旦加入频道 我的代码就会显示错误 找不到模块 discordjs opus Require stack C Users SURYASH Desktop DiscordSpeechBot no
  • 仅在第一次使用 localStorage 加载网站时显示 DIV

    我正在尝试完成这项工作 但我遇到了一些问题 就像标题所说 我希望仅在第一次加载网站时显示 DIV 我知道如何使用 PHP 和 Cookie 但我想要使用 localStorage 函数 这是我的代码 div div document rea
  • HTML 列表元素:将父级宽度分成相等的部分

    我有一个父母 ol 和几个 li 中的项目 ol style display block li style display block Item 1 li li style display block Item 2 li li style
  • 类型“CombinedVueInstance>>”上不存在属性“XXX”

    我使用 TypeScript 创建了一个 vue 组件 并且在以下位置收到此错误data and in methods Property xxx does not exist on type CombinedVueInstance

随机推荐

  • 处理不同的请求--设置content-type

    content type的作用 在http协议中 content type用来告诉对方本次传输的数据的类型是什么 在请求头中设置content type来告诉服务器 本次请求携带的数据是什么类型的 在响应头中设置content type来告
  • 写在28岁,回看3年前的自己,庆幸当时入了软件测试这行

    为什么会学习软件测试 已经28岁了 算一下快过去3年了 刚毕业那会工作了一年 因为自己当时很迷茫 觉得自己挺废的 所以就没去工作就一直在家 家里固定每个月给点生活费 但还是没钱 但家里给了我一套房子 出门300米左右就是地铁站 自己一个人住
  • Java框架--Spring(轻量级容器框架)(入门+ioc)

    目录 一 概念 海绵hong对于ioc的理解 二 spring快速入门 1 最基本的spring实例 1 1javabean类 1 2beans xml 1 3 ioc容器使用 2 spring 容器结构 机制 2 1beanDefinit
  • kmalloc使用相关

    Kmalloc内存分配和malloc相似 除非被阻塞否则他执行的速度非常快 而且不对获得空间清零 Flags参数 include
  • swin-transformer训练自己的数据集<自留>

    使用swin transformer训练自己的数据集 lt 自留 gt 前期准备 数据处理 标注数据集 一 结构目录 二 要修改的地方 三 开始训练 四 训练过程结果 前期准备 数据处理 标注数据集 LabelMe gt COCO Labe
  • 24岁,月入15000:真正优秀的人,都在做一件事

    昨天 一位经常来转载我文章的编辑朋友找我聊了会 聊完之后 很想写篇文章来谈谈我内心的感受 他告诉我 下个月就要去深圳了 那边有一家公司希望他过去 毕业两年 24岁 月收入稳定在15000 用 年轻有为 来形容他 我觉得并不为过 和他相比起来
  • 服务器系统水星无线网卡,水星设置远程服务器

    水星设置远程服务器 内容精选 换一换 本章节介绍Dubbo框架下DTM使用的demo 使得Dubbo框架下的项目可以通过TCC模式快速接入DTM 其中 Dubbo的样例代码在导入样例工程过程中准备的dtm demo的dtm dubbo项目中
  • Tomcat安装及基本使用

    1 什么是Web服务器 Web服务器是一种应用程序 软件 它封装了对HTTP协议的操作 使得开发人员无需直接操作协议 从而简化了Web开发 其主要功能是提供网上信息浏览服务 Web服务器安装在服务器端 我们可以将自己编写的Web项目部署到W
  • 概率与统计之一 标准差(standard deviation)和标准误(standard error)

    标准差和标准误差 标准差 standard deviation 和标准误差 standard error of mean 根据国际标准化组织 ISO 的定义 标准差 是方差 2的正平方根 而方差是随机变量期望的二次偏差的期望 什么是标准误差
  • 使用Scrapy爬取励志名句————祝万千学子高考顺利

    6月7日 2021年全国高考正式拉开大幕 1078万考生将赶赴考场 迎接人生路上的一次大考 在此 我将使用Scrapy爬取一些励志名句献给广大的高考考生 祝他们高考顺利 学业有成 流程分析 创建项目 创建爬虫程序 进行初始化设置 分析网页并
  • java oj 1035-1045

    1037 四则运算 Switch总是忘记break 输入一个字符 String s input next char ch s charAt 0 除数是0 用 s2 1e 10 即10的 10次方 判断 if Math abs b lt 1e
  • 激光雷达远距离灰尘扬尘烟雾粉尘检测

    最近对激光检测粉尘产生了一点兴趣 于是使用已有的雷达做了检测思路的验证 检测范围可以和雷达的扫描范围一致 约为 0 260m 验证过程使用面粉抛洒 场景如下 红色框就是粉尘的位置 俯视图如下 检测结果如下 绿色范围是检测算法自动框出来的结果
  • 升级Ubuntu18.04的linux kernel(修复小米游戏本的触摸板驱动问题)

    前言 前一段时间换电脑 置换了小米的游戏本 装了ubuntu18 04的系统 demesg发现一直报一个关于i2c接口的错误 473 518316 i2c hid i2c CUST0001 00 i2c hid get input inco
  • 小程序协议篇

    前言 采用的是uniapp的开发框架 引入了mp html的插件做富文本显示插件 操作 打开 富文本编辑 复制粘贴对应的协议文本 直接从word文档或者在线文档复制出来 要带样式的 点击F12或者右键点击检查 进入到Console下面 输入
  • python实现基数排序

    思路 先比较个位数 得到一个新的序列 再按照十位数排序 在上一个新序列的基础上又得到 一个新的序列 然后再按照百位数排序 在上一个新序列的基础上又得到一新的序列 只到排到所有数中的最高位 依次输出列表 排序结束 栗子 例 li 12 90
  • LeetCode 热题 HOT 100:二叉树专题

    LeetCode 热题 HOT 100 https leetcode cn problem list 2cktkvj 文章目录 94 二叉树的中序遍历 递归与非递归 补充 144 二叉树的前序遍历 递归与非递归 补充 145 二叉树的后序遍
  • Spring的Bean生命周期+bean注入+项目启动时正确姿势初始化数据的五种方式

    Spring的Bean生命周期 在Java中万物皆对象 既然是一个实例对象 那么就会有生命历程 被创建 gt 被使用 gt 被销毁 但是这说的太过于简洁了 以至于我们根本不能从本质上认清它具体的执行流程 生命历程 今天就来简单了解下Spri
  • 模型微调fine tune的注意事项以及技巧

    深度学习笔记 一 模型微调fine tune 熊宝宝爱学习的博客 CSDN博客
  • 【Linux】权限管理

    文章目录 1 shell命令以及运行原理 2 Linux权限的概念 3 Linux权限管理 3 1 文件访问者的分类 3 2 文件类型和访问权限 文件类型 file指令 文件权限 4 文件访问权限的设置 4 1 chmod指令 4 2 ch
  • node-red限速分流节点开发

    node red限速分流节点开发 功能简述 节点设计 界面设计 功能设计 功能实现 功能简述 此节点有一个输入 两个输出 此节点可完成信息的限速分流功能 当信息高速输入时 节点进行限速处理 例 两秒一次 到指定时间后信息由一口输出 若未到指