Kinoko Module Driver リファレンス

Toyo CC/NET (ネットワークアクセス)

[注意] このページでは,CC/NET をネットワーク経由で使用する場合を記述しています.CC/NET をローカルに使用する(CC/NET 上に Kinoko をインストールして直接使用する)場合は,「CC/NET (直接アクセス)」を参照してください.

[注意] ここに説明されている内容は,十分にテストされたものではありません.現段階では,KiNOKO の開発の参考として参照してください.
種別Network-CAMAC ブリッジ
製造者東陽テクニカ・KEK (http://www-online.kek.jp/~inoue/para-CAMAC/)
参照名Toyo-CCNET-Remote または KEK-CCNET-Remote
読み出しblockRead()
サービス要求シングル・ポーリング

CC/NET のリモートアクセス機能を使用するためには,CC/NET 上で製品付属のサーバプログラム(ccnet_server)が走っている必要があります.CC/NET 起動時に自動で ccnet_server プログラムが走るように設定しておくと便利です.

CC/NET をネットワーク経由で使用する場合,Kinoko の Network-CAMAC ブリッジとして透過的に CAMAC コントローラとして使用する方法と,独立した NetworkModule として使用する方法があります.前者の場合は,CAMAC トランザクションごとのネットワークオーバーヘッドが大きくなり,性能が出ません.CamacController として使用する場合は,CC/NETを直接使用する方が適しています.後者の場合,データ処理が若干煩雑になりますが,CC/NET のパイプライン実行機能を利用して高速な処理が可能です.

読み出しアクション

以下の読み出しアクションは,NetworkModule として生成したときのみ有効.
executeSingleCamac(int station, int function, int address)
executeSingleCamac(int station, int function, int address, Register data)
executeSingleCamac(int station, int function, int address, Register data, Register q, Register x)
CAMAC のシングルサイクルを実行する.引数に data, q, x が渡されていれば,データ,Q レスポンス,X レスポンスがそれぞれ返される.

executeSingleDaq(int function);
executeSingleDaq(int function, Register data);
executeSingleDaq(int function, Register data, Register status);
DAQ シングルサイクルを実行する.引数に data, status が渡されていれば,データおよびステータスがそれぞれ返される.

initializeCommandBuffer()
コマンドバッファを初期化

loadCamacCommand(int station, int function, int address)
loadCamacCommand(int station, int function, int address, int data)
コマンドバッファに CAMAC コマンドを追加

loadDaqCommand(int function)
loadDaqCommand(int function, int data)
コマンドバッファに DAQ コマンドを追加

execute()
executePio()
executeDma()
executeDmaSequence()
コマンドバッファの内容を実行

blockRead()
execute() により実行した結果を読み出す.データフォーマットは製品付属のライブラリと同じ(pcc.h の cam_extract_XXX() 関数が使える)

読み出しスクリプト例

CC/NET を CAMAC のコントローラとして透過的に扱う例
string host = "ccnet.u-kinoko.ac.jp";
int port = 2003;

datasource NetworkCamacBridge
{
    NetworkCamacBridge controller("TOYO-CCNET-Remote");
    controller.connect(host, port);

    CamacCrate crate;
    CamacModule adc("Rinei-RPC022");

    int adc_station = 8;
    int adc_channels = #0..#3;

    crate.installController(controller);
    crate.installModule(adc, adc_station);

    on trigger(adc) {
	adc.read(adc_channels);
	adc.clear();
    }
}

CC/NET をネットワークモジュールとして使用する例

string host = "ccnet.u-kinoko.ac.jp";
int port = 2003;

datasource CCNET
{
    NetworkModule ccnet("TOYO-CCNET-Remote");
    ccnet.connect(host, port);

    on run_begin {
	// コマンドバッファ初期化 //
	ccnet.initializeCommandBuffer();

	// コマンドリストを構築 //
	int n, f, a;
	ccnet.loadCamacCommand(n = 10, f = 0, a = 0);	// READ
	ccnet.loadCamacCommand(n = 10, f = 0, a = 1);
	ccnet.loadCamacCommand(n = 10, f = 0, a = 2);
	ccnet.loadCamacCommand(n = 10, f = 0, a = 3);

	ccnet.loadCamacCommand(n = 12, f = 0, a = 0);
	ccnet.loadCamacCommand(n = 12, f = 0, a = 1);
	ccnet.loadCamacCommand(n = 12, f = 0, a = 2);
	ccnet.loadCamacCommand(n = 12, f = 0, a = 3);

	ccnet.loadCamacCommand(n = 10, f = 10, a = 0);	// CLEAR LAM
	ccnet.loadCamacCommand(n = 10, f = 9, a = 0);	// CLEAR
	ccnet.loadCamacCommand(n = 12, f = 9, a = 0);
    }

    on trigger(ccnet) {
	// CAMAC トランザクションを実行 //
        ccnet.execute();

	// block 型のデータとして読み出す //
        ccnet.blockRead();
    }
}