2006年02月08日

とある分光器とIGOR XOP(その2)

2/7のつづき…。

MC-10Nを制御するに至るための第2の関門は、分光器コントローラ内蔵の計測技研USBDAQからデジタル信号を入出力できるようにすること。

USBDAQには流石にサンプルソースが添付されていたのでまだ分かりやすかったのだけれど、のもとはDAQというものを使ったことなかったし、それにサンプルの内容は1種類の処理をするプログラムでしかなかったので、結局分からなくなってメーカーに電話することに…。

計測技研は普通に分かりやすく教えてくれたので感謝。

(中略)…こうしてUSBDAQから読み書きができるようになり、そしてなんとか分光器も動かせるようになったのだった。

ここまでくればあとはIGOR XOPにするだけ。*1

XOPは作ったことあったしサンプルは豊富に添付されているので、数時間で作成完了。

無事、IgorProからMC-10Nが動かせるようになったのだった。

めでたしめでたし。


折角なので、今後MC-10N&DU-2もしくはUSBDAQを使う人のために、サンプルを載せておく*2

たったこれだけの処理をするだけなのに、サンプルソースが添付されていなかったばかりに資料集めから始めてTTLで幅3μ秒以上のパルスをDAQから送るには…とかなんとか考えながらやることになってしまったのが如何ともしがたい。

/*
 * MC10N & DU-2 monochromator with USBDAQ test program
 * 7th February 2006 by Tomonori NOMOTO
 */

#include<stdio.h>
#include<windows.h>
#include<tchar.h>

#include"usbdaq.h"

#define USBDAQ_ENUM_FAILURE      1
#define USBDAQ_OPEN_FAILURE      2
#define USBDAQ_WRITEPAGE_FAILURE 3
#define MC10N_LOWER_LIMIT        4
#define MC10N_UPPER_LIMIT        5

// Prototypes
int initialize();
int finalize();
int init_300nm();
int send_pulses(int number, int interval);
int marker_state_300nm();
int marker_state_100nm();
int is_0nm_limit();
int is_1300nm_limit();

/* Global Variables */
HANDLE hdl;

int main (int argc, TCHAR **argv)
{
	initialize();
	// 各関数を使用するときはコメントを外す
	//init_300nm();		// 300nm 位置にイニシャライズするとき
	//send_pulses(100, 30);	// 正転方向に100パルス送信(10nm動かす)。間隔:30(わりとゆっくり)
	finalize();
	return 0;
}


int initialize()
{
	TCHAR dev_id[64];
	TCHAR *dev_name;
	dev_name = NULL;
	hdl = NULL;

	usbdaq_init ();
	if (usbdaq_enum (0, dev_id, sizeof (dev_id) / sizeof (TCHAR))) return USBDAQ_ENUM_FAILURE;	// IDを取得できない場合エラー
	dev_name = strdup (dev_id);

	if(!usbdaq_open(&hdl, dev_name) && hdl) return 0;	// USBDAQをオープンできればreturn 0
	return USBDAQ_OPEN_FAILURE; // オープンできない場合エラー
}

int finalize()
{
	if(hdl) usbdaq_close (hdl);
	usbdaq_final ();
	return 0;
}

int init_300nm()
{
	int markerL=0;
	int error_code;

	while(!marker_state_300nm())	// 300nmイニシャルマーカーがHである間
	{
		if(error_code = send_pulses(-50, 2)) return error_code;	// 高速で50パルス(5nm)逆転方向に動かす
	}
	
	while(!markerL)		// 100nm毎マーカーがH→Lになるまで
	{
		if(error_code = send_pulses(+1, 30)) return error_code;	// 低速で1パルス(0.1nm)正転方向に動かす
		if(marker_state_100nm()==1) markerL=1;	// 100nm毎マーカーの状態読出
	}
	return 0;
}

int send_pulses(int pulses, int interval)
{

	int sign;	// pulsesの正負判定用
	if(pulses > 0) sign = 1;	// 正転パルス
	else if(pulses < 0) sign = -1;	// 逆転パルス
	else return 0;	// なにもしない

	if(interval < 1) interval = 1;	// intervalの下限
	if(interval > 1000) interval = 1000;	// intervalの上限
	if(pulses > 6000) pulses = 6000;	// pulsesの上限
	if(sign < 0 && !is_0nm_limit())     return MC10N_LOWER_LIMIT;	// 0nmリミットから逆転する場合エラー
	if(sign > 0 && !is_1300nm_limit())  return MC10N_UPPER_LIMIT;	// 1300nmリミットから正転する場合エラー

	{
	struct usbdaq_page pPage;
	memset(&pPage, 0, sizeof (pPage));	// pPageを0で埋めてアロケート

	// ページ0:デジタル出力に予め0を送ってHにする
	if(usbdaq_writepage(hdl, 0, &pPage)) return USBDAQ_WRITEPAGE_FAILURE;	// 失敗すればエラー

	// パルス送信
	{
	int i;
	for(i=0;i<sign*pulses;i++) // 10パルスで約1nm移動
	{
		// L出力
		if(sign == 1)
		{
			// 正転パルスL出力(0000000000000001)
			pPage.value[0]=0x0001;
		}
		else if(sign == -1)
		{
			// 逆転パルスL出力(0000000000000010)
			pPage.value[0]=0x0002;
		}
		if(usbdaq_writepage(hdl, 0, &pPage)) return USBDAQ_WRITEPAGE_FAILURE;

		// H出力(intervalで指定した回数だけHを出力して間隔を開ける)
		{
		int j;
		for(j=0;j<=interval;j++)
		{
			// H出力
			pPage.value[0]=0x0000;
			if(usbdaq_writepage(hdl, 0, &pPage)) return USBDAQ_WRITEPAGE_FAILURE;
		}
		}
		// 波長位置チェック
		if(sign < 0 && !is_0nm_limit())     return MC10N_LOWER_LIMIT;	// 0nmリミットから逆転する場合エラー
		if(sign > 0 && !is_1300nm_limit())  return MC10N_UPPER_LIMIT;	// 1300nmリミットから正転する場合エラー
	}
	}
	}
	return 0; // 正常終了で0を返す
}

