Winspecプログラム の変更点


#author("2024-03-09T11:37:19+09:00","default:masami","masami")
RIGHT:&ref(https://www.misasa.okayama-u.ac.jp/~masami/images/OUOperatingGrant.png);
#author("2024-03-09T11:38:28+09:00;2024-03-09T11:37:19+09:00","default:masami","masami")
*Winspec32を使ったプログラムを作るためのメモ  2015/03/09 追記 [#cbf95442]
#contents
----
-wiki wordになるのを避けるために文字が小文字になっているwordがあります。Winspecのsなど。適当に読み替えてください。
**CCDコントローラ ST-138Sの情報 (2015/10/27 追記) [#f1d49f54]
-ST-138Sの中古について:ST-138S(Princeton Instruments)の中古はebayなどで入手可能です。型番、外見が同じでも、内蔵ADCコンバーターは色々と変わっているようで、特に高速なAD変換が必要な方は注意が必要です。初期のものはADCが1台で16 bit, 100 kHzくらいで、後期ではADC2台搭載で、1つが12-14 bit 高速、残りが16 bit低速用となっているようです。当方のものは以前は16 bit, 12 bitどちらも使えましたが、ある時から16 bit側が正常に動かなくなりました。16 bitを普段使っていたのですが、仕方なく12 bitを使ってました。感度的には半分くらいになります。最近ebayで数千円のものを買ったところ、これは初期のもので、16 bit ADCが1つのみでした。しかし感度的にはこちらの方がいいので、現在こちらに入れ替えて使ってます。数千円(送料の方が...)だったので保守パーツ用に買いましたが、完璧に動作してます。
 ST-138Sの中古について:ST-138S(Princeton Instruments)の中古はebayなどで入手可能です。型番、外見が同じでも、内蔵ADCコンバーターは色々と変わっているようで、特に高速なAD変換が必要な方は注意が必要です。初期のものはADCが1台で16 bit, 100 kHzくらいで、後期ではADC2台搭載で、1つが12-14 bit 高速、残りが16 bit低速用となっているようです。当方のものは以前は16 bit, 12 bitどちらも使えましたが、ある時から16 bit側が正常に動かなくなりました。16 bitを普段使っていたのですが、仕方なく12 bitを使ってました。感度的には半分くらいになります。最近ebayで数千円のものを買ったところ、これは初期のもので、16 bit ADCが1つのみでした。しかし感度的にはこちらの方がいいので、現在こちらに入れ替えて使ってます。数千円(送料の方が...)だったので保守パーツ用に買いましたが、完璧に動作してます。
**Windows 7とST-138S、Winspec32 (2015/03/09 追記) [#y87a41e4]
-以下はWindows XP上でのプログラミングについて書いてました。XPのサポートが終了したため、Windows 7 Proにアップグレードしました(2014年夏頃)。Windows 7でもまだ古いST-133, ST-138Sコントローラー(どちらも専用PCIカードでシリアル通信を使うタイプ)を使うことができました。なおWinspec32は32 bit版のWindows 7を使う必要があります。またVisual Studioも2013にアップデートしましたが、以下のプログラムをコンパイル・実行可能であることを確認しました。したがって以下の記述はまだ有効です。
 以下はWindows XP上でのプログラミングについて書いてました。XPのサポートが終了したため、Windows 7 Proにアップグレードしました(2014年夏頃)。Windows 7でもまだ古いST-133, ST-138Sコントローラー(どちらも専用PCIカードでシリアル通信を使うタイプ)を使うことができました。なおWinspec32は32 bit版のWindows 7を使う必要があります。またVisual Studioも2013にアップデートしましたが、以下のプログラムをコンパイル・実行可能であることを確認しました。したがって以下の記述はまだ有効です。
** Winspec/32プログラミング [#y4f8505e]
-Winspec32はローパー社の冷却CCDカメラ等を使った分光測定や画像測定のためのプログラムである。Acton社の分光器等を制御することもできる。WindowsのAutomationに対応しているため、Visual Basic等からWinspec32を制御することができる。自分のしたい測定に便利な機能を作ることができる。ここでは顕微ラマン分光器の制御のために試行錯誤した時のメモを残しておく。
-まずGoogleでWinspec32の情報を得る。また製品添付CDに入っている"WinX/32 Automation 3.X User Programming Description for Visual Basic"を読む。書かれているようにVisual Studioのプロジェクトから参照の追加からRoper Scientific's WinX/32 Type Libraryを指定する。
-以下プログラムはVisual Studio 2008 Proで作っている(2013でも実行可能)。
 Winspec32はローパー社の冷却CCDカメラ等を使った分光測定や画像測定のためのプログラムである。Acton社の分光器等を制御することもできる。WindowsのAutomationに対応しているため、Visual Basic等からWinspec32を制御することができる。自分のしたい測定に便利な機能を作ることができる。ここでは顕微ラマン分光器の制御のために試行錯誤した時のメモを残しておく。
 まずGoogleでWinspec32の情報を得る。また製品添付CDに入っている"WinX/32 Automation 3.X User Programming Description for Visual Basic"を読む。書かれているようにVisual Studioのプロジェクトから参照の追加からRoper Scientific's WinX/32 Type Libraryを指定する。
 以下プログラムはVisual Studio 2008 Proで作っている(2013でも実行可能)。
-フォーム上に作ったAcqbuttonボタンを押すと、測定を始める単純なプログラム例。測定を実行させるのはobjExp.Start()である。
    Private Sub AcqButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AcqButton.Click
        Dim objExp As New WINX32Lib.ExpSetup
        Dim objDoc As WINX32Lib.DocFile
        Dim intStatus As Integer
        If objExp.Start(objDoc) Then   '測定開始 
            While objExp.GetParam(WINX32Lib.EXP_CMD.EXP_RUNNING, intStatus)  '測定がまだ続いているかをチェック
                System.Windows.Forms.Application.DoEvents() '待っている間に他の仕事をさせる
            End While
        End If
    End Sub
-ボタンが押された時に、アクティブなスペクトルのカーソル位置の波長(又は波数)を読んでTextBox1に入れるサブプログラム例。Getcursorでカーソルオブジェクトを得て、Lambda()でcalibrationされた値を得る。これはルビー蛍光圧力測定用プログラムで実際に使用している(ルビー蛍光線R1ピークの圧力依存性はよく知られているので、測定したR1ピーク波長から圧力がわかる)。[[顕微ラマン分光法]]参照
 ボタンが押された時に、アクティブなスペクトルのカーソル位置の波長(又は波数)を読んでTextBox1に入れるサブプログラム例。Getcursorでカーソルオブジェクトを得て、Lambda()でcalibrationされた値を得る。これはルビー蛍光圧力測定用プログラムで実際に使用している(ルビー蛍光線R1ピークの圧力依存性はよく知られているので、測定したR1ピーク波長から圧力がわかる)。[[顕微ラマン分光法]]参照
    Private Sub SetButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SetButton.Click
        Dim objExp As New WINX32Lib.ExpSetup
        Dim objDoc As WINX32Lib.DocFile
        Dim objWin As WINX32Lib.DocWindow
        Dim objCur As WINX32Lib.CursorObj
        Dim objCal As WINX32Lib.CalibObj
        Dim wl0 As Double
        Dim objWins As New WINX32Lib.DocWindows
        objWin = objWins.GetActive()
        objDoc = objWin.GetDocument
        objCal = objDoc.GetCalibration
        objCur = objWin.GetCursor
        wl0 = objCal.Lambda(objCur.XPos)
        TextBox1.Text() = Str(Int(wl0 * 1000) / 1000)   ' 1000で掛けて、割っているのは小数点以下三桁まで残すため。
    End Sub

**Winspecから出力ポートの制御の例 [#zded79c4]
-Princeton Instruments社のST-138 コントローラーには出力ポートが8ビット分用意されており、これらは自作機器等の制御に利用できる。私はレーザーのOn/Off(実際には回転式NDフィルターの回転させる)、ビームスプリッターの出し入れ2系統、照明のOn/Off2系統に使っている。ここではフォームを閉じる時(プログラム終了時)に、ライトなどをOFFにするために出力ポートを制御している例を示す。ttlに値を設定して、Setparamに渡すだけ。各ポートは2進数で表されるので,ONにする時は1,2,4,8,16,32(OFFならゼロ)を指定して、足し算したものがttlとなる。ここでは分かりやすく10進数に直している。
 Princeton Instruments社のST-138 コントローラーには出力ポートが8ビット分用意されており、これらは自作機器等の制御に利用できる。私はレーザーのOn/Off(実際には回転式NDフィルターの回転させる)、ビームスプリッターの出し入れ2系統、照明のOn/Off2系統に使っている。ここではフォームを閉じる時(プログラム終了時)に、ライトなどをOFFにするために出力ポートを制御している例を示す。ttlに値を設定して、Setparamに渡すだけ。各ポートは2進数で表されるので,ONにする時は1,2,4,8,16,32(OFFならゼロ)を指定して、足し算したものがttlとなる。ここでは分かりやすく10進数に直している。
    Private Sub Form1_Close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
        Dim objExp As New WINX32Lib.ExpSetup
        Dim ttl As Integer
        laser = 0        'port 1;   0がoff, 1ならon   回転NDフィルターなので0なら吸収max, 1なら吸収min位置へ回転する
        light1 = 0        'port 2;  0がoff, 2ならon 落射照明のOFF/ON
        light2 = 0        'port 3;  0がoff, 4ならon 透過照明のOFF/ON
		             'port 4;  未使用
        bs1 = 0        'port 5;  0がoff, 16ならon ビームスプリッター1のIN/OUT
        bs2 = 0        'port 6;  0がoff, 32ならon ビームスプリッター2のIN/OUT
        ttl = laser + light1 + light2 + bs1 + bs2
        objExp.SetParam(WINX32Lib.EXP_CMD.EXP_TTL_LINES, ttl)
    End Sub

*RS-232C(シリアル制御)関連 (ここはWinspecとは無関係). [#g27fe02e]
-このRamanの場合はXYステージ制御(シグマ光機)をRS232C経由で行っている。使えるシリアルポートのリストをComboBox1に入れる。プログラム起動後、ユーザーは適切なポートをこのComboBox1から選んでおく必要がある。
 このRamanの場合はXYステージ制御(シグマ光機)をRS232C経由で行っている。使えるシリアルポートのリストをComboBox1に入れる。プログラム起動後、ユーザーは適切なポートをこのComboBox1から選んでおく必要がある。
        For Each sp As String In My.Computer.Ports.SerialPortNames
            ComboBox1.Items.Add(sp)
        Next
        SerialPort1.NewLine = vbCrLf  ' 改行の設定.このコントローラではcr + lfを送る。

-上でセットされたComboBox1でポートが選択された時の処理。これでステージが使用可能。
 上でセットされたComboBox1でポートが選択された時の処理。これでステージが使用可能。
    Private Sub ComboBox1_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
        If SerialPort1.IsOpen Then    ' 既にオープンされているなら閉じる。
            SerialPort1.Close()
        End If
        SerialPort1.PortName = ComboBox1.SelectedItem      ' 選択されたポートを設定
        Try
            SerialPort1.Open()       ' ポートをオープン
        Catch ex As Exception    ' エラー時にメッセージを出す
            MessageBox.Show(ex.Message)
        End Try
    End Sub

-ステージにコマンドを送る例。以下は現在の位置を読んでいる。位置といってもエンコーダーを読んでいるのではなくて、これまでに出したパルスの数を見ているだけ。なのでマニュアルでステージを移動させても位置に反映されない。
 ステージにコマンドを送る例。以下は現在の位置を読んでいる。位置といってもエンコーダーを読んでいるのではなくて、これまでに出したパルスの数を見ているだけ。なのでマニュアルでステージを移動させても位置に反映されない。
    Private Sub CurrentStatus()
        Dim t As String
        SerialPort1.WriteLine("!:")             '現在の状態を要求
        While SerialPort1.ReadLine = "B"   '返事を読んで、Bが帰ってくると装置がbusyであるので、しばらく待つ
            SerialPort1.WriteLine("!:")
            Threading.Thread.Sleep(10)
        End While
        SerialPort1.WriteLine("Q:")       ' 現在位置を要求
        t = SerialPort1.ReadLine            ' 位置を読み込む
    End Sub