ここではHSMS のミニホストを作成しながらプログラミングについて解説していくことにします。
Visual Basic 2008とC# 2008では、作成手順やソースコードは極めて似ていましたが、VC++ 2008の場合は少し異なります。
|
ミニホストの仕様
作成するミニホストの仕様は以下のようなものとし、通信相手は一般的なウェハ検査装置とします。
|
プロジェクトの作成
-
Visual Studio 2017を起動し、Fileメニューから「New」 - 「Project...」をクリックします。
-
Visual C++のMFC Applicationを選択し、プロジェクト名とフォルダを指定します。
ここではプロジェクト名をSavoyTutorialVC2008とします。
入力が完了したらOKボタンをクリックします。
-
ウェルカム画面が表示されます。
Nextボタンをクリックします。
-
Dialog basedを選択し、Use Unicode librariesのチェックははずします。
他の設定はデフォルトのままで構わないので、Finishボタンをクリックします。
-
新規のプロジェクトが作成されました。
|
ツールボックスへSavoyを追加
|
フォームにSavoyを配置
-
下記のようにSavoyHsms、SavoySecsIIをダイアログリソースに配置します。
-
変数として割り当てます。
SavoyHsmsオブジェクトを選択して右クリックし、Add Variableをクリックします。
-
Variable typeをCSavoyHsmsに変更し、.h fileと.cpp fileもそれぞれSavoyHsms.h、SavoyHsms.cppとします。
Variable nameはm_hsmsとし、Finishボタンをクリックします。
-
同様にSavoySecsIIにも変数を割り当てます。
Variable typeをCSavoySecsIIに変更し、.h fileと.cpp fileもそれぞれSavoySecsII.h、SavoySecsII.cppとします。
Variable nameはm_inmsgおよびm_outmsgとします。
-
レシピ名はCString型の変数とし、m_strPPIDとします。
|
ラッパークラスの置き換え
Visual C++ 2008はActiveXコントロールのラッパークラス作成に関する、いくつかの問題があります。
このためJazz Softでは不具合対策用のラッパークラスを提供しています。
ラッパークラスはVisual C++ 6.0でも作成可能ですが、enumが反映されません。
-
Visual C++ 2008を終了し、プロジェクトをいったん閉じます。
-
SavoyHsms.h、SavoyHsms.cpp、SavoySecsII.h、SavoySecsII.cppを上書きします。
-
再びVisual C++ 2008を起動し、プロジェクトを読み込み直します。
|
ボタンの処理
-
Openボタンをクリックしたら、SavoyHsmsの通信設定画面が表示されるようにします。
その後OKボタンが押されたら接続するようにします。
設定内容はSavoy.iniファイルに保存され、次回から設定の入力は不要です。
|
void CSavoyTutorialVC2008Dlg::OnBnClickedButton1()
{
// Setup
m_hsms.LoadIniFile();
if(m_hsms.Setup(""))
{
// If OK button was pressed, establish connection
m_hsms.SetConnect(true);
}
}
|
-
Onlineボタンをクリックしたら、S1F13を送信するようにします。
|
void CSavoyTutorialVC2008Dlg::OnBnClickedButton2()
{
// Send S1F13
m_outmsg.SetSml("s1f13w{}");
m_hsms.Send(m_outmsg.GetMsg());
}
|
-
PP Selectボタンをクリックしたら、リモートコマンドでPP-SELECTを送信するようにします。
|
void CSavoyTutorialVC2008Dlg::OnBnClickedButton3()
{
// Send S2F41 PP-Select
UpdateData();
m_outmsg.SetSml("s2f41w{<a'PP-SELECT'>{{<a'PPID'><a'" + m_strPPID + "'>}}}");
m_hsms.Send(m_outmsg.GetMsg());
}
|
-
PP Startボタンをクリックしたら、リモートコマンドでSTARTを送信するようにします。
|
void CSavoyTutorialVC2008Dlg::OnBnClickedButton4()
{
// Send S2F41 Start
m_outmsg.SetSml("s2f41w{<a'START'>{{}}}");
m_hsms.Send(m_outmsg.GetMsg());
}
|
|
イベントの処理
SavoyHsmsからのイベントを処理します。
イベントハンドラは、プロパティウィンドゥから作成できます。
-
Connectedイベントが来たら、セレクト要求を送信するようにします。
|
void CSavoyTutorialVC2008Dlg::ConnectedSavoyhsmsctrl1(LPCTSTR lpszIPAddress, long lPortNumber)
{
// Connected
// Send select request
m_outmsg.SetSml("Select.req");
m_hsms.Send(m_outmsg.GetMsg());
}
|
-
Receivedイベントが来たら、メッセージ内容を解析するためにSavoySecsIIに渡します。
|
void CSavoyTutorialVC2008Dlg::ReceivedSavoyhsmsctrl1(LPCTSTR lpszIPAddress, long lPortNumber, LPCTSTR lpszMsg)
{
m_inmsg.SetMsg(lpszMsg);
|
-
返信の必要なデータメッセージを受け取ったら、適当な返事を返信します。
|
switch(m_inmsg.GetSType())
{
case 0:
// Data message
if(m_inmsg.GetWbit() && m_inmsg.GetFunction()%2)
{
// Need to reply something...
m_outmsg.SetSml("<b 0>");
m_outmsg.Reply(lpszMsg);
m_hsms.Send(m_outmsg.GetMsg());
}
break;
|
-
セレクト要求を受け取ったら、セレクト応答を返信します。
|
case 1:
// Select request
m_outmsg.SetSml("Select.rsp");
m_outmsg.Reply(lpszMsg);
m_hsms.Send(m_outmsg.GetMsg());
break;
}
}
|
|
全ソースコード
以上でミニホストの完成です。
全ソースコードはいくつかのファイルで構成されますので、ここでは載せないことにします。
このプロジェクトはゼロからスクラッチで作った訳ですが、ソフトの中心であるSavoyTutorialVC2008Dlg.cppファイルは、空白行やコメントを入れてもたったの231行しかありません。
実際に自分で書いたコードの行数は、コメントを除くとなんと31行です。
他社製品にあるような訳の分からない設定ファイルもデータファイルも書きませんでした。
このような驚異的なまでの簡単さは、他社では真似のできない芸当です。
|