MECHATROLINK-Ⅲ

KV-XH16MLを使いました。
但し、SV2は1台も接続していません。
IAIのPCON(6軸)とORIENTALのAZ(6軸)です。
FBとフローを使用してラダー回路もシンプルになりました。
素晴らしいのは、後に「PCONとAZを別な物に置き換えても
プログラムを変更する必要がない」というところです。
※分解能が変わる場合は電子ギアの設定値が変わります。
Ethernet/IPも初めて使いましたがCC-Linkのような
配線間違いも無く順調にデバッグできました。
いつも時間のシワ寄せがラダーマンに襲い掛かりますが
このようなシステムは大変ありがたいです。

設計は単純なときから

mtjです。

誰かが改造した、自分が改造した問わずにソースの見直しは小さいところから行うべきだと感じました。

小さい時の変なコードもその小さな組み合わせが大量に貯まり全体で見るとかなり保守をしにくい状態になる場合がありました。
小さい内に気にしていれば後に機能改造を行った場合に把握、改造がしやすいと感じました。

自分が作成していたものは気をつけていたのですが、他人のコードになるとチェックが甘いところがあるのでそういった箇所を気をつけ
他人のコードであろうが巻き込んでリファクタリングしたほうがいいと感じました。

RS-232C

産業界ではまだまだRS-232Cは現役です。
通信内容が単純でノイズにも強く、扱いやすい為です。

COMポートの通信内容を詳細に調べる必要があったので、
Microsoft純正のCOMポート監視ソフト「Portmon」を使いました。
残念ながら普段使用している64bit環境のOSには対応しておらず、
別の開発環境を準備して確認する事となりました。

少し前なら当たり前のようにできていた事が、
最新の開発環境では使い慣れたものが使えなかったり、
逆に不便だったりすると、とても残念な気持ちになります。

タプル戻り値の要素数を増やす方法

C#7で追加されたタプル(ValueTuple)によって戻り値を複数返すことが出来るようになりました。


■タブルを使用した戻り値の例

public (bool b, string s) GetTuple() {
    return (true, "AAA");
}

public void Sample() {
    var (b, s) = GetTuple();
}

ここで1つ疑問が出てきました。機能追加によってGetTupleメソッドの戻り値を1つ増やしたいが、GetTupleメソッドを使用しているコードを変更したくない場合、どうすれば良いのか。

まず、バイナリ互換性を維持するのであれば、オーバーロードで複数のGetTupleメソッドを作成する方法が思いつきます。


■GetTupleメソッドのオーバーロード例 ビルド出来ません。

public (bool b, string s) GetTuple() {
    return (true,"AAA");
}

public (bool b, string s,string s2) GetTuple() {  
    return (true, "AAA","BBB");
}

public void Sample() {
    var (b, s) = GetTuple();
}

しかし、これではうまく行かないです。
C#は戻り値違いによるオーバーロードは出来ないからです。
引数を変えるか、メソッド名を変える必要があります。

次に、タプル(ValueTuple)を分解する拡張メソッドを作成し、3要素のタプルから2要素だけ分解する方法を考えました。


■分解拡張メソッド(Deconstruct)の例 ビルド出来ません。

public (bool b, string s,string s2) GetTuple() {
    return (true,"AAA","BBB");
}

public void Sample() {
    var (b, s) = GetTuple(); 
}

↓この分解拡張メソッドはstaticクラスに実装
public static void Deconstruct<T1, T2, T3>(this System.ValueTuple<T1, T2, T3> tuple, out T1 v1, out T2 v2) {
    v1 = tuple.Item1;
    v2 = tuple.Item2;
}

分解拡張メソッドは複数実装できるはずなのですが、なぜか追加した分解拡張メソッドは呼び出されませんでした。

結果、どの方法もうまくいきませんでした。
.netで標準的に要素数の少ない分解が出来るようになってほしいと思うのですが、出来ないということは何かリスクがあるのでしょうかね。