【问题标题】:Best practices in block based or flow based system programming基于块或基于流的系统编程的最佳实践
【发布时间】:2015-05-19 16:07:32
【问题描述】:

我正在尝试实现一个类似于 Labview 的系统(在 Java 中),其中一些块能够
- 采购
- 下沉
- 传递
数据。

每个块都有多个输入 (>= 0) 和多个输出 (>= 0),并专门用于输入、输出和转换数据的功能。数据流表示为样本,取自各种设备(温度计、风速计、辐照传感器、功率计等)的现场测量数据。

每个样本都与一个“纪元”相关,即从触发器开始捕获所有值的瞬间(源块应具有特殊的触发输入),因此来自纪元的样本组应与其他样本一起处理来自同一个。

例如,典型的区块链可以由源(温度传感器)表示,然后是平均块(传递),最后是能够将数据记录到数据库中的接收器(接收器块)。

我已经实现了一个类似推送的策略,其中每个块都拥有“下一个块”引用并在其上调用一个方法,将数据传递给处理。在遇到块(如比较器块,具有两个浮点输入和一个布尔输出)需要输出基于相同样本时期的比较值的情况之前,此策略可以完美运行。

问题是我无法找到并应用抽象这个问题的模式。也许这类似于 Labview 或 Simulink 块在内部工作的方式,但我仍然没有成功找到“最佳实践”。我的“推送策略”的主要问题是,根据链的大小和深度,具有多个输入的块完成处理属于不同时期的样本(想象一个比较器块比较来自两个不同测量的两个样本)。

在此先感谢您提供的所有建议、技巧、最佳实践以及能够解决我比编程更哲学的问题的一切。

【问题讨论】:

  • 你能澄清一下“比较块”的问题吗?是否因为 2 个输入在不同时间出现的时间有问题?
  • 要回答您的最佳实践问题,您可能会发现诸如此类的企业解决方案很有趣(无从属关系)inductiveautomation.com/scada-software
  • 我知道已经有商业解决方案在做我的工作。由于我必须从头开始编写软件并且我有特殊要求,因此我的选择倾向于概念验证和最佳实践搜索。您正在解决的比较器块问题之所以发生,是因为在仅由事件驱动的环境中移动,时间变得至关重要。

标签: design-patterns block implementation flow


【解决方案1】:

有趣的问题!

我建议将“块”(以盒子表示的功能单元)、拓扑(块如何连接的定义)和控制(实例化块、仲裁消息传递和进行流控制)的概念分开导致块在正确的时间执行等..)。目的是消除块之间的耦合(块之间应该完全不知道彼此)并创建一个可任意配置的系统。

以下是我对三个主要组成部分的看法:

拓扑

拓扑定义:拓扑的定义通常出现在资源文件中,而不是代码文件(应该是用户可配置的权限)。资源文件应该包含有关哪些块、它们的输入(输出通常可以从输入的知识中得出)的信息,并定义一个块可能具有的任何属性。例如,资源 JSON 文件可能如下所示:

[{ uniqueId:"1",
   type:"Number",
   val:0.3
 },
 { uniqueId:"2",
   type:"Sine",
   stepSize:0.1,
   initialOutput=0
 },
 { uniqueId:"3",
   type:"Multiplier",
   inputs:["1","2"],
   initialOutput=0
 },
 { uniqueId:"4",
   type:"Plotter",
   inputs:["3"],
 }]

控制

控制机制首先读取拓扑定义(不要忘记验证),然后使用此信息来实例化块组件并创建消息传递基础架构,使用每个块具有的输入知识将块组件连接在一起(处理每个输入作为一个单独的消息队列)。特别是控制器需要确定每个时间步中块的执行顺序。在每个时间步,控件都会执行几个步骤,首先从区块链的开头开始将输出推送到“正在侦听”的输入队列。执行下一层块。将输出推送到下一层块等。(或其他类似的策略。)

屏蔽

这些块基本上只知道如何获取给定的输入并返回合适的输出。


顺便说一句,您可以研究的另一个类似系统是电气工程师使用的电路仿真程序(如 Spice)。这些通常包括电路组件(您的模块)、节点列表文件(拓扑定义)和某种模拟运行时。


反正这是我的想法..

【讨论】:

  • 你的想法是一个很好的理论起点。我使用您提供的信息扩展了我的阅读内容,最后偶然发现了一个名为“反应式编程”的概念。您的建议和关于 RP 的概念之间的结合可能是一个解决方案,我正在使用 RxJava 实现概念验证。
【解决方案2】:

这类问题可以通过同步输入来解决。

在LabVIEW VI中,输入都是在VI启动时定义的。因此,它们都具有相同的时代。通过不同路径工作需要多长时间的差异变得没有实际意义。

如果多个 VI 处理一个数据集,则有一个 VI 每个周期从源收集一次所有数据。代码分为三个阶段。收集数据。处理数据。输出数据。这意味着所有源数据都具有相同的纪元。

对于控制应用,这种同步对于使控制系统数学稳定至关重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多