SOEM

NOTE: このリンクはRustからのみ使用可能である.

NOTE: このリンクはGPLv3ライセンスで配布されている.

SOEMは有志が開発しているオープンソースのEherCAT Masterライブラリである. TwinCATとは異なりリアルタイム性は保証されない. そのため, 基本的にTwinCATを使用することを推奨する. SOEMを使用するのはやむを得ない理由があるか, 開発時のみに限定するべきである. 一方, SOEMはクロスプラットフォームで動作し, インストールも単純という利点がある.

Windowsの場合は, npcapを「WinPcap API compatible mode」でインストールしておくこと. Linux/macOSの場合は, 特に準備は必要ない.

Install

cargo add autd3-link-soem

APIs

第1引数にはエラーが起きたときのコールバック関数を, 第2引数にはオプションを指定する.

use autd3_link_soem::{Status, ThreadPriority, SOEM, SOEMOption};
use std::num::NonZeroUsize;
use std::time::Duration;

fn main() {
let _ = 
SOEM::new(
    |slave, status| {
        eprintln!("slave [{}]: {}", slave, status);
        if status == Status::Lost {
            std::process::exit(-1);
        }
    },
    SOEMOption {
        buf_size: NonZeroUsize::new(16).unwrap(),
        ifname: None,
        state_check_interval: Duration::from_millis(100),
        sync0_cycle: Duration::from_millis(1),
        send_cycle: Duration::from_millis(1),
        thread_priority: ThreadPriority::Max,
        sync_tolerance: Duration::from_micros(1),
        sync_timeout: Duration::from_secs(10),
        affinity: None
    },
);
}

SOEMリンクで指定できるオプションは以下の通りである. デフォルト値は上記の通り.

  • buf_size: 送信キューバッファサイズ. 通常は変更する必要はない.
  • ifname: ネットワークインタフェース名. 空白の場合はAUTD3デバイスが接続されているネットワークインタフェースを自動的に選択する.
  • state_check_interval: エラーが出ているかどうかを確認する間隔
  • sync0_cycle: 同期信号の周期
  • send_cycle: 送信サイクル
    • SOEMも大量のデバイスを接続すると挙動が不安定になる場合がある1. このときは, sync0_cyclesend_cycleの値を増やす. これら値はエラーが出ない中で, 可能な限り小さな値が望ましい. どの程度の値にすべきかは接続している台数に依存する. 例えば, 9台の場合は程度の値にしておけば動作するはずである.
  • thread_priority: スレッドの優先度
  • sync_tolerance: 同期許容レベル. 初期化時, 各デバイスのシステム時間差がこの値以下になるまで待機する. 以下のタイムアウト時間が経過しても同期が完了しない場合はエラーとなる. この値を変更することは推奨されない.
  • sync_timeout: 同期タイムアウト. 上記のシステム時間差測定のタイムアウト時間.
  • affinity: CPUアフィニティ. Noneの場合はOSに任せる.
1

TwinCATよりは緩く, 普通に動くこともある.