问题标签 [scxml]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
287 浏览

qt - QScxml ECMAScript 数据模型

我正在查看 QScxml ECMAScript 数据模型,因为我从未使用过 Qt 的任何脚本功能,所以我有点迷失了。我已经看到 Qt 有不同的脚本引擎(QtScript、QJSScript、QQMLEngine),它们都与 ECMAScript 标准兼容。所以我不太确定他们在QScxmlEcmaScriptDataModel的文档中提到的脚本语言是什么

QScxmlEcmaScriptDataModel 类是 Qt SCXML 状态机的 ECMAScript 数据模型。”

任何额外的信息或指针都会非常有帮助。

0 投票
1 回答
175 浏览

c# - 从 uSCXML 捕获数据?

我已经设置了一个小的 C# 控制台应用程序,并且可以在 scxml 文件上运行解释器,它似乎运行得很好。不幸的是,使用 uSCXML 的示例很少。

我在我的应用程序中嵌入了解释器以供运行时使用,所以所有问题都是指通过 C# 代码从 uSCXML 捕获数据。

以下是我的问题:
1) 如何从正在运行的 scxml 接收事件?(例如 < send event="event1" /> )
2) 使用 Lua 作为我的 DataModel 我如何从 scxml 中获取变量及其表达式/数据?

非常感谢您的帮助

0 投票
2 回答
716 浏览

qt - 没有pro文件的cmake项目中的Qt statemachine scxml?

我有一个大型 cmake 控制项目,我希望其中一部分使用来自 qt 的 scxml 状态机。我的问题如下:

如何添加 scxml 模块而没有我理解的 pro 文件不适用于 cmake?

就像是:

0 投票
0 回答
364 浏览

c++ - 如何使用 Qtest 测试 QT 状态机工作流程

我正在尝试实现基于 QT 状态机的工作流程,并且出于测试目的,我正在尝试使用 QTest 播放我的工作流程。

但可悲的是,即使我正确加载了我的 scxml,即使它看起来正在运行和初始化,active_state 始终是空的。

当我尝试使用正确的 QCoreApplication 时,一切看起来都很迷人,所以问题似乎来自 QTEST_MAIN

但是那些日志是在testapplication.exec()被调用之后出现的。

我是否需要添加一些东西才能在 QTest 创建的 QCoreApplication 中具有相同的行为?

谢谢 !

0 投票
0 回答
274 浏览

xml - 将 SCXML 拆分为多个 xml 文件

我正在创建不同的 SCXML 文件,然后由 Qt 应用程序使用。为了更好地构造我的状态机,我想将一台机器的公共部分与其他所有机器的自定义状态分开。所以我想把我的状态机分成2个文件。

父文件:parentStateMachine.scxml

特定于应用程序:applicationSpecific1.scxml

我尝试通过两种方式将特定于父应用程序的应用程序包括在内:

  1. 我尝试插入<xi:include href="applicationSpecific1.xml"parse="text"/>而不是评论。

  2. 我尝试<!DOCTYPE scxml [<!ENTITY innerFile SYSTEM "applicationSpecific1.scxml">]>xml标签之后添加,然后添加&innerFile;而不是评论。

当我加载文档时,它们会被很好地解析,但从行为中我会推断它没有考虑到应用程序特定的 scxml 中定义的任何内容。

PS: 我发现了这个旧的未解决的错误报告,我希望它已经解决了。 https://bugreports.qt.io/browse/QTBUG-1088

0 投票
0 回答
92 浏览

javascript - 分配 scxml 标记中的评估位置

如何在分配 scxml 标记中动态指定位置?我的 scxml 解释器不接受这样的东西。参数 expr="_event.data.expr" 被正确评估。但位置参数只接受确切的名称字符串。

现在我将使用绑定到事件的脚本来设置值,但这有点笨拙

0 投票
1 回答
95 浏览

scxml - 目标集的 SCXML 表示法

如何根据https://www.w3.org/TR/scxml/#LegalStateConfigurations定义“合法状态配置” 。我想指定一个目标集(!),而不是单个目标。目标集可以定义在and元素的initial属性中,也可以定义在元素的属性中。但我似乎在上述属性中找不到任何表示多个状态的例子。它们必须是空间分隔的吗?还是根据 JavaScript 的数组表示法?还是对象符号?还是逗号分隔?感谢您的任何提示。<scxml><state>target<transition>

但无论如何,我想知道我在标准中遗漏了什么,以确保独立于解释器。

这是一个小测试代码:

测试:在进入时,状态State_3_2State_4_2必须是活动的(initial元素正确执行),在事件之后switch_hist,状态State_1_2State_2_2必须是活动的(transition属性正确执行)。如果有人有除 SCION 之外的所有解释器,你可以在那里测试吗?前 4 行的替代语法也替换为

谢谢你。

0 投票
1 回答
119 浏览

