では、これより、"simple_test.c"の改造を開始します(改造前のsimple_test.cは、念のため、別のファイル名で保存しておいてください)。
といっても、要するに、EtherCATスレーブのIO出力を、"simple_test.c"から、コントロールできるようにすれば良いだけのことです(なお、ステッピングモーターの動作原理については、ここでは説明しませんので、がんばって勉強*)してくださいね)。
*)編集注:そんな皆さまに送りたい、EDN Japan関連記事。まずはここから「「ステッピングモーター」で学ぶエンコーダの活用法」
今回は「ステッピングモーターを動かせればいい」という観点のみに注力して、考え得る最小の改造とします。
■37行目の下に、以下を追加
char stepping_Signal = 1; //00000001
/* Stepping motor value */
void CALLBACK Motorthread(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
if (stepping_Signal == 1)
stepping_Signal = 2; // 00000010
else if ( stepping_Signal == 2)
stepping_Signal = 4; // 00000100
else if ( stepping_Signal == 4)
stepping_Signal = 8; // 00001000
else if ( stepping_Signal == 8)
stepping_Signal = 1; // 00000001
}
■41行目の”IOmap[0]++;” を以下の様に変更
IOmap[0] = stepping_Signal; // ここがLEDを点滅させるパラメータ
// 必要に応じてslaveinfoの情報を使って、”[0]”を, "[2]"とか”[4]”とかに変更する
■128行目の” UINT mmResult;”の下に、以下を追加
UINT mmResult2;
■194行目の” mmResult = timeSetEvent(1, 0, RTthread, 0, TIME_PERIODIC);”の下に、以下を追加
mmResult2 = timeSetEvent(100, 0, Motorthread, 0, TIME_PERIODIC); // この”100”の値を小さくすると、モーターの速度が上がる
■252行目の" timeKillEvent(mmResult);"の下に、以下を追加
timeKillEvent(mmResult2);
これだけの変更で、とりあえず、モーターを動かす信号を作り出せます。
この”simple_test.c”では、一度キックすると、一定の時間間隔でずっと動き続ける、コールバック関数が重要な役割をしています。
常にプロセスデータをEthernetに流し続ける処理と、IOMap[]の内容を替え続ける処理を、コールバック関数に丸投げしておくという方法を採用しています。
もっとも、SOEMやこのプログラムは、非リアルタイムOSであるWindows7の上で動いているので、厳密な意味でのリアルタイム制御はできません。
EtherCATを、産業用ロボットの製造ラインや、ドローン撃退システムに使うには、ベンダー(ベッコフ社さんなど)が提供するマスタを購入した方が良いと思います。
しかし、江端家のホームセキュリティシステムに使うには、Windows7の上で動くSOEMでも、十分すぎるスペックなのです。
ソースコードを変更して、LEDの点滅パターンを自由に変えられるようになったら、前回の最初にご紹介した物品や回路図を使って、EtherCATスレーブとの接続を行ってください。
このプログラムによって動くはずの、ステッピングモーターの動画を再掲しておきます。
(回路図はこちら)
では、あなたの家のパトランプやステッピングモーターも、上手く動くことをお祈りしております。
Copyright © ITmedia, Inc. All Rights Reserved.
記事ランキング