图形化数据流组合框架

11

我有兴趣将类似于MathWorks Simulink的工具嵌入到我的应用程序中。在这个嵌入式工具中,单元被表示为块,每个块都有其输入和输出端口以及使用我的块定义文件中的参数(该文件以任何工具所需的方式编写)。我想让框架是通用的,并从某个地方读取块定义,然后允许用户根据其定义组成给定块的数据流(最好配有图形编辑器来完成此操作)。然后,我希望该工具导出用户组合的块数据流,我可以用Java(或其他语言)编程来实现所需的任何操作,例如构建给定数据流的可执行版本。

我知道在高级别上,导出的块组合可以足够智能化地可执行,但我可以接受导出块组合/拓扑图以及彼此连接的输入和输出。换句话说,我不需要数据流编程语言,只需要工具集,允许图形化组合数据流,然后将组合导出为JSON或其他某些格式,我可以在编程语言中加载并对其进行任何处理。

上述框架/工具是Simulink针对来自其不同库的块所做的事情,但我需要将这样的工具嵌入到自己的工具中,并想知道哪个开源项目接近我想要做的事情。我猜我想要的是数据流组合框架。请纠正我对此的看法。


1
我认为,在已知的宇宙中并不存在标准的数据流语言,因此也没有相应的编辑器。我和我的朋友创建了一个原型DF系统,并使用一种简单的DF脚本标记语言,我们可以使用一个小型PHP应用程序来显示它,该应用程序将我们的DF脚本转换为GraphViz脚本。 - ern0
8个回答

5
数据流语言是 Petri 网络的一种特殊情况。彩色 Petri 网络 由多个位置组成,每个位置都有着不同颜色的令牌,代表不同的数值(颜色就是“数据类型”的一个有趣称呼,一个值就是一个颜色/数据类型实例)。来自多个位置的令牌通过变迁结合在一起,产生后续位置的令牌;“变迁”可以结合“颜色”(例如,计算值)。因此,您可以为浮点值设置一个令牌“颜色”,并使用加、减、乘、除等变迁来轻松地建模算术数据流(例如 Simulink)。
更重要的是,彩色 Petri 网络非常通用。它们可以填充层次化的 CPN,从而实现数据流子程序的效果,并允许进行各种扩展(例如定时约束等)。 Colored Petri Net Tools 网站提供了一整套工具,用于构建/编辑/显示甚至评估任意彩色Petri网。您甚至可能不需要编写Java程序来对其进行评估!它甚至提供了这些图形的静态分析,例如“终止”等,在Matlab或National Instruments风格的数据流语言中通常无法获得。我不会感到惊讶如果有基于Java的CPN工具版本;该组已经建立了这样的工具超过十年。如果有一种相对容易地将颜色和转换限制为特定集合(例如,您定义的“dataflow”语言)的方法,我也不会感到惊讶。

2
我建议使用Yakindu Statecharts Tool进行翻译。虽然我不确定它是否过于复杂,但我认为应该在这里提到它。您可以定义规则,并在连接不应该连接的事物时显示错误。我认为它看起来有点像Simulink,不是吗?

1

您应该看一下J. Paul Morrison的DrawFBP。我无法用它画出一条边,但这可能是我的问题。

此外,我见过的最好的UI是moonbase.com,如果我写一个(我会的),它会很相似。漂亮的预览区域,教程模式,非常漂亮。我还没有弄清楚编辑器是否可用或这个项目的目标是什么。


最后,我们的DF脚本语言(只是为了看看,我们应该用图形编辑器隐藏什么):

redbutton: Button  // we have a button
redbutton.press >> redlamp.on   // it turns the red lamp on
redbutton.press >> greenlamp.off  // and the green off
redbutton.presst >> redmsg.in  // also reports the action

greenbutton: Button  // opposite
greenbutton.press >> greenlamp.on
greenbutton.press >> redlamp.off
greenbutton.press >> greenmsg.in

redlamp: Lamp
greenlamp: Lamp

redmsg: Text
redmsg.value = "red"
redmsg.out >> console.in

greenmsg: Text
greenmsg.value = "green"
greenmsg.out >> console.in

