Winspec32を使ったプログラムを作るためのメモ 2015/03/09 追記

  • wiki wordになるのを避けるために文字が小文字になっているwordがあります。Winspecのsなど。適当に読み替えてください。

CCDコントローラ ST-138Sの情報 (2015/10/27 追記)

  • 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 追記)

  • 以下はWindows XP上でのプログラミングについて書いてました。XPのサポートが終了したため、Windows 7 Proにアップグレードしました(2014年夏頃)。Windows 7でもまだ古いST-133, ST-138Sコントローラー(どちらも専用PCIカードでシリアル通信を使うタイプ)を使うことができました。なおWinspec32は32 bit版のWindows 7を使う必要があります。またVisual Studioも2013にアップデートしましたが、以下のプログラムをコンパイル・実行可能であることを確認しました。したがって以下の記述はまだ有効です。

Winspec/32プログラミング

  • 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ピーク波長から圧力がわかる)。顕微ラマン分光法参照
       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から出力ポートの制御の例

  • 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とは無関係).

  • この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でポートが選択された時の処理。これでステージが使用可能。
       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

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-09 (月) 15:02:55 (988d)