daq-middleware 講習会 daq コンポーネント開発

47
DAQ-Middleware 講講講 DAQ 講講講講講講講講講 講講講講 講講講講講講講講講講講講講 講講講講講講講講講 2010-08-05 1 2010 講講 DAQ-Middleware 講講講

Upload: ian-fulton

Post on 01-Jan-2016

321 views

Category:

Documents


0 download

DESCRIPTION

DAQ-Middleware 講習会 DAQ コンポーネント開発. 千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所. ドキュメンテーション. DAQ-Middleware 1.0.0 技術解説書 http://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-Tech.pdf DAQ-Middleware 1.0.0 開発マニュアル http://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-DevManual.pdf 訂正があります: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: DAQ-Middleware 講習会 DAQ コンポーネント開発

DAQ-Middleware 講習会DAQ コンポーネント開発

千代浩司高エネルギー加速器研究機構

素粒子原子核研究所

2010-08-05 12010年度 DAQ-Middleware講習会

Page 2: DAQ-Middleware 講習会 DAQ コンポーネント開発

ドキュメンテーション• DAQ-Middleware 1.0.0 技術解説書

http://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-Tech.pdf

• DAQ-Middleware 1.0.0 開発マニュアルhttp://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-DevManual.pdf訂正があります: http://daqmw.kek.jp/docs/erratum-DAQ-Middleware-1.0.0-DevManual.pdf

2010-08-05 2010年度 DAQ-Middleware講習会 2

Page 3: DAQ-Middleware 講習会 DAQ コンポーネント開発

基本 DAQ モデル

Dispatcher

Logger

MonitorGatherer

・・・

HTTPServer

Control Panelon Web browser

Online histograms on Web browser

Read-outmodules

PC

PC

Command/Status

User Interface

XML

System Configuration

Online histograms using ROOT

XML/JSON

Device Condition/Online analysis

• 使用するコンポーネントを指定• コンポーネント間接続情報• パラメータ

• 装置パラメータ• オンラインモニタ用パラメータ

Detectors

DaqOperator

32010年度 DAQ-Middleware講習会2010-08-05

Page 4: DAQ-Middleware 講習会 DAQ コンポーネント開発

4

DAQ コンポーネント

DAQ コンポーネントを組み合わせて DAQ システムを構築する データ転送機能、ランコントロール、システムコンフィギュレーショ

ン機能は DAQ-Middleware で実装済み。 データを下流に送るには OutPort に書く。 上流からのデータを読むには InPort を読む。 ユーザーはコアロジックを実装することで新しいコンポーネントを作

成できる。 リードアウトモジュールからのデータの読み取りロジック ヒストグラムの作成ロジック

2010年度 DAQ-Middleware講習会

InPort OutPort

Service Port(command/status)

Logics (for data handling)

Data

InPort OutPort

Service Port(command/status)

Logics (for data handling)

Data+ =

2010-08-05

Page 5: DAQ-Middleware 講習会 DAQ コンポーネント開発

DAQ コンポーネント開発のながれ

• コンポーネント作成• configuration file の作成• コンポーネント起動、 DaqOperator 起動• DaqOperator に対して指示をだす ( 今回は

HTTP で指示を出すかわりにキーボードから数字キーを入力して指示を出します)run.py –cl config.xml

2010-08-05 2010年度 DAQ-Middleware講習会 5

Page 6: DAQ-Middleware 講習会 DAQ コンポーネント開発

クラス

2010-08-05 62010年度 DAQ-Middleware講習会

RTC::DataFlowComponentBase

DAQMW::DaqComponentBase

技術解説書  11 ページ

Page 7: DAQ-Middleware 講習会 DAQ コンポーネント開発

1 コンポーネントに必要なソースファイル

Skeleton という名前のコンポーネントの場合– Skeleton.h (DaqComponentBase を継

承。 Skeleton クラス)– Skeleton.cpp ( 各状態ロジックを実装 )– SkeletonComp.cpp (main() がここにある )– Makefile– その他分離したくなったファイル

2010-08-05 2010年度 DAQ-Middleware講習会 7

技術解説書 14 ページ

Page 8: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント状態遷移

2010-08-05 2010年度 DAQ-Middleware講習会 8

LOADED

