基于块或基于流的系统编程的最佳实践

时间:2015-03-17 09:30:24

标签: design-patterns block implementation flow

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

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

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

 例如,典型的块链可以由源(温度传感器)表示,然后是平均块(直通),最后是能够将数据记录到数据库(接收器块)的接收器。 />
我已经实现了类似推送的策略,其中每个块拥有“下一个块”引用并调用一个方法将数据传递给进程。这个策略完美无缺,直到它遇到一个块(比如一个带有两个浮点输入和一个布尔输出的比较器块)需要根据相同的样本时期输出一个比较值的情况。

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

提前感谢所有建议,提示,最佳实践以及能够解决我的编程问题而非编程问题的所有问题。

2 个答案:

答案 0 :(得分:0)

有趣的问题!

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

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

<强>拓扑

拓扑定义:拓扑的定义通常发生在不是代码文件的资源文件中(应该是用户可配置的)。资源文件应包含有关哪些块,它们的输入(输出通常可以从输入知识中获得)以及定义块可能具有的任何属性的信息。例如,资源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)。这些通常包括电路组件(您的块),节点列表文件(拓扑定义)和某种类型的模拟运行时。


无论如何,这就是我的想法..

答案 1 :(得分:0)

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

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

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

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