1 个不稳定版本

0.1.3 2024年4月16日

#15 in #catalog

MIT 许可证

91KB
2K SLoC

IODD 引擎

此仓库包含 IoDD 引擎的实现,具有解析命令行界面 (CLI) 和目录系统。IODD 引擎旨在简化互联网络中数字设备之间的交互和管理。

它还包括 IFM IoTCore 的客户端实现。

解析 CLI 提供用户友好的界面来执行命令和查询,使得与 IoDD 引擎的通信更加高效。此引擎仅针对 IODD 的 1.1 版本。

IODD 规范

目录:- 存储关于 VendorId、DeviceId、Productname 和相应的 IODD Zip 文件的信息。

引擎:- 允许解析 PDIn 和变量的设置。实现了 ObserverMenu 和 ParameterMenu。

Cli
- 允许基于 CLI 与 IoDD 传感器交互

IoTCoreConnect:- 与 IFM IotCore 交互的客户端

此代码采用 Apache 2.0 许可证。

其他必需的文件 标准定义 手动放入 /data/specs 中。

请参阅 CLI 获取有关如何使用库的更多信息。此库已与多个 io-link 设备进行了测试。

示例输出

供应商:310,产品名称:SD1540,设备:872 HexData:0000000000000000FE00079EFE0000000300
名称:总计数器,描述:流量。该值等于自上次重置以来的当前消耗量,值:0.0,单位:m³
名称:流量,描述:当前流量,值:0.0,单位:m³/h
名称:温度,描述:当前温度,值:19.5,单位:°C
名称:压力,描述:当前压力,值:0.0,单位:bar
名称:设备状态,描述:当前设备状态,过程数据通道中 [设备状态,索引 36] 的参数的一个副本,值:0.0
名称:OUT2,描述:数字信号 [OUT2] 的当前状态,值:"关闭"
名称:OUT1,描述:数字信号 [OUT1] 的当前状态,值:"关闭"

CLI 示例

从设备读取当前值

ioddcli eval --ip 192.168.56.89 --port 1

按索引读取设备变量

ioddcli read-parameter 192.168.56.89 2 551 0

列出所有变量

ioddcli list-variable --vendorid 310 --deviceid 706 --productname TN2405 --accessrights rw

按名称(id)显示变量

ioddcli variable --vendorid 310 --deviceid 706 --productname TN2405 --id V_diS

从I/O设备读取参数

cli read-parameter --ip 192.168.56.89 --port 2 --index 551 --subindex 0

编码变量

ioddcli encode-variable --vendorid 310 --deviceid 706 --productname TN2405 --id V_diS --param false, true, 4

设置参数

cargo run set-parameter --ip 192.168.56.89 --port 2 --index 552 --subindex 0 --hexdata 4400

将原始值转换为十六进制

ioddcli encode-variable --vendorid 310 --deviceid 706 --productname TN2405 --id V_uni --param "0" 或 ioddcli encode-variable --vendorid 310 --deviceid 706 --productname TN2405 --id V_diS --param "true, false, 4"

读取菜单

cargo run get-menu --vendorid 310 --deviceid 706 --productname TN2405 --role observer --menu parameter

示例

    let catalog = Catalog::new_with_db(None);
    let (drivername,files) = catalog.queryfordriver(*deviceid, productname.to_owned(), *vendorid).await;
    let p = Parser::new(drivername, files);
    let e = Engine::new(&p.iodevice, super::super::LANGLOCALE);
    println!("HexData: {}", hex_data);
    let datapoints = match e.parse(hex_data){
        Ok(x) => x,
        Err(err) => {panic!("Error: {:?}", err)}
    };
    for h in entries {
        println!(
            "Name: {}, Desc: {}, Value: {}{}",
            h.name,
            h.description,
            h.value,
            if !h.unit.is_empty() {
                format!(", Unit: {}", h.unit)
            } else {
                String::new() // Empty string if unit is empty
            }
        );
    }

待办事项

  • 在打印PDIN之前从设备读取变量。例如,设备可能被设置为华氏度而不是摄氏度
  • 进行CRC32检查 - 如果可能的话
  • 更新Github Actions
  • 更多文档
  • 添加更多编码数据类型

请注意:在发生任何潜在的版权侵权事件时,我们恳请您在采取任何进一步行动之前,请联系相关内容的所有者或管理员。通过尊重和建设性的沟通解决此类问题至关重要,以确保任何担忧都能得到妥善处理和解决,符合适用的法律和法规。我们首先联系内容所有者,旨在培养一种合作的方法来解决问题,同时维护知识产权的完整性。感谢您对此事的谅解与合作。

依赖关系

~33–47MB
~551K SLoC