CONFIGURED

RUNNING

PAUSED

daq_dummy()

daq_dummy()

daq_run()

daq_dummy()

CONFIGUREdaq_configure()

STARTdaq_start()

PAUSEdaq_pause()

UNCONFIGUREdaq_unconfigure()

STOPdaq_stop()

RESUMEdaq_resume()

各状態にあるあいだその関数がくりかえし呼ばれる。

状態遷移するときは状態遷移関数が呼ばれる。

状態遷移できるようにするためには、 daq_run() 等は永遠にそのなかでブロックしてはだめ。(例: Gatherer のソケットプログラムで timeout つきにする必要がある)

Page 9: DAQ-Middleware 講習会 DAQ コンポーネント開発

9

コンポーネント状態遷移LOADED

CONFIGURED

RUNNING

PAUSED

daq_dummy()

daq_dummy()

daq_run()

daq_dummy()

CONFIGUREdaq_configure()

STARTdaq_start()

PAUSEdaq_pause()

UNCONFIGUREdaq_unconfigure()

STOPdaq_stop()

RESUMEdaq_resume()

2010年度 DAQ-Middleware講習会2010-08-05

Gatherer

daq_start(): リードアウトモジュールに接続daq_run(): リードアウトモジュールからデータ を読んで後段コンポーネントに

データを送るdaq_stop(): リードアウトモジュールから切断。Monitor

daq_start(): ヒストグラムデータの作成daq_run(): 上流コンポーネントからデータをう けとり、デコードしてヒストグラム データをアップデートする。定期 的にヒストグラム図を書くdaq_stop(): 最終データを使ってヒストグラム 図を書く

技術解説書  15 ページ

gatherer monitor

Daq Operator

ReadOutModule

Page 10: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント実装方法各メソッドを実装することでコンポーネントを作

成する– daq_configure()– daq_start()– daq_run()– daq_stop()– daq_unconfigure()

2010-08-05 2010年度 DAQ-Middleware講習会 10

技術解説書 15 ページ

Page 11: DAQ-Middleware 講習会 DAQ コンポーネント開発

/usr/share/daqmw/examples/Skeleton/で状態遷移の確認の例

• Skeleton.h, Skeleton.cpp を見てみる。• 各メソッドが本当に呼ばれているのか確認するには

cd /home/daq/Mydaqcp –r /usr/share/daqmw/examples/Skeleton .cd Skeletonvi Skeleton.cpp

m_debug(true) にセットする、 daq_run() 等で std::cerr << “Skeleton::daq_run()” << std::endl;になっているかどうか確認する。なってなかったら書く。

makecd ..cp /usr/share/daqmw/conf/skel.xml .run.py –cl skel.xmlrun.py –cl で起動したコンポーネントの std::cerr は /tmp/daqmw/log.SkeletonComp に

でるので別の端末でtail –f /tmp/daqmw/log.SkeletonCompして run.py で 0: configure 等するたびにログが表示されることを確認する。

2010-08-05 2010年度 DAQ-Middleware講習会 11

Page 12: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント間のデータフォーマット

2010-08-05 2010年度 DAQ-Middleware講習会 12

COMPONENTHEADER

COMPONENTFOOTER

Event Data

Event Data

Event Data

Event Data

Reserved ReservedHeaderMagic

HeaderMagic

Data Byte Size

Data Byte Size

Data Byte Size

Data Byte Size

Reserved ReservedFooterMagic

FooterMagic

Seq. Num

Seq. Num

Seq. Num

Seq. Num

Component Header

Component Footer

Data Byte Size には下流コンポーネントに何バイトのデータを送ろうとしたかを入れる下流側では DataByteSize を読んでデータが全部読めたかどうか判断する

Sequence Number にデータを送るのは何回目かを入れる下流側では受け取った回数を自分で数えておいて、 Sequence Number とあうかどうか確認する

技術解説書 7 ページ

Page 13: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント間のデータフォーマット

2010-08-05 2010年度 DAQ-Middleware講習会 13

Reserved ReservedHeaderMagic

HeaderMagic

Data Byte Size

Data Byte Size

Data Byte Size

Data Byte Size

Reserved ReservedFooterMagic

FooterMagic

Seq. Num

Seq. Num