int marker_state_300nm()	// H=0, L=1(270〜290nm以下でL, 以上ならH)
{
	struct usbdaq_page pPage;
	memset(&pPage, 0, sizeof (pPage));
	// ページ12:デジタル入力の読み出し
	if(usbdaq_readpage(hdl, 12, &pPage)) return -1;	// 読み出し失敗
	if((pPage.value[0] & 8)==0) // 8(00001000)はIN4:300nmイニシャルマーカー出力
		return 0;	// 300nm marker 'H' = over 300nm
	else
		return 1;	// 300nm marker 'L' = under 300nm
}

int marker_state_100nm()	// H=0, L=1(マーカー出力の状態)
{
	struct usbdaq_page pPage;
	memset(&pPage, 0, sizeof (pPage));
	if(usbdaq_readpage(hdl, 12, &pPage)) return -1; // 読み出し失敗
	if((pPage.value[0] & 4)==0) // 4(00000100)はIN3:100nm毎マーカー出力
		return 0;	// 100nm marker 'H'
	else
		return 1;	// 100nm marker 'L'
}

int is_0nm_limit()	// H=0, L=1(Hならリミット)
{
	struct usbdaq_page pPage;
	memset(&pPage, 0, sizeof (pPage));
	if(usbdaq_readpage(hdl, 12, &pPage)) return -1; // 読み出し失敗
	if((pPage.value[0] & 2)==0) // 2(00000010)はIN2:下限リミット出力
		return 0;	// 0nm limit 'H'
	else
		return 1;	// 0nm limit 'L'
}

int is_1300nm_limit()	// H=0, L=1(Hならリミット)
{
	struct usbdaq_page pPage;
	memset(&pPage, 0, sizeof (pPage));
	if(usbdaq_readpage(hdl, 12, &pPage)) return -1; // 読み出し失敗
	if((pPage.value[0] & 1)==0) // 1(00000001)はIN1:上限リミット出力
		return 0;	// 1300nm limit 'H'
	else
		return 1;	// 1300nm limit 'L'
}

*1: IgorProとXOPについては別の機会に…。

*2: XOPそのものがほしければのもとまでどうぞ。

投稿者 nomoto : 2006年02月08日 00:05 | 実験
コメント

やっぱり神7とか言われてた頃のイメージが強い。

Posted by: スーパーコピーブランド時計 : 2012年12月12日 01:09

友人家族と遠出をした時、夫の横にはシンママがべったりで間接キスまで。夫を下の名前で呼ぶのをやめてと言ったら……。

Posted by: ロレックスコピー時計 : 2012年12月12日 18:12

あらすじになってるって言われるんだよなあw 250冊買えば推しのしおりが手に入るんだ

Posted by: 大島優子のオっパ : 2013年07月07日 15:28

したがって、低価格は、約金額の要求はただBusteクロアチアと同じように出てくる場合は特にあなたの幻想的な利得になるボリューム内のハンド・バッグを掲示取得できるようにするウェブ市場のサイトでの使用を作る彼らの特定のインターネットベンダーを働く人、多数のものがあります。あなたは単にBusteクロアチアはまた、いくつかの他の封筒の多くに対してはまだスムーズなハンド・バッグを掲示促進遂行、Webストアのいずれかから集めたすべての適切な測定で必要となるポスティングハンド・バッグの一つ一つを購入する必要があります。 彼らは通常、適切なヘルプを提供しないので、あなたが手袋を投稿から離れて滞在する必要があります次に、インスタンスガイドとまたおもちゃやゲームのためのより大きいものを販売しているケースで

Posted by: スニーカー 激安通販">スニーカー 通販 : 2013年08月13日 13:43

大きい財布 ブランド
neverfullネヴァーフル
[url=http://plaza.rakuten.co.jp/listnordi75/diary/201408280000]neverfullネヴァーフル[/url]

Posted by: neverfullネヴァーフル : 2014年09月15日 20:04
コメントする









名前、アドレスを登録しますか?