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
1MB
20K SLoC
SunSpec Rust 实现
此 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-sunspec
、sunspec-models
、sunspec_rs
这样的包有什么不同?
-
此包使用 Rust 代码通过官方 SunSpec 模型存储库 生成所有代码,并使用也在 Rust 中编写的代码生成器。
-
所有生成的模型都是纯 Rust 结构体。单个 Modbus 调用可以返回模型的完整数据,而不是必须逐点获取。
-
所有公共类型都有文档说明。甚至生成的模型。
许可证
根据您的要求,许可为以下之一
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖
~2.8–4.5MB
~79K SLoC