Seq. Num

Seq. Num

技術解説書 6ページ

Reserved のバイトはユーザが使用してもよい

Page 14: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント間データフォーマット関連メソッド

• inc_sequence_num()• reset_sequence_num()• get_sequence_num()

• set_header(unsigned char *header, unsigned int data_byte_size)• set_footer(unsinged char *footer, unsigned int sequence_num)

• check_header(unsigned char *header, unsigned received_byte)• check_footer(unsigned char *footer, unsigned int loop_count)• check_header_footer(......)

2010-08-05 2010年度 DAQ-Middleware講習会 14

技術解説書  12ページ

Page 15: DAQ-Middleware 講習会 DAQ コンポーネント開発

Fatal Error

• 致命的エラーが起こったら fatal_error_report()を使って DaqOperator へ通知する。

• DAQ-Middleware で定義しているものとユーザーが定義できるものがある。

fatal_error_report(USER_DEFINED_ERROR1, “ cannot connect to readout module”);

• DaqOpertorに通知されたあとの動作は上位のフレームワークあるいは人が対処する(ランを停止する、再スタートするなど)

2010-08-05 2010年度 DAQ-Middleware講習会 15

技術解説書 18 ページ

Page 16: DAQ-Middleware 講習会 DAQ コンポーネント開発

InPort, OutPort 操作

2010-08-05 2010年度 DAQ-Middleware講習会 16

InPort OutPort

Service Port(command/status)

Logics (for data handling)

Data

InPort OutPort

Service Port(command/status)

Logics (for data handling)

Data+ =Skeleton.h:

private: TimedOctetSeq m_in_data; InPort<TimedOctetSeq> m_InPort;

TimedOctetSeq m_out_data; OutPort<TimedOctetSeq> m_OutPort;

Skeleton.cpp// CtorSkeleton::Skeleton(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_InPort("skeleton_in", m_in_data), m_OutPort("skeleton_out", m_out_data),

技術解説書 17 ページ

Page 17: DAQ-Middleware 講習会 DAQ コンポーネント開発

InPort 操作bool rv = m_InPort.read() – 読んだデータは m_in_data.data 配列にデータが入

る– length = m_in_data.data.length() で長さ

( Component Header, Footer を含めた長さ)– 戻り値:  true, false– false の場合は check_inPort_status(m_InPort) で

InPort の状態を確認する。check_inPort_status の戻り値• BUF_TIMEOUT: 通常リトライするようにコードを書く• BUF_FATAL: 通常 fatal_error_report() でエラーを報告

2010-08-05 2010年度 DAQ-Middleware講習会 17

技術解説書17ページ

Page 18: DAQ-Middleware 講習会 DAQ コンポーネント開発

OutPort 操作bool rv = m_OutPort.write() – m_out_data.data.length(length) でデータ長を指定

( Component Header, Footer を含めた長さ)– 送るデータは m_out_data.data 配列に入れる

( Component Header, Footer を含める)– m_OutPort.write() でデータが送られる。– 戻り値:  true, false– false の場合は check_outPort_status(m_OutPort) で

OutPort の状態を確認する。check_inPort_status の戻り値• BUF_TIMEOUT: 通常リトライするようにコードを書く• BUF_FATAL: 通常 fatal_error_report() でエラーを報告

2010-08-05 2010年度 DAQ-Middleware講習会 18

技術解説書18ページ

Page 19: DAQ-Middleware 講習会 DAQ コンポーネント開発

DaqOperator

• 通常 DaqOperator は変更する必要はない。• /usr/libexec/daqmw/DaqOperator にバイナ

リがある。

2010-08-05 2010年度 DAQ-Middleware講習会 19

Page 20: DAQ-Middleware 講習会 DAQ コンポーネント開発

開発環境• newcomp– 新規コンポーネント開発開始用テンプレート

作成ツール• C++ のテンプレートではありません

• Makefile– あんまりぐちゃぐちゃ書かなくても済むよう

にしてみた。

2010-08-05 202010年度 DAQ-Middleware講習会

Page 21: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp• newcomp MyMonitor

– MyMonitor ディレクトリを作成– Makefile 、 MyMonitor.h 、 MyMonitor.cpp 、 MyMonitorComp.cpp のひな