scxml - scxml 转换目标的工作原理

我正在尝试了解 scxml 转换目标状态集。这是我的一些示例代码:

如果 P、A、A1、B、B1、C 和 C2 当前处于活动状态。现在事件“测试”即将到来,因此将转换到目标状态“b2” 1) 基于状态图 XML (SCXML) 的第 3.13 节:用于控制抽象的状态机表示法,祖先状态 A 和 P 将是做作的。将退出所有状态然后重新进入 P,还是仅退出 A1 和 A?2) 如果所有状态都退出并在 P 处重新进入,那么设置 P、A、A1、B、B2、C 和 C1 处于活动状态还是设置 P、A、A1、B、B2、C 和 C2 处于活动状态?(因为在转换“测试”发生之前 c2 处于活动状态)

0 投票
2 回答
759 浏览

c++ - 使用带有 Qt SCXML 状态机的 C++ 数据模型

我有一个工作状态机,可以从多个状态发送类似的消息。目前它们都是硬编码的,所以我的 .scxml 文件中有如下片段:

而且我必须unexpectedEventXxxxFromYyyy在我的 C++ 代码的其他地方捕获多条消息。

我想对这些消息进行标准化,这样我只需unexpectedEvent在我的代码中捕获一个参数化的信号,该信号将检查 QScxmlEvent 对象以找到导致信号发出的转换和源状态。

看过 Qt 文档后,我相信我需要添加一个数据模型。我不在任何地方使用这些,所以不熟悉。我之前使用 EcmaScript 数据模型进行了相当成功的实验,但发现如果我尝试创建超过 150 台机器,应用程序会在我的机器上崩溃,这显然是因为 150+ V8 JavaScript 引擎需要内存。由于我需要运行 1000+ 个状态机副本,因此排除了 EcmaScript 数据模型,我需要使用 C++ 数据模型。

我没有运气,当我实例化的第一台机器第一次尝试处理事件时,程序崩溃了。我已将数据模型中的代码简化为如下所示的最基本的代码,但它仍然崩溃。

请有人能告诉我该怎么做才能让我的数据模型正常工作吗?我查看了 Qt 示例,它们似乎都太琐碎了,无法提供帮助,任何人都可以指出任何更丰富的示例吗?非常感谢。

基本代码更改

添加到 .scxml 文件中的根元素:

foodatamodel.h:

foodatamodel.cpp

免责声明:

  1. 我在 Qt Creator 中使用状态机编辑器,我很可能在顶部的手写 SCXML 片段中遗漏了一些重要的东西。我很确定真实文件在语法和语义上是有效的——尽管datamodel上面的属性非常准确。
  2. 真正的文件名、状态和转换名称是不同的,我可能无法更改上面 C++ 片段中的某些内容。真实文件不包含任何实质性代码。

再次感谢,为问题的长度道歉。

0 投票
1 回答
39 浏览

java - 相互访问两个对象的方法

嗨,我正在用 Java 做应用程序来控制一些带有 RS232 端口的机械设备。

该代码正在运行;)但是它非常大而且很混乱,所以我试图让它更接近设计模式并且更容易实现新事物,所以我开始使用来自 Apache Fundation 的“commons SCXML”状态机代码来控制应用程序的行为,因为那里有很多状态可能会发生,例如传输失败等。

有 3 种状态:idle、connection_attempt 和 connected。

有 4 个事件:try_to_connect、connection_attempt_success、connection_attempt_failed、try_to_disconnect

有一个带有 main 方法的 Knapx 类,它创建了两个对象:“KnapxInterface”对象——它包含 gui 的东西,比如带有 RS232 波特率设置和 comport 名称的组合框和“StateMachine”对象——它包含“fireEvent”方法和特定状态执行代码。

Knapx 类:

在“Gui”类中,有一个类构造函数,它接受一个参数:“链接”到触发状态机事件所需的状态机对象

它有效:单击连接按钮触发“try_to_connect”事件,将状态机的状态更改为“connection_attempt”,但现在有我的问题:在 StatusFSM 类中有方法:

它在状态机进入 connection_attempt 状态时执行,我想让它从“Gui”类调用“getRs232Setting”方法:

但是怎么办?!我无法从基于“Gui”类的“KnapxInterface”对象中触发方法,而我在基于“StatusFSM”类的“StateMachine”对象中没有创建一些“链接” - 我是 Java 初学者,所以我会尝试发送“链接”以这种方式使用 StatusFSM 类构造函数:

但是当我创建 StateMachine 对象时,还没有活动的 KnapxInterface 对象,所以它不是正确的方法。

请让我知道如何处理这样的问题 - 我知道它一定是一个简单但功能强大的解决方案,但我不知道如何命名我的问题,所以我可以在我办公桌上的 Cay Horstmann - Java 等书籍中找到它。

谢谢