これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
リンク状態の監視
Checkerを使うことでデバイスとの EtherCAT リンクが正常に動いているかどうかを監視できる.
Checker の取得
Section titled “Checker の取得”通常の Client::open の代わりに open_with_checker を使うと, Client と Checker の組が返る.
let (client, mut checker) = Client::open_with_checker( &geometry, EchocatLinkOption::default(), ClientConfig::default(),).await?;client, checker = await Client.open_with_checker( geometry, echocat.EchocatLinkOption(), ClientConfig(),)var (client, checker) = await Client.OpenWithCheckerAsync( geometry, new EchocatLinkOption(), new ClientConfig());Checker::check は, 呼び出した時点のリンク状態 LinkStatus を返す.
LinkStatus は以下を持つ.
devices: デバイスごとの状態 (DeviceState). 正常ならOP, 切断されるとLOSTなど.all_op: 全デバイスがOP状態か.any_lost: いずれかのデバイスがLOST状態か.recoveries: 切断から復帰した累計回数.
以下は, 一定間隔で check を呼び, 状態が変化したときだけ出力する例.
let mut last: Option<LinkStatus> = None;loop { let status = checker.check().await?; if last.as_ref() != Some(&status) { for (i, state) in status.devices().iter().enumerate() { println!("device[{i}]: {state}"); } println!( "all operational: {}, any lost: {}, recoveries: {}", status.all_op(), status.any_lost(), status.recoveries() ); last = Some(status); } tokio::time::sleep(CHECK_INTERVAL).await;}last = Nonewhile True: status = await checker.check() if status != last: for i, state in enumerate(status.device_states): print(f"device[{i}]: {state}") print(f"all operational: {status.all_op}, any lost: {status.any_lost}, recoveries: {status.recoveries}") last = status await asyncio.sleep(CHECK_INTERVAL)LinkStatus? last = null;while (true){ var status = await checker.CheckAsync(); if (status != last) { for (var i = 0; i < status.Devices.Count; i++) { Console.WriteLine($"device[{i}]: {status.Devices[i]}"); } Console.WriteLine($"all operational: {status.AllOp}, any lost: {status.AnyLost}, recoveries: {status.Recoveries}"); last = status; } await Task.Delay(CheckInterval);}check を呼ぶ頻度はユーザー次第である.