はじめに
前回からの続きです。
マシンスイッチのON/OFFを自動化する方法についてハードウェアエンジニアならではの回答をいただきました。
ユーザーコードでリレーモジュールに接続する
Ranorexの経験があり、且つハードウェアエンジニアの方であれば「なるほど!」と思うかもしれませんが、ハードが専門外な私は初めて聞いたとき正直あまりピンと来ませんでした。
詳しいお話を聞くととても面白い内容だったのですが、全てを書ききると長い説明になりますので、ざっくりと実装手順だけ書きたいと思います。
- PCにリレーモジュールを接続(USB接続)
- リレーモジュールにマシンスイッチをプッシュする機械を接続
- リレーモジュールのチャンネルをON/OFFするシグナルを送信する(この部分をユーザーコードで実装する)
- シグナルを受信したらリレーモジュールに接続しているマシンスイッチをプッシュする機械が作動
なるほど!これは面白そうだ! ただ、ここで一つ疑問、、、
「外部機器に接続するプログラムをユーザーコードで組んで正常に動作するのか?」
ユーザーコードは、C#で組むことが出来るのですがC#で出来ることが全て実装出来るわけではなく、一部機能が制限されてしまうものがあるのです。(Ranorexのユーザーコードで実装出来ないものについては、またの機会にお話したいと思います)
何はともあれ実際にコードを組んで実行してみないことには分からないのでやってみました。
実装してみた
ネットにサンプルプログラムがあったので、そちらを参考にしながら組んでみました。
参考:http://denkovi.com/usb-eight-channel-relay-board-for-automation
プログラム自体はとても簡単なもので、まずリレーモジュールの状態をチェックし接続するコードをこんな感じに書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/// <summary> /// リレーモジュールの接続状態チェック⇒接続 /// </summary> [UserCodeMethod] public static void ChkRelayModule(){ //Get serial number of device with index 0 ftStatus = myFtdiDevice.OpenByIndex(0); if (ftStatus != FTDI.FT_STATUS.FT_OK) { Report.Failure("ChkRelayModule", "Get serial number of device with index 0:NG"); return; } Report.Info("ChkRelayModule", "Get serial number of device with index 0:OK"); //Reset device ftStatus = myFtdiDevice.ResetDevice(); if (ftStatus != FTDI.FT_STATUS.FT_OK) { Report.Failure("ChkRelayModule", "Reset device:NG"); return; } Report.Info("ChkRelayModule", "Reset device:OK"); //Set Baud Rate ftStatus = myFtdiDevice.SetBaudRate(921600); if (ftStatus != FTDI.FT_STATUS.FT_OK) { Report.Failure("ChkRelayModule", "Set Baud Rate:NG"); return; } Report.Info("ChkRelayModule", "Set Baud Rate:OK"); //Set Bit Bang ftStatus = myFtdiDevice.SetBitMode(255, FTD2XX_NET.FTDI.FT_BIT_MODES.FT_BIT_MODE_SYNC_BITBANG); if (ftStatus != FTDI.FT_STATUS.FT_OK) { Report.Failure("ChkRelayModule", "Set Bit Bang:NG"); return; } Report.Info("ChkRelayModule", "Set Bit Bang:OK"); ftStatus = myFtdiDevice.GetPinStates(ref sentBytes[0]); } |
次にリレーモジュールのチャンネルをONするコードをこんな感じに書きます。
1 2 3 4 5 6 7 8 9 |
/// <summary> /// マシン再起動用のチャンネルON /// </summary> [UserCodeMethod] public static void RebootChannel_ON() { sentBytes[0]=(byte)(sentBytes[0] | 1); myFtdiDevice.Write(sentBytes, 1, ref receivedBytes); } |
あとは、レコーディングモジュールからユーザーコードを呼び出すだけで完了です。
上手く動作するかドキドキでしたが、実行してみたらあっさりと動作しました。
最後に
Ranorex等のUIテスト自動化ツールで物理領域を自動化することは不可能だと思っていましたが、今回の件で固定観念が一つ吹き飛びました。(色々と機材が必要にはなりますが、、、)
テスト自動化したいけど物理領域がテストシナリオに含まれていて断念したという人は是非参考にしてみてください。
業務改善・開発生産性向上支援のご相談はこちらからお気軽にお問い合わせください。