使用Rust语言开发用户库
Rust用户库是使用Rust语言开发的用户自定义功能模块集合。Rust是一种系统级编程语言,提供内存安全、高性能和并发支持,适合开发可靠的嵌入式软件。
Rust用户库的特点
- 内存安全:编译时保证内存安全,无需垃圾回收
- 高性能:接近C/C++的执行效率
- 并发支持:原生支持并发编程
- 类型安全:强大的类型系统
- 代码复用:可以在多个项目中重复使用
创建Rust用户库
创建开发语言为Rust的用户库
提示
创建用户库的详细步骤请参考创建用户库界面
创建Rust POU
操作步骤
- 点击"POU"按钮进入接口信息编辑界面,点击"新增POU"按钮,在新建POU界面中填写POU的名称、分类、等信息
- 点击"确认"按钮,在POU接口列表中添加一个新的函数条目,显示函数名和POU分类
- 点击函数条目中的"编辑"按钮,进入函数编辑状态,点击新增变量按钮,填写变量的名称、分类、数据类型
- 点击"新增变量"按钮,填写参数的名称、分类、数据类型
- 点击保存按钮完成创建
- 创建完成后,可以在POU列表中查看新创建的函数:
生成Rust POU接口代码
Rust实现程序
在IDE中保存库中的数据结构或者功能块和函数,IDE会自动生成C/C++框架代码。 自动生成的代码包含:
- 函数原型
- 功能块结构定义
- 初始化和执行函数框架
用户可以任何时候手动执行代码生成,将鼠标点击页面右上角的生成接口代码按钮,为当前模块生成框架代码:
文件结构
Rust用户库创建完成后,会自动生成以下文件结构:
Rust函数实现示例
Rust功能块实现示例
use std::os::raw::*;
use crate::wa_interface::rust_func_block_FUNCTION_BLOCK;
/************* Function Block rust_func_block *************/
#[no_mangle]
pub extern "C" fn __init_rust_func_block(this: *mut rust_func_block_FUNCTION_BLOCK) -> *const c_void {
unsafe {
}
std::ptr::null()
}
#[no_mangle]
pub extern "C" fn rust_func_block(this: *mut rust_func_block_FUNCTION_BLOCK, instance: *const c_void) {
unsafe {
//功能块逻辑代码
(*this).OUT1=(*this).IN1+(*this).IN2*5;
}
}
#[no_mangle]
pub extern "C" fn rust_func_block_save(instance: *const c_void, buffer: *mut c_void, size: c_int) -> c_int {
unsafe {
}
0
}
#[no_mangle]
pub extern "C" fn rust_func_block_store(instance: *const c_void, instance_data: *const c_void, size: c_int) -> bool {
unsafe {
}
true
}
注意事项
接口规范
Rust函数需要遵循C接口规范:
- 使用
#[no_mangle]属性防止名称混淆 - 使用
extern "C"指定C调用约定 - 使用
std::os::raw中的类型(如c_int,c_short,c_bool) - 对于指针参数,使用
unsafe块进行操作
内存安全
- 注意指针操作的安全性
- 使用
unsafe块时要格外小心 - 避免悬空指针和内存泄漏
类型映射
| Rust类型 | C类型 | 说明 |
|---|---|---|
c_int | int | 整型 |
c_short | short | 短整型 |
c_long | long | 长整型 |
c_float | float | 浮点型 |
c_double | double | 双精度浮点型 |
c_bool | bool | 布尔型 |
开发建议
提示
- 学习Rust基础:掌握Rust的基本语法和概念
- 使用unsafe谨慎:仅在必要时使用unsafe代码块
- 利用Rust特性:使用Rust的所有权、借用和生命周期系统
- 编写测试:为每个函数编写单元测试
- 使用cargo:利用Rust的包管理工具cargo
注意
- 接口兼容性:确保Rust函数接口与PLC运行时兼容
- 内存管理:注意内存分配和释放
- 线程安全:如果涉及多线程,确保线程安全
- 错误处理:合理处理错误情况