形を作る– インクルードガード、コンポーネント名は

MYMONITOR 、 MyMonitor 、 mymonitor になる(ケースマッチで引数から取得)

– InPort 1 個、 OutPort 1 個、実装すべきメソッド(ほぼ空)のものができる。

• Source型、 Sink型はオプションがある– newcomp -t source MyReader– newcomp -t sink MyMonitor– それぞれ InPort, OutPortは必要なものだけ作る。

• newcomp -h で簡単なヘルプがでる。

2010-08-05 212010年度 DAQ-Middleware講習会

Page 22: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp -hUsage: newcomp [-c] [-f] [-t component_type] NewCompName

Create skeleton component files with NewCompName in NewCompName directory.If this directory does not exist, it will be created automaticallyunless -c option is specified.Please specify NewCompName as you need.If you issue "newcomp NewGatherer", following files will be created:

NewGatherer/NewGatherer/MakefileNewGatherer/NewGatherer.hNewGatherer/NewGatherer.cppNewGatherer/NewGathererComp.cpp

You may specify component type as -t option. Valid component types are:

nullsinksource

Other option:-c Don't create directory but create component files in the current directory-f Overwrite exisiting file(s)

2010-08-05 222010年度 DAQ-Middleware講習会

Page 23: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp –t source MyReader

2010-08-05 2010年度 DAQ-Middleware講習会 23

//MyReader.hprivate: TimedOctetSeq m_out_data; OutPort<TimedOctetSeq> m_OutPort;

// MyReader.cpp   CtorMyReader::MyReader(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_OutPort("myreader_out", m_out_data), m_out_status(BUF_SUCCESS),

Page 24: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp –t sink MyMonitor

2010-08-05 2010年度 DAQ-Middleware講習会 24

//MyMonitor.hprivate: TimedOctetSeq m_in_data; InPort<TimedOctetSeq> m_InPort;

//MyMonitor.cpp CtorMyMonitor::MyMonitor(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_InPort("mymonitor_in", m_in_data),

Page 25: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp で入るロジック置き場• source, sink それぞれ典型的な使い方はこ

うだろうと思ったものの空のものが入っている。

• source: read_data_from_detectors()• sink: online_analyze()

2010-08-05 2010年度 DAQ-Middleware講習会 25

Page 26: DAQ-Middleware 講習会 DAQ コンポーネント開発

newcomp誕生までの道のり• 昨年までは Skeleton ファイルをコピーして

とかしていた。マニュアルにもそう書いた(つもりだった)がコマンドがまちがっていました(申し訳ありません)

for i in Skeleton*; do sed -i.bak -e 's/skeleton/mymonitor/' \ -e 's/Skeleton/MyMonitor/' \ -e 's/SKELETON/MYMONITOR/' $i done

2010-08-05 262010年度 DAQ-Middleware講習会

Page 27: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile

• 雛型が作る Makefile に– ソースファイルが増えたら SRCS += として追加

する。– インクルードファイルの場所は CPPFLAGS += で追加する。

– ライブラリファイルは LDLIBS += -L/path/to/lib –lmylib

で追加する。–あとは includeしている comp.mkと implicit ruleが面倒をみる。

2010-08-05 272010年度 DAQ-Middleware講習会

Page 28: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile

2010-08-05 2010年度 DAQ-Middleware講習会 28

COMP_NAME = MyMonitor

all: $(COMP_NAME)Comp

SRCS += $(COMP_NAME).cppSRCS += $(COMP_NAME)Comp.cpp

# sample install target## MODE = 0755# BINDIR = /tmp/mybinary## install: $(COMP_NAME)Comp# mkdir -p $(BINDIR)# install -m $(MODE) $(COMP_NAME)Comp $(BINDIR)

include /usr/share/daqmw/mk/comp.mk

Page 29: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile (implicit rule)

• hello.c があったら Makefile なしでもmake helloで OK

• CFLAGS:• CXXFLAGS:• CPPFLAGS:• LDLIBS: GNU make 。* BSD では LDADD

2010-08-05 292010年度 DAQ-Middleware講習会

Page 30: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile (implicit rule, LDLIBS)

2010-08-05 2010年度 DAQ-Middleware講習会 30

