跳到主要内容

使用Rust语言开发用户库

Rust用户库是使用Rust语言开发的用户自定义功能模块集合。Rust是一种系统级编程语言,提供内存安全、高性能和并发支持,适合开发可靠的嵌入式软件。

Rust用户库的特点

  • 内存安全:编译时保证内存安全,无需垃圾回收
  • 高性能:接近C/C++的执行效率
  • 并发支持:原生支持并发编程
  • 类型安全:强大的类型系统
  • 代码复用:可以在多个项目中重复使用

创建Rust用户库

创建开发语言为Rust的用户库

Rust用户库模块
提示

创建用户库的详细步骤请参考创建用户库界面

创建Rust POU

操作步骤

  1. 点击"POU"按钮进入接口信息编辑界面,点击"新增POU"按钮,在新建POU界面中填写POU的名称、分类、等信息
  2. 点击"确认"按钮,在POU接口列表中添加一个新的函数条目,显示函数名和POU分类
  3. 点击函数条目中的"编辑"按钮,进入函数编辑状态,点击新增变量按钮,填写变量的名称、分类、数据类型
  4. 点击"新增变量"按钮,填写参数的名称、分类、数据类型
  5. 点击保存按钮完成创建
  6. 创建完成后,可以在POU列表中查看新创建的函数:
创建Rust函数

生成Rust POU接口代码

Rust实现程序

在IDE中保存库中的数据结构或者功能块和函数,IDE会自动生成C/C++框架代码。 自动生成的代码包含:

  • 函数原型
  • 功能块结构定义
  • 初始化和执行函数框架

用户可以任何时候手动执行代码生成,将鼠标点击页面右上角的生成接口代码按钮,为当前模块生成框架代码:

文件结构

Rust用户库创建完成后,会自动生成以下文件结构:

Rust文件结构

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接口规范:

  1. 使用 #[no_mangle] 属性防止名称混淆
  2. 使用 extern "C" 指定C调用约定
  3. 使用 std::os::raw 中的类型(如 c_int, c_short, c_bool
  4. 对于指针参数,使用 unsafe 块进行操作

内存安全

  • 注意指针操作的安全性
  • 使用 unsafe 块时要格外小心
  • 避免悬空指针和内存泄漏

类型映射

Rust类型C类型说明
c_intint整型
c_shortshort短整型
c_longlong长整型
c_floatfloat浮点型
c_doubledouble双精度浮点型
c_boolbool布尔型

开发建议

提示
  1. 学习Rust基础:掌握Rust的基本语法和概念
  2. 使用unsafe谨慎:仅在必要时使用unsafe代码块
  3. 利用Rust特性:使用Rust的所有权、借用和生命周期系统
  4. 编写测试:为每个函数编写单元测试
  5. 使用cargo:利用Rust的包管理工具cargo
注意
  1. 接口兼容性:确保Rust函数接口与PLC运行时兼容
  2. 内存管理:注意内存分配和释放
  3. 线程安全:如果涉及多线程,确保线程安全
  4. 错误处理:合理处理错误情况