Rust TwinCAT通信插件autd3-link-twincat的使用:实现Rust与Beckhoff PLC高效数据交互

Rust TwinCAT通信插件autd3-link-twincat的使用:实现Rust与Beckhoff PLC高效数据交互

简介

autd3-link-twincat 是一个用于通过TwinCAT与AUTD设备进行通信的Rust库。

作者:Shun Suzuki (2022-2025)

安装

在项目目录中运行以下Cargo命令:

cargo add autd3-link-twincat

或者在Cargo.toml中添加以下行:

autd3-link-twincat = "35.0.1"

使用示例

以下是一个完整的示例demo,展示了如何使用autd3-link-twincat进行Rust与Beckhoff PLC的通信:

use autd3::prelude::*;
use autd3_link_twincat::TwinCAT;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建AUTD控制器
    let mut autd = Controller::builder()
        .add_device(AUTD3::new(Vector3::zeros()))
        // 使用TwinCAT连接
        .open_with(TwinCAT::builder())?;

    // 检查固件版本
    println!("Firmware version: {:?}", autd.firmware_version()?);

    // 创建调制信号
    let mod_ = Sine::new(150.0 * Hz);

    // 发送数据到PLC
    autd.send((mod_, Gain::uniform(1.0)))?;

    Ok(())
}

代码说明

  1. 首先导入必要的模块:

    • autd3::prelude::* - AUTD3的基本功能
    • autd3_link_twincat::TwinCAT - TwinCAT通信模块
  2. 创建AUTD控制器并配置TwinCAT连接:

    • Controller::builder() - 创建控制器构建器
    • .add_device() - 添加AUTD设备
    • .open_with() - 使用TwinCAT连接打开控制器
  3. 与PLC通信:

    • firmware_version() - 获取固件版本
    • send() - 发送数据到PLC

许可证

本项目使用MIT许可证。

完整示例代码

use autd3::prelude::*;
use autd3_link_twincat::TwinCAT;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化AUTD控制器
    let mut autd = Controller::builder()
        // 添加AUTD设备,设置初始位置为原点
        .add_device(AUTD3::new(Vector3::zeros()))
        // 使用TwinCAT连接建立通信
        .open_with(TwinCAT::builder())?;

    // 打印固件版本信息
    println!("AUTD设备固件版本: {:?}", autd.firmware_version()?);

    // 创建150Hz正弦波调制信号
    let modulation = Sine::new(150.0 * Hz);
    
    // 创建均匀增益,幅值为1.0
    let gain = Gain::uniform(1.0);

    // 发送调制信号和增益数据到PLC
    autd.send((modulation, gain))?;

    // 关闭连接
    autd.close()?;

    Ok(())
}

1 回复

Rust TwinCAT通信插件autd3-link-twincat的使用:实现Rust与Beckhoff PLC高效数据交互

介绍

autd3-link-twincat是一个Rust库,用于实现Rust应用程序与Beckhoff TwinCAT PLC系统之间的高效数据通信。这个插件是AUTD3项目的一部分,专门为需要与工业自动化控制器交互的Rust开发者设计。

该库提供了:

  • 与TwinCAT ADS协议的无缝集成
  • 高性能的数据交换能力
  • 类型安全的Rust接口
  • 异步通信支持

安装方法

在Cargo.toml中添加依赖:

[dependencies]
autd3-link-twincat = "0.1"
tokio = { version = "1.0", features = ["full"] }

完整示例代码

use autd3_link_twincat::{TwinCATLink, PlcVariable, NotificationHandler, Error};
use tokio::time::Duration;
use std::error::Error;

// 自定义通知处理器
struct MyNotificationHandler;

impl NotificationHandler for MyNotificationHandler {
    fn handle(&self, name: &str, value: &[u8]) {
        println!("收到PLC通知: {} = {:?}", name, value);
    }
}

// 自定义数据类型
#[derive(Debug, Clone)]
struct MotorStatus {
    position: f32,
    velocity: f32,
    is_active: bool,
}

impl autd3_link_twincat::PlcDataType for MotorStatus {
    // 实现序列化/反序列化逻辑
    // ...
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 1. 创建并连接TwinCAT
    let mut link = TwinCATLink::builder()
        .with_timeout(Duration::from_secs(3))
        .build()?;
    
    // 连接到本地TwinCAT系统
    link.connect("127.0.0.1.1.1", 851).await?;
    println!("成功连接到TwinCAT系统");

    // 2. 读写单个变量
    let speed: f64 = link.read_plc_variable("MAIN.motor_speed").await?;
    println!("当前电机速度: {}", speed);
    
    link.write_plc_variable("MAIN.target_speed", 1500.0).await?;
    println!("已设置目标速度");

    // 3. 批量读写操作
    let batch_vars = vec![
        PlcVariable::new("MAIN.temperature").read::<f32>(),
        PlcVariable::new("MAIN.pressure").read::<f32>(),
        PlcVariable::new("MAIN.emergency_stop").write(false),
    ];
    
    let results = link.batch(&batch_vars).await?;
    println!("批量操作完成");

    // 4. 设置通知
    link.add_notification("MAIN.emergency_stop", MyNotificationHandler).await?;
    println!("已设置紧急停止通知");

    // 5. 使用自定义类型
    let motor1 = MotorStatus {
        position: 100.5,
        velocity: 25.0,
        is_active: true,
    };
    link.write_plc_variable("MAIN.motor1_status", motor1).await?;

    // 错误处理示例
    match link.read_plc_variable::<i32>("MAIN.non_existent_var").await {
        Ok(val) => println!("值: {}", val),
        Err(Error::VariableNotFound) => eprintln!("错误: 变量不存在"),
        Err(e) => eprintln!("其他错误: {}", e),
    }

    Ok(())
}

代码说明

  1. 连接建立

    • 使用TwinCATLink::builder()创建连接配置
    • 设置3秒超时
    • 连接到本地TwinCAT系统(127.0.0.1.1.1:851)
  2. 基本操作

    • read_plc_variable读取单个变量
    • write_plc_variable写入单个变量
  3. 批量操作

    • 使用PlcVariable创建读写操作列表
    • 通过batch方法一次性执行多个操作
  4. 通知机制

    • 实现NotificationHandler trait创建自定义处理器
    • 使用add_notification注册变量变更通知
  5. 自定义类型

    • 定义MotorStatus结构体表示电机状态
    • 实现PlcDataType trait支持PLC通信
  6. 错误处理

    • 处理变量不存在等特定错误
    • 使用Rust的Result类型进行错误传播

性能优化建议

  1. 对于高频数据交换,使用批处理操作而不是单个读写
  2. 合理设置超时时间
  3. 对关键变量使用通知机制而不是轮询
  4. 考虑使用共享内存区域进行大数据量传输

注意事项

  1. 确保TwinCAT ADS服务已启用
  2. 检查防火墙设置允许ADS通信
  3. 变量名称区分大小写
  4. 数据类型必须与PLC中定义的类型匹配

这个插件为Rust开发者提供了与工业自动化系统交互的强大工具,结合Rust的安全性和TwinCAT的实时性,可以构建高可靠性的工业控制系统。

回到顶部