PROG = sampleCFLAGS = -g -O0 -WallLDLIBS += -lm

all: ${PROG}

clean: rm -f *.o ${PROG}

% makecc -g -O0 -Wall sample.c -lm -o sample

Page 31: DAQ-Middleware 講習会 DAQ コンポーネント開発

GNU Make

• Linux にたいてい採用されている GNU Make だと object ファイルを追加していくようだ

all: hello

OBJS += hello.oOBJS += options.oOBJS += help.o

hello: $(OBJS)2010-08-05 312010年度 DAQ-Middleware講習会

Page 32: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile

• ファイルが増えてきて Makefile をアップデートするとき viで:r! ls -1 *.cして ( あるいは ls の出力をコピーアンドペーストして)aaa.cbbb.cccc.cソースファイルを並べて、この先頭に OBJS += を追加。そのあと .cを .o に変更するつもりで、忘れていてmake clean (ソースが消えます)

• SRCS += でソースを追加する方式に変更

2010-08-05 2010年度 DAQ-Middleware講習会 32

Page 33: DAQ-Middleware 講習会 DAQ コンポーネント開発

Makefile自動生成されるファイルの対処

• Makefile• Skeleton.h• Skeleton.cpp• SkeletonComp.cppmake したら自動生成でこれより多い数のソースが出現。めざわりなので自動生成されるファイル群は autogen ディレクトリへ押し込め。2010-08-05 332010年度 DAQ-Middleware講習会

Page 34: DAQ-Middleware 講習会 DAQ コンポーネント開発

DAQ システムの起動• コンフィギュレーションファイルを書く

– 今はまだ GUI がありません(すみません)– サンプルをコピーして手で編集– だいたいここで間違いが入ることがおおいです(だから GUI があ

ればよいんだが。重ねてお詫び申し上げます)。ので/usr/share/daqmw/examples/以下にあるサンプルコンポーネントのコンフィギュレーションは全部 /usr/share/daqmw/conf/ に入れた。

• システム統括は DaqOperator が行いますが、各コンポーネントは既に起動している必要があります

• コンポーネントの起動方法– 手でコマンドラインから起動– ネットワークブート– コンフィギュレーションファイルに execPath があるからこれを読

んでプログラムが起動 (run.py の目的その1)2010-08-05 342010年度 DAQ-Middleware講習会

Page 35: DAQ-Middleware 講習会 DAQ コンポーネント開発

run.py

• 開発中は– DaqOperator をコンソールモードで– 各コンポーネントは local計算機で

起動することが多いかと思うのでここではこの方法だけを扱います

コマンド:   run.py –c –l config.xml

2010-08-05 352010年度 DAQ-Middleware講習会

Page 36: DAQ-Middleware 講習会 DAQ コンポーネント開発

run.py –c –l config.xml 動作説明

• xmllint で引数で指定された config.xml のvalidation を実行 (config.xml のスキーマは/usr/share/daqmw/conf/config.xsd)

• ネームサーバーの起動• config.xml内の execPath からコンポーネントパ

ス名を取得してそれらを起動• 最後に DaqOperator をコンソールモードで起動– コマンドはキーボードから手入力 (http ではない )– 端末に各コンポーネントが扱ったバイト数を表示

2010-08-05 362010年度 DAQ-Middleware講習会

Page 37: DAQ-Middleware 講習会 DAQ コンポーネント開発

runl

• run.py –c –lと同じ動作をする shell script• DAQ-Middleware 1.0.0の配布物には入ってない

• VMware Playerイメージの/home/daq/bin/にひっそりと入っているだけ

2010-08-05 372010年度 DAQ-Middleware講習会

Page 38: DAQ-Middleware 講習会 DAQ コンポーネント開発

開発マニュアルでの例題• いずれもソース、コンフィギュレーションファイルは

/usr/share/daqmw/examples/, /usr/share/daqmw/conf/ の下にあります。

• Skeleton コンポーネントでの状態遷移の確認 ( 17ページ )

• コンポーネント間のデータ通信 (19 ページ)• エミュレータからのデータを読んで ROOT でヒストグ

ラムを書くシステムの開発 (24 ページ )• 上のシステムのコンディションデータベース化 (50

ページ)2010-08-05 382010年度 DAQ-Middleware講習会

