GX-Works3

先日、iQ-RシリーズとGX-Works3の製品説明会に出席しました。
iQ-RシリーズはマルチCPUを前提とした完全同期リンクなどM社らしいものでした。
それに比べてGX-Works3は今一つ・・・というよりも逆に使いにくいものになっていました。
構造化ラダーに対応するためのようですが一つの画面で複数の言語をカバーするのはさすがにムリがあるように思えました。

機能が増えたハードをソフトで使いやすくしている例としてスマートフォンがあります。

なにもかも画面に表示するのではなく、必要な時に必要なものを表示する方法を取り入れて欲しいと思います。

Win9

さてWin8.1出てしばらくたちました。

タッチパネル使用者、デスクトップ使用者より色々な評判はあります。

個人的にはすごい使いにくいです。
今までスタートメニューに時々使うプログラムを入れておけばいざというときつかえたものが
現状検索機能で名前を知っていないと探しにくい状況です。

そしてWin9ではスタート画面が復活するそうです。
個人的にこれ以外いりません。
未だに自分のデスクトップはガジェットとかと無縁な状態のまっさらなXP状態です。

スタートメニューが復活するという機能だけでも注目のWindows9でした。

スレッドセーフなコレクション

2つのスレッドで1つのコレクションを操作することが良くあります。

たとえば、1つのスレッドで測定値をコレクションに追加し続ける。
もう1つのスレッドでコレクションから測定値を取り出し、画面表示したり、ファイル保存したり。

C#のList<T>などのコレクションクラスはスレッドセーフではないので、
複数スレッドで操作する場合、操作する前にLockを行います。
しかし、Lockをするのはいちいち面倒ですし、間違ってLockせずに使用する不安もあります。

.Net3.0からはSynchronizedCollectionクラスなどスレッドセーフなコレクションが追加されています。
このコレクションを使用すると、AddやRemoveなどの単独操作はスレッドセーフになります。
しかし、ForEachなどの複合操作はスレッドセーフになりません。ですので不安が残ります。

結局、SynchronizedCollectionを内包し、スレッドセーフな操作しか行えないクラスを作成するのが一番良いかと考えています。
実装可能な操作はかなり限定されます。
AddかEnqueue、Clear、DequeueAll(全ての要素を取得してクリアする)、ToList、Count
こんなところでしょうか。
キューの操作しかできないので、クラス名はThreadSafeQueueにします。
スレッド間での複数要素の受け渡し用と割り切れば、役に立つのではないかと思います。

なお、List<T>のようにインデックスによる取得操作は実装できません。
指定したインデックスの要素が別のスレッドでRemoveされている可能性があります。
Dequeueも実装できません。
Dequeueした時には要素が1つも無い可能性があります。
TryGetやTryDequeueにして取得できたがどうかも戻せば良いかも知れません。

割込みユニット(2)

M社の割込みユニットは入力ユニットとして使用できます。
M社に問い合わせたときは「使用できません」と言われました。
ユニットが届いたので実際にやってみたら普通にXデバイスとして使えました。
再度、問い合わせるとやはり「使用できません」と言われました。
実際にXデバイスとして使えている事を伝えると「調べてから連絡します」と言われました。
しばらくすると「接点としてお使いいただけます」という返答がありました。
M社にしては珍しく、問合せに対する回答の精度が低いのは割込みユニットを使う人が少ないという事でしょうか?
QI60は16点入力ですが信号の立ち上りか立下りのいずれかしか選択できません。なので立ち上りと立下りの両方で割込みするときは半分の8点になってしまします。
K社のCPUに付属している10点の外部入力は割込みとして使えます。
しかも、1入力について動作条件を3種類選択できます。
このあたりは割込みユニットを使った人の経験が反映されていると感じました。