#model #models #generated #modbus-tcp

sunspec

SunSpec 1.1 兼容库,支持 tokio

5 个版本 (3 个重大更新)

0.4.0 2024年3月20日
0.3.1 2023年12月21日
0.3.0 2023年12月9日
0.2.0 2023年11月21日
0.1.0 2023年11月4日

#3 in #models

MIT/Apache

1MB
20K SLoC

SunSpec Rust 实现

Latest Version Unsafe forbidden

Rust 包包含用于安全方便地访问 SunSpec 兼容设备的代码。

亮点

  • 纯 Rust 库
  • 无不安全代码
  • 无 panic
  • 所有通信均通过 tokio-modbus 完成,不使用某种形式的抽象层。
  • 支持 Modbus TCP 和 RTU(通过 tokio-modbus)。
  • 实现了 SunSpec 规范中定义的“设备信息模型发现”。
  • SunSpec 模型存储库 中包含的 JSON 文件生成完全类型化模型。
  • 完全类型化枚举
  • 完全类型化位字段
  • 全面文档化。甚至生成的模型。
  • 单次请求读取完整模型。

尚不支持嵌套和重复组。

特性

特性 描述 额外依赖 默认
tokio 启用 tokio_modbus 支持 tokio-modbus yes

示例

代码存储库中的 examples 目录包含完整的代码。

使用模型 103 从三相逆变器中访问数据的示例代码

use std::{error::Error, net::SocketAddr, time::Duration};

use clap::Parser;
use itertools::Itertools;
use sunspec::tokio_modbus::{discover_models, read_model};
use tokio::time::sleep;
use tokio_modbus::{client::tcp::connect_slave, Slave};

#[derive(Parser)]
struct Args {
    addr: SocketAddr,
    device_id: u8,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let args = Args::parse();
    let mut ctx = connect_slave(args.addr, Slave(args.device_id)).await?;

    let models = discover_models(&mut ctx).await?.models;
    let m1 = read_model(&mut ctx, &models.m1).await?;

    println!("Manufacturer: {}", m1.mn);
    println!("Model: {}", m1.md);
    println!("Version: {}", m1.vr.as_deref().unwrap_or("(unspecified)"));
    println!("Serial Number: {}", m1.sn);

    println!(
        "Supported models: {}",
        models
            .supported_model_ids()
            .iter()
            .map(|id| id.to_string())
            .join(", ")
    );

    loop {
        let m103 = read_model(&mut ctx, &models.m103).await?;
        let w = m103.w as f32 * 10f32.powf(m103.w_sf.into());
        let wh = m103.wh as f32 * 10f32.powf(m103.wh_sf.into());
        println!("{:12.3} kWh {:9.3} kW", wh / 1000.0, w / 1000.0,);
        sleep(Duration::from_secs(1)).await;
    }
}

常见问题解答

这个包与像 tokio-sunspecsunspec-modelssunspec_rs 这样的包有什么不同?

  • 此包使用 Rust 代码通过官方 SunSpec 模型存储库 生成所有代码,并使用也在 Rust 中编写的代码生成器。

  • 所有生成的模型都是纯 Rust 结构体。单个 Modbus 调用可以返回模型的完整数据,而不是必须逐点获取。

  • 所有公共类型都有文档说明。甚至生成的模型。

许可证

根据您的要求,许可为以下之一

任选其一。

依赖

~2.8–4.5MB
~79K SLoC