Page 39: DAQ-Middleware 講習会 DAQ コンポーネント開発

コンポーネント間のデータ通信 (19 ページ)

• TinySource は適当に数値を入れておくる• TinySink は受け取ったデータを標準エラーに出力する• run.py –cl tiny.xml

で起動したコンポーネントのエラーログは /tmp/daqmw/log.CompName ( CompName はコンポーネント名)に出力される (TinySink のログは /tmp/daqmw/log.TinySink に出力される)

2010-08-05 2010年度 DAQ-Middleware講習会 39

TinySource

TinySink

Daq Operator

Page 40: DAQ-Middleware 講習会 DAQ コンポーネント開発

SampleReader, SampleMonitor

• Emulator からのデータを読んで ROOT でヒストグラムを書く

2010-08-05 2010年度 DAQ-Middleware講習会 40

SampleReader

SampleMonitor

Daq Operator

Emulator

Page 41: DAQ-Middleware 講習会 DAQ コンポーネント開発

Condition データベース

2010-08-05 2010年度 DAQ-Middleware講習会 41

SampleReader

SampleMonitor

Daq Operator

Emulator

XML/JSON

• 装置パラメータ• オンラインモニタ用パラメータ

ランごとにヒストグラムパラメータを決められるように daq_start()でこれを読んでヒストグラムのパラメータを決めるようにする

Page 42: DAQ-Middleware 講習会 DAQ コンポーネント開発

SampleReader, SampleMonitor デモ

• ふつうにデモ• ヒストグラム最小値、最大値を変え

( Condition ファイル)

2010-08-05 2010年度 DAQ-Middleware講習会 42

Page 43: DAQ-Middleware 講習会 DAQ コンポーネント開発

データソースの準備• Emulator を作るとか実機を用意するとか• 今回は emulator を使います。/home/daq/MyDaq/emulator-GEN_GAUSS

2010-08-05 2010年度 DAQ-Middleware講習会 43

Page 44: DAQ-Middleware 講習会 DAQ コンポーネント開発

Emulator の転送レートアルゴリズム• cstream

http://www.cons.org/cracauer/cstream.html

のアルゴリズムをそのまま使用• スタート時刻を gettimeofday() で取得• 一定バイト数 write()• 書き終わったら gettimeofday() で時刻を取得• スタート時刻からの時間経過がわかるのでこれまでの転送

レートがわかる• 書きすぎだったら、どのくらい sleep() したら指定された転

送レートに合わせられるか計算できるのでそのぶん sleep()する

• 書きすぎてなかったら sleep() なしに write() する。2010-08-05 2010年度 DAQ-Middleware講習会 44

Page 45: DAQ-Middleware 講習会 DAQ コンポーネント開発

Emulator の仕様• ./emulator [-t tx_bytes/s] [-b buf_bytes] [-h ip_address]• –デフォルトは t 8k –b 1k (8kB/sec, 1回 1kb)• 数値はm, kのサフィックスが使える• 指定された転送レートをできるだけ守るようにデータを送る• 送ってくるデータフォーマット:

2010-08-05 2010年度 DAQ-Middleware講習会 45

Magic FormatVersion

ModuleNumber Reserved Event

DataEventData

EventData

EventData

Magic: 0x5aFormat Version: 0x01Module Number: 0x00 – 0x07Event Data: 適当にガウシャン風。 100, 200, 300, ... 800 にピークがある。1000倍した整数値で送ってくる。ネットワークバイトオーダー。

Page 46: DAQ-Middleware 講習会 DAQ コンポーネント開発

Emulator の注意• 指定された(あるいはデフォルトの)転

送レートを守るように作ったのでどの実験のデータフローともまったく異なったデータフローになっているはずで実用の意味はあまりないと思う。

2010-08-05 2010年度 DAQ-Middleware講習会 46

Page 47: DAQ-Middleware 講習会 DAQ コンポーネント開発

デモ• 起動して nc で読んでみる

cd /home/daq/MyDaq/emulator-GEN_GAUSS./emulator別の端末で/usr/bin/nc localhost 2222 > data & \(sleep 10; pkill –f /usr/bin/nc)hexdump –vC data

2010-08-05 2010年度 DAQ-Middleware講習会 47