【前沿技术RPA】 一文了解 UiPath 状态机 State Machine

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

🐋作者简介博主是一位.Net开发者同时也是RPA和低代码平台的践行者。
🐬个人主页会敲键盘的肘子
🐰系列专栏UiPath
🦀专栏简介UiPath在传统的RPARobotic process automation的基础上增加了SeeAI通过计算机视觉阅读用户的计算机屏幕和Think通过机器学习来发现平台能够为用户构建什么自动化流程从而不断帮助用户自动化构建流程而不仅仅是用户自主发现自主构建。并且在构建的过程当中做到了Low-code甚至是No-code的程度让每一位员工都可以自主使用。
🐶座右铭总有一天你所坚持的会反过来拥抱你。


在这里插入图片描述

🌈写在前面

在本文中您将学习何时以及如何使用状态机 State Machine工作流布局及其特定活动。了解状态机布局是使用机器人企业框架模板和自动化更复杂流程的关键步骤。为状态机中的状态命名对于维护和未来开发非常重要在UiPath Studio中每个状态中显示的转换顺序非常重要因为它与评估它们的顺序相匹配。


👉本文关键字RPA、UiPath、Low-code、No-code、State Machine、.Net

文章目录

1️⃣ 背景

♈ 什么是RPA

RPARobotic process automation 代表机器人过程自动化

它是一种软件程序可在与计算机应用程序交互时模仿人类行为并实现重复的、基于规则的流程的自动化。

♉ 什么是UiPath

UiPath 是一种机器人流程自动化工具用于自动化枯燥和重复的任务。它由罗马尼亚企业家 Daniel Dines 和 Marius Trica 于 2005 年创立。它还消除了自动化无聊任务的人工干预并为所有活动提供了拖放功能它是最简单的 RPA 工具。

♊ 为什么使用UiPath

UiPath在传统的RPA的基础上增加了SeeAI通过计算机视觉阅读用户的计算机屏幕和Think通过机器学习来发现平台能够为用户构建什么自动化流程从而不断帮助用户自动化构建流程而不仅仅是用户自主发现自主构建。并且在构建的过程当中做到了Low-code甚至是No-code的程度让每一位员工都可以自主使用。

♋ 环境

  • UiPath Studio Community 2022.4.3

  • Windows 10

  • .Net

♌ 本文收获

  • 解释什么是状态机。

  • 区分State MachineSequenceFlowchart

  • 解释何时应使用状态机。

  • 列出一个州内步骤的执行顺序。

  • 根据给定的要求构建基于状态机的流程。

2️⃣ 概述

实践证明从一开始就为您的工作流程选择正确的布局不仅可以实现快速、轻松的开发还可以为您提供更好的扩展和管理方法。

UiPath提供了三个布局形式用于在开发工作流文件时将活动集成到工作结构中。

♈ Sequence(序列)

序列有一个从上到下流动的简单线性表示最适合活动相互跟随的简单场景

例如当导航和键入一次单击/击键时它们在UI自动化中非常有用。因为序列易于组装和理解所以它们是大多数工作流的首选布局。

在这里插入图片描述

♉ Flowchart(流程图)

流程图为连接活动提供了更多的灵活性并倾向于以简单的二维方式布置工作流。流程图最重要的方面是与序列不同它们呈现多个分支逻辑运算符。这些使您能够创建复杂的业务流程并以多种方式连接活动。

流程图通常用于包含多个决策点的工作流。

在这里插入图片描述

♊ State Machine(状态机)

有些过程更好地表示为相互连接的状态这些状态在必要时反复执行。在每个状态中执行一组活动然后评估一个条件以确定要转换到下一个状态。例如旋转栅门是一个状态机至少具有以下状态空闲、允许访问、拒绝访问和关闭。

  • 在空闲状态下当机器等待访问卡时大门被锁定。当一个人出示门禁卡时机器会评估是否必须接受该卡。

  • 如果卡被接受旋转栅门将转换为“允许进入”状态此时大门打开允许一个人进入。在人员进入或经过一定时间后机器将转换回空闲状态。

  • 如果卡被拒绝旋转栅门将转换为“拒绝访问”状态在该状态下显示该信息大门将保持锁定。经过一段时间后机器将转换回空闲状态。

  • 当输入正确的代码时机器将转换到关闭状态。

在Studio中状态机工作流布局允许您基于有限数量的状态和转换来设计事件驱动的流程。该布局应用于复杂和连续过程的高级项目组织。因此状态机通常用于Main.xaml用于RPA框架如企业级框架Robotic Enterprise Framework

在这里插入图片描述

3️⃣ 理解状态机

♈ 现实生活中的状态机

