59个版本

新版本 0.4.3 2024年8月11日
0.4.2 2024年7月30日
0.3.2 2024年6月22日
0.2.1 2024年5月19日
0.1.23 2024年3月31日

#149 in 并发

Download history 129/week @ 2024-04-25 272/week @ 2024-05-02 191/week @ 2024-05-09 185/week @ 2024-05-16 21/week @ 2024-05-23 15/week @ 2024-05-30 213/week @ 2024-06-13 243/week @ 2024-06-20 7/week @ 2024-06-27 2/week @ 2024-07-04 24/week @ 2024-07-18 338/week @ 2024-07-25 60/week @ 2024-08-01 108/week @ 2024-08-08

530 每月下载
用于 2 crates

Apache-2.0

180KB
4K SLoC

RoboPLC crates.io页面 docs.rs页面

RoboPLC 是一个用于在Rust中创建实时微服务、PLC和工业级机器人的框架和工具的终极组合。

该Crate旨在使其所有组件既可单独使用,也可一起使用。

RoboPLC是EVA ICS工业自动化平台的一部分。

实时安全的数据同步组件是从RoboPLC项目的一部分RTSC crate重新导出的,可以直接使用,无需使用RoboPLC。

技术文档

可在https://info.bma.ai/en/actual/roboplc/index.html找到

示例

可在https://github.com/roboplc/roboplc/tree/main/examples找到

数据缓冲区

buf::DataBuffer 覆盖了从单个或多个生产者收集(缓存)数据帧的典型数据交换模式,然后由单个消费者批量取走并提交,例如提交到本地数据库或外部总线。

  • 始终具有固定容量

  • 线程安全,开箱即用

  • 帧可以被强制推送,覆盖先前的帧,就像在环形缓冲区中一样。

中心站

hub::Hub 实现了数据中心(进程内发布/订阅)模型,当多个客户端(通常为线程工作者)通过单个虚拟总线交换数据,而不是使用直接通道。

这给数据交换带来了一些额外的开销,但使得架构更加清晰,降低了代码维护成本并带来了额外功能。

  • 无数据序列化开销的经典发布/订阅模式

  • 基于 policy_channel,它允许混合不同类型的数据,并在需要时应用额外的策略

  • 一个完全被动模型,没有“服务器”线程。

pdeque和policy_channel

基于策略的队列 rtsc::pdeque::Deque 是构建基于策略通道的组件。

policy_channel 是一个基于策略队列的通道模块。

支持的数据策略

  • 始终 总是交付一个帧
  • 最新 总是交付一个帧,如果空间不足则丢弃之前的(类似于环形缓冲区)
  • 可选 如果没有空间,可以跳过帧
  • 单次 帧必须只交付一次(最新的一个)
  • 单次可选 帧必须只交付一次(最新的一个)并且是可选的

此外,组件支持按数据优先级排序,如果数据类型实现了过期标记方法,则会自动删除过期数据。

policy_channel 是一个实时安全通道,这意味着它可能没有像流行通道实现那样快(它可能甚至比 std::sync::mpsc 提供的通道快)。但它对实时应用是完全安全的,这意味着没有自旋循环,数据总是以最小延迟交付,并且线程不会互相阻塞。

实时

thread_rt::Builder 提供了一个线程构建器组件,它扩展了标准线程构建器,增加了实时功能:调度策略和CPU亲和力(仅限Linux)。

supervisor::Supervisor 提供了一个轻量级任务监督器来管理启动的线程。

控制器

controller::Controller 是将所有功能组合在一起的主要组件。

I/O

[io] 模块提供了一套与现场设备和SCADA总线一起工作的工具。

当前支持

锁定安全性

注意:异步组件仅使用 parking_lot_rt 锁定。

默认情况下,该仓库(服务器和客户端模块)使用 parking_lot 进行锁定。对于实时应用,以下特性可用

  • locking-rt - 使用 parking_lot_rt 集装箱,它是 parking_lot 的无自旋分支。

  • locking-rt-safe - 使用 RTSC 优先级继承锁定,不受优先级反转的影响(仅限 Linux)。

注意:要切换锁定策略,请禁用仓库默认特性。

创建新项目时,CLI 中也可以选择锁定策略

robo new --locking rt-safe # the default for CLI-created projects is rt-safe

在其他平台上使用

组件 thread_rtsupervisorcontroller 只能在 Linux 机器上运行。

从 0.3.x 迁移

  • pchannelpchannel_async 已分别重命名为 policy_channelpolicy_channel_async

  • 默认情况下,该仓库使用 parking_lot 进行锁定。要切换到更安全的实时锁定,请禁用仓库默认特性,并启用 locking-rtlocking-rt-safe。**这对于实时应用非常重要,必须手动启用**。

  • 由于 RTSC 组件是无锁的,需要指定泛型锁定类型,因此模块 channelpolicy_channel、[buf] 和 semaphore 现在是具有选择锁定策略的 RTSC 模块的包装器。

  • hub_async 现在需要启用 async 特性。

依赖关系

~8–24MB
~364K SLoC