console: Stdout

正如您所看到的,该语言仅包含3个元素:

  • 放置组件(名称:Type)
  • 设置属性值(compname.propname = value)
  • 定义消息(srccomp.srcport >> dest.destport)

当然,拥有一个图形编辑器会更好。目前我们只有可视化工具。

generated DF graph


1
我也在寻找类似的工具,偶然发现了JGraph,这是一个开发库,可用于构建自己的交互式图形/图表绘制工具。这并不意味着您必须自己完成所有艰苦的工作,因为com.mxgraph.examples.swing.GraphEditorexamples文件夹中已经提供了一个很好的起点。
那个演示编辑器的截图

enter image description here

当导出为所谓的mx Graph Editor文件(*.xme)时,实际上得到的是xml。对于上面的示例:
<mxGraphModel>
    <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="4" parent="1" style="fontSize=24" value="Start"
            vertex="1">
            <mxGeometry as="geometry" height="120.0" width="160.0" x="80.0"
                y="250.0" />
        </mxCell>
        <mxCell id="5" parent="1" style="fontSize=24" value="???"
            vertex="1">
            <mxGeometry as="geometry" height="120.0" width="160.0" x="310.0"
                y="480.0" />
        </mxCell>
        <mxCell edge="1" id="6" parent="1" source="4" style="" target="5"
            value="">
            <mxGeometry as="geometry" relative="1">
                <mxPoint as="sourcePoint" x="290.0" y="310.0" />
                <mxPoint as="targetPoint" x="220.0" y="330.0" />
            </mxGeometry>
        </mxCell>
        <mxCell id="9" parent="1" style="fontSize=24" value="Profit"
            vertex="1">
            <mxGeometry as="geometry" height="120.0" width="160.0" x="570.0"
                y="710.0" />
        </mxCell>
        <mxCell edge="1" id="10" parent="1" source="5" style="" target="9"
            value="">
            <mxGeometry as="geometry" relative="1">
                <mxPoint as="sourcePoint" x="520.0" y="670.0" />
                <mxPoint as="targetPoint" x="490.0" y="840.0" />
            </mxGeometry>
        </mxCell>
    </root>
</mxGraphModel>

使用标准的XML库解析文件应该不是问题,因此总而言之,在忽略所有位置信息的情况下,可以得到一个简单的数据流描述。
但请注意,我的建议仅供参考,因为我也在寻找正确的方法。

0

听起来你的用户应该编辑UML活动。因此,你可以建立在Eclipse PapyrusEclipse UML2 API之上。你需要为被编辑的活动附加更具体的语义,并限制用户可以编辑的内容(例如,你可能不希望通过活动分叉和合并节点进行并行执行)。然后执行编辑后的模型就变成了读取活动并按顺序执行它。如果进入一个节点,那么你只需要调用节点定义即可。这听起来很简单。

无论如何,我遵循@mantrid的建议,看看eclipse modeling project


对于Eclipse建模项目,尤其是图形编辑框架(GEF),我给予+1的支持。根据似乎的情况,当主应用程序为Swing时,可以在单独的窗口中使用SWT。这很有前途... - steffen

0

我不确定以下内容是否与您的期望完全相符,但您可以看一下Eclipse eTrice项目 - 它具有图形化编辑器,并导出以其自己的语言表达的模型。然而,实际上我不知道这个项目在实践中的成熟度以及目前可以用Java做什么。

您也可以查看其他Eclipse建模项目


0

你可以尝试使用 Cameleon: [http://www.shinoe.org/cameleon][1],它似乎很容易使用。这是一种图形化的函数式编程语言,采用数据(工作)流方法。

它是用C++编写的,但可以调用任何类型的本地或远程程序,这些程序可以用任何编程语言编写。

它具有多尺度方法,并且似乎是图灵完备的(这是Petri网扩展)。

祝好!


0

你也应该尝试一下 YAWL,它在图形化工作流编程方面有着相当不错的背景,你可以看到:

  1. [http://www.yawlfoundation.org/][1]

查看工作流模式,这是一种非常好的理论基础,我认为,可以用来接近图形化编程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接