为了更好地理解与状态机相关的概念我们将查看恒温器控制空调的表示。

在使用空调UI之前请务必阅读说明

  • 使用ON/OFF按钮启动或停止空调。启动后空调将进入空闲状态。
  • 在“Desired Temp.”所需温度字段中写入所需温度然后单击“SET”设置。请注意工作范围在15度和30度之间因此任何低于15度或高于30度的值都将分别转换为15和30度。
  • 一旦设定了温度空调将进入HEAT加热或COLD冷状态。当达到所需温度时它将显示在“Current temperature”当前温度下空调将返回IDLE空闲状态。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

♉ 状态机工作流演练

让我们分析一下作为Studio自动化项目的空调示例是什么样子。

在这里插入图片描述

如图可以看出有三个简单的状态空闲状态、热状态和冷状态、一个最终状态关闭以及基于设置条件在状态之间导航的几个转换。

  • 当期望温度=当前温度时从怠速状态到怠速状态。

  • 当期望温度>当前温度时怠速状态变为加热状态。

  • 当期望温度<当前温度时怠速状态变为冷态。

  • 加热状态和冷态一旦达到所需温度则返回到怠速状态。

  • 当用户单击“确定”且用户输入值为“关闭”或“无”时“空闲状态”变为“关闭状态”。

♊ 具体实现

⭐ State

因为它直接链接到Start节点所以“Idle State”是自动化启动后用户登录的位置。它看起来可能类似于“主菜单”。在这里它总是进入状态除非选择关闭机器。

  • Entry块包含进入状态时要执行的活动。

  • Exit块包含退出状态时要执行的活动。

  • Transitions块允许您添加将在进入和退出时执行的活动。

“Transitions”部分根据用户输入显示所有下一个目的地。

在这里插入图片描述

⭐ Transitions

当您在状态机容器中将状态链接到另一个状态或最终状态时将创建Transitions

如观察到的转换到“目的地”状态例如热状态的条件是“期望温度”变量值高于“当前温度”值。

在这里插入图片描述

📘注意打开时空调处于过渡状态或状态因为空调过程是连续的。

⭐ The Final State

当用户键入“OFF”时状态机将转换到结束进程的状态。在Studio的“工作流”>“状态机”>“最终状态”下可以找到这种类型的状态。在我们的工作流中它被命名为“关闭”并在停止自动化过程之前记录消息“AC关闭”。

在这里插入图片描述

📘注意您只能创建一个初始状态但也可能有多个最终状态。所有状态机必须包含初始状态和至少一个最终状态。

4️⃣ 使用状态机创建Process

到目前为止您已经通过与空调UI交互观察到了状态机的概念。之后您进一步分析了Studio中的实际工作流。

接下来您将查看在Studio中创建状态机的端到端过程。

♈ 需求

我们将构建一个流程首先要求用户输入初始账户余额然后让他们付款直到初始余额耗尽或决定结束该流程。
为了实现这一点我们将构建一个具有五个状态的状态机获取初始余额、获取付款值、进行付款如果资金可用、拒绝付款如果经费不足和结束过程的最终状态。

♉ 实现

我们将项目作为一个序列启动然后从Activities面板中添加状态机。

⭐ Get Initial Balance

为了获得用户的初始余额让我们添加第一个状态。通过将其链接到Start它将成为流程的初始状态。

在这里插入图片描述

我们将其重命名为Get Initial Balance并添加一个注释来记录此状态的作用获取帐户的初始余额。

在这里插入图片描述

要配置状态我们需要打开它。让我们双击它。我们注意到一个简单的State有三个可编辑的部分。Entry部分保存了进入状态时将执行的活动。“Exit”部分保存退出状态时将执行的活动“Transitions”部分描述此状态相对于其他状态的转换。
因此我们希望在流程的初始状态中实现的是向用户请求初始余额。为此我们将在输入区域中使用输入对话框活动并提示用户插入数字。
然后我们需要将活动的输出存储在名为“InputValue”的字符串变量中。我们将确保为我们计划在其他状态中使用的所有变量设置一个全局范围在本例中为状态机。

在这里插入图片描述

现在我们需要确保用户提供的输入是有效的。在我们的例子中输入应该是一个Double最多16位数字。要执行此检查我们将使用If活动和Double。TryParse方法如果转换成功则返回布尔值True如果转换失败则返回False。
然后我们将创建一个名为CurrentBalance的新变量并将其范围设置为State Machine将其类型设置为Double。注意我们不能使用Double将转换结果传递给变量。Assign活动中的TryParse方法。
如果InputValue变量的值可以用前面提到的方法解析那么我们使用Double将其值分配给CurrentBalance变量。解析方法。
如果无法解析InputValue我们将通过在Else块中使用MessageBox活动通知用户输入无效。
我们还要创建一个新的布尔变量用于存储有关用户输入有效性的数据。我们将其称为“IsValidInput”将其范围设置为State Machine将默认值设置为True。
然后我们将使用MessageBox下的Assign活动将值False分配给“IsValidInput”。
从这一点来看执行可以采取两个不同的方向
如果输入无效应提示用户关闭付款流程。这意味着流程将转换到其最终状态因此流程的执行将停止。稍后我们将创建最终状态。
如果输入有效系统将提示用户输入其付款金额。这意味着流程将转换到“获取付款值”状态。

在这里插入图片描述

⭐ Get payment value

最简单的方法是复制并粘贴Get初始Balance状态然后将其重命名为Get payment value。
我们还将添加一个注释来记录此步骤的目的获取当前迭代的付款值。

在这里插入图片描述

现在让我们双击打开状态并将输入对话框重命名为Payment value。
此时用户将输入他们想要支付的金额因此我们需要将该输入存储在名为PaymentValue的新变量中。
我们将其类型设置为Double并为其提供全局范围。
在复制的Assign活动中我们现在需要用新创建的变量PaymentValue替换CurrentBalance变量。因此我们刚才所做的工作有助于我们涵盖用户添加有效双精度值或无效双精度值的两种情况。

在这里插入图片描述

在这里插入图片描述

⭐ Final State

回到状态机视图我们注意到我们的过程还没有最终状态。使用状态机时必须有一个状态机。
让我们将“Final State”活动拖到工作流的底部。

在这里插入图片描述

我们将双击打开状态。你可以看到最终状态的结构不同于简单状态的结构。唯一可用的块是Entry块它保存了进入状态时执行的活动。顾名思义这是流程可以处于的最后一个状态因此我们无法定义从最终状态到任何其他状态的任何转换。
现在让我们回到我们的例子。当用户到达这一点时我们希望通知他们流程已完成。
我们将通过在最终状态的入口块中使用MessageBox活动来实现这一点。所以我们现在有一个初始状态一个简单状态和一个最终状态。是时候添加第一个过渡了。

在这里插入图片描述

⭐ Valid Input

至此用户将输入他们的初始余额。

接下来他们将被提示输入他们的付款值。只有当我们在Get initial Balance状态和Get payment value状态之间创建转换时才能触发该操作。
我们通过在Designer面板中简单地连接两者来实现这一点。
然后双击打开转换并将其重命名为有效输入。

在这里插入图片描述

流程从初始状态获取初始余额移动到付款值状态的条件是用户提供有效输入。因此我们设置了一个条件即只有当IsValidInput变量将值保持为True时才会触发转换。
对于用户输入在初始状态获取初始余额期间无效的场景我们将创建从获取初始余额状态到最终状态的转换并设置在输入无效时触发转换的条件。

在这里插入图片描述

⭐ Input Not Valid

现在我们已经添加了从初始状态Get initial Balance开始的所有转换。
退出此状态后将提示用户添加付款金额或者如果输入无效将提示他们完成该过程。
但是如果用户转换到添加其支付金额的状态则有三种可能的转换到下一个状态
如果他们添加了一个无效的付款输入过程将停止我们将转换到最终状态。
让我们添加此过渡。
如果他们添加了一个有效的付款输入并且他们有足够的余额来支付金额他们的付款将被支付。为此我们需要创建一个新的状态和三个新的转换。
如果他们添加了有效的付款输入但他们没有足够的余额来支付金额他们的付款将被拒绝。为此我们还将创建一个新状态和三个新转换。

在这里插入图片描述

在这里插入图片描述

⭐ Deny Payment

在拒绝支付的情况下我们希望让用户知道由于资金不足无法执行交易。我们还想显示他们的当前余额并询问他们是否想继续进行另一笔交易。

在这里插入图片描述

那么我们该怎么做呢我们首先添加一个新状态将其重命名为拒绝支付并添加一个注释说明该状态的目的显示有关拒绝支付的消息。
然后我们打开状态并在Entry字段中添加MessageBox活动以通知用户“由于资金不足无法处理付款”。

在这里插入图片描述

在这里插入图片描述

我们继续在消息框中键入一个表达式将当前余额返回给用户。
最后我们询问用户是否要继续。
然后我们关闭表达式编辑器并将Buttons属性设置为YesNo以获取用户关于他们接下来要做什么的输入。

我们将此输入存储在名为ContinueAnswer的新字符串变量中。

让我们确保将新变量的范围更改为状态机。
如果用户有足够的余额来支付金额我们需要从当前余额中减去支付值的状态。然后我们将让用户知道交易已处理显示当前余额的值并询问他们是否要继续。

在这里插入图片描述

⭐ Make Payment

最简单的方法是复制“拒绝付款”状态将其重命名为“进行付款”并添加注释说明该状态的目的是显示有关付款和新余额的消息。

然后我们使用Entry块中的MessageBox通知用户付款已成功处理。

在这里插入图片描述

我们现在需要从当前余额中减去付款金额。为此我们在MessageBox上方添加一个Assign活动并将其重命名为ReAssignCurrentBalance。然后我们键入从当前余额中减去付款值的方法。

在这里插入图片描述

现在我们已经制定了涵盖所有可能场景的状态。我们只需要添加剩余的过渡。

⭐ Insufficient Funds

因此如果用户的付款输入有效但他们没有足够的余额来支付金额他们的付款将被拒绝因此过程将从“获取付款值”状态转换为“拒绝付款”状态。

让我们添加这个转换打开它然后将其命名为“资金不足”并确保我们设置了正确的条件IsValidInput and CurrentBalance小于PaymentValue。

在这里插入图片描述

在这里插入图片描述

⭐ Sufficient Funds

如果用户的付款输入是有效的并且他们有足够的余额来支付金额他们的付款将被支付因此过程将从“获取付款值”状态转换为“进行付款”状态。
让我们添加此转换打开它然后将其命名为充足资金并确保设置了正确的条件IsValidInput and CurrentBalance大于或等于PaymentValue。

在这里插入图片描述

在这里插入图片描述

现在让我们确保从Get payment value状态正确设置了所有转换。
太好了一切都准备好了。
请注意建议定义转换时一次只有一个转换是正确的正如我们在示例中所做的那样。我们通过在“拒绝付款”和“进行付款”状态中添加一个条件来设置这一点以便只有当我们有来自用户的有效输入时才触发转换。
但是您应该知道如果同时有更多的转换处于活动状态那么将只执行定义的第一个转换。

⭐ Stop

因此让我们回到我们的流程现在我们只需要确保所有的过渡都已到位用于“拒绝付款”和“进行付款”状态。有两种可能的转换。当提示继续时用户可以回答“是”或“否”。让我们从用户不想继续并选择“否”的场景开始。
我们将从拒绝付款状态开始。在这种情况下工作流将从拒绝付款状态转换为最终状态。
让我们创建转换将其重命名为Stop并设置条件ContinueAnswer.Equals No。
我们将重复“付款”状态的过程提供相同的目的地、名称和条件。

在这里插入图片描述

在这里插入图片描述

现在让我们讨论用户希望继续并选择Yes的场景。
我们将从拒绝付款开始。如果用户选择“是”则将返回添加付款值。因此在我们的工作流中将触发从拒绝付款状态到获取付款值状态的转换。

⭐ Continue

让我们创建转换将其重命名为Continue并将条件设置为ContinueAnswer.Equals Yes。
我们将继续付款。如果用户选择“是”同样的情况也会发生他们将被发送回添加付款值因此在我们的工作流中将触发从“付款”状态到“获取付款值”状态的转换。
让我们创建转换将其重命名为Continue并设置与前面案例中相同的条件。

在这里插入图片描述

在这里插入图片描述

这样我们所有的状态和转变都被定义了。我们最后一次检查是否涵盖了所有可能的情况。是的一切似乎都很到位。
我们现在可以运行流程了
如您所见我们被提示添加当前余额。提供的输入有效。

在这里插入图片描述

我们怎么知道的因为否则我们将无法增加付款的价值。
然后从原始余额中减去付款金额并显示新的余额。

在这里插入图片描述

我们现在可以选择继续这一进程。
一旦我们选择“是”我们将被要求进行新的付款。

在这里插入图片描述

我们添加新付款的值然后再次显示新余额。

在这里插入图片描述

选择“否”后消息框通知我们流程已完成这是流程的最终状态。

在这里插入图片描述

我们的状态机演示到此结束。

在这里插入图片描述

关键要点

  • 我们可以从Activities面板添加State Machine布局、States和Final States。
  • State活动包含三个部分Entry、Exit和Transitions而Final State仅包含一个部分Entry。
  • “进入”和“退出”部分使我们能够为所选状态添加进入和退出触发器而“转换”部分显示链接到所选状态的所有转换。
  • 我们可以通过连接设计器面板中的状态并为它们提供名称和条件来添加转换。

5️⃣ 参考资料

About State Machines

State Machine Terminology


⭐写在结尾

文章中出现的任何错误请大家批评指出一定及时修改。

希望写在这里的小伙伴能给个三连支持

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6