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 并发
530 每月下载
用于 2 crates
180KB
4K SLoC
RoboPLC
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总线一起工作的工具。
当前支持
-
通过
io::modbus
支持Modbus(RTU/TCP),需要modbus
集装箱功能。(Modbus客户端/主示例,Modbus服务器/从示例) -
通过
io::raw_udp
(原始UDP输入/输出示例) 在io::pipe
中进行原始UDP的输入/输出 -
EVA ICS 的输入/输出通过
io::eapi
(EVA ICS 示例),需要eapi
集装箱特性 -
ADS 连接器用于 Beckhoff TwinCAT,商业用途需要许可证
-
IEC 60870-5 客户端,商业用途需要许可证
锁定安全性
注意:异步组件仅使用 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_rt
、supervisor
和 controller
只能在 Linux 机器上运行。
从 0.3.x 迁移
-
pchannel
和pchannel_async
已分别重命名为policy_channel
和policy_channel_async
。 -
默认情况下,该仓库使用 parking_lot 进行锁定。要切换到更安全的实时锁定,请禁用仓库默认特性,并启用
locking-rt
或locking-rt-safe
。**这对于实时应用非常重要,必须手动启用**。 -
由于 RTSC 组件是无锁的,需要指定泛型锁定类型,因此模块
channel
、policy_channel
、[buf
] 和semaphore
现在是具有选择锁定策略的 RTSC 模块的包装器。 -
hub_async
现在需要启用async
特性。
依赖关系
~8–24MB
~364K SLoC