Mar 7, 2003 onlpara, Red Hat Linux 8.0 のシステムでのJavaRMIの実行 --- リモートマシンからの camac読み書き #2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/para-CAMAC/ Work/CAMAC-JavaRMI2.html) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 目的 JavaRMIとJNIを使って、リモートマシン onlpara から ターゲットマシン onlsbc1を通してCAMACを読み出すことができた(CAMAC-JavaRMI1.htmlを 参照)。 ここでは、このCAMAC読み出しの例題プログラムをより汎用性を 持ったものに仕上げる。 (1). 構成 (2). リモートマシンonlpara からの任意のCAMACコマンドを実行可能にする (3). コマンド入力を繰り返し実行できるように変更 -------------------------------------------------------------------- (1). 構成 テストに使用するマシンは onlpara と onlsbc1 である。 マシン onlpara は DELL社製のPC, Dimension 4500 で、RedHat Linux 7.3 が動作している。 Java のバージョンは1.4.1 である。 一方 onlsbc1 は、アドバンテク社のSBC、 PCM-9370である。 このSBCは、CAMACコントローラ上に装着されている。 SBC上で動作している OSは Red Hat Linux 8.0 で、コンパクトフラッシュ上に 構成してある。 Javaのバージョンは1.4.1_01 である。 (2). リモートマシンonlpara からの任意のCAMACコマンドを実行可能にする (2-1). サーバ側、onlsbc1.kek.jp (2-1-1). Javaのチェック [inoue@onlsbc1 keyin-21]$ java -version java version "1.4.1_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01) Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode) [inoue@onlsbc1 keyin-21]$ (2-1-2). 実行環境 [inoue@onlsbc1 keyin-21]$ env MANPATH=:/usr/java/man HOSTNAME=onlsbc1.kek.jp TERM=vt100 SHELL=/bin/bash JLESSCHARSET=japanese HISTSIZE=1000 SSH_CLIENT=130.87.153.9 33704 22 SSH_TTY=/dev/pts/0 USER=inoue LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;0 1:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.b tm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31: *.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:* .bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3 5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: MAIL=/var/spool/mail/inoue PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/java/bin:/home/inoue/bin INPUTRC=/etc/inputrc PWD=/home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 LANG=ja_JP.eucJP SHLVL=1 HOME=/home/inoue LOGNAME=inoue LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env OLDPWD=/home/inoue/JavaRMI/CAMAC/Key-in [inoue@onlsbc1 keyin-21]$ (2-1-3). コンパイル [inoue@onlsbc1 keyin-21]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [inoue@onlsbc1 keyin-21]$ ls -l 合計 36 -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-r--r-- 1 inoue inoue 11478 3月 6 16:25 ClientImpl.java -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:25 camac.c -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java [inoue@onlsbc1 keyin-21]$ (2-1-3a). Client.java [inoue@onlsbc1 keyin-21]$ cat Client.java // File Name: Client.java // Date: Feb 19, 2003 // Edited by: Eiji Inoue public interface Client extends java.rmi.Remote { public void camac_reply( int[] ia, int[] ib, int ic) throws java.rmi.Rem oteException; } [inoue@onlsbc1 keyin-21]$ (2-1-3b). ClientImpl.java [inoue@onlsbc1 keyin-21]$ more ClientImpl.java // File Name: ClientImpl.java // Date: Mar 6, 2003 // Edited by: Eiji Inoue import java.io.*; import java.rmi.*; import java.rmi.server.*; class ClientImpl implements Client { public static final int CMD_F16_A0_N3 = 0xE0030010; public static final int CMD_F0_A0_N3 = 0xE0030000; public static final char COM = ','; public static final char QUIT = 'q'; public static final char STAR = 's'; public static int scmd[] = new int[100]; public static int sdat[] = new int[100]; static Server server; public ClientImpl(String host) { try{ UnicastRemoteObject.exportObject(this); Server server = (Server)Naming.lookup("//"+host+"/Server"); server.register(this); ClientImpl.server = server; } catch ( Exception e ) { System.err.println ("Failed to setup for RMI"); } } public void camac_exec( int l_count ) { int[] s_cmd, s_dat; int[] array_sizes = {4096*16}; int s_length; int j; try{ System.out.println(" RMI: Client side: "); // to send int array System.out.println(" RMI: Sent CAMAC command: array le ngth =" + l_count ); for (int i = 0; i < l_count + 1; i++) System.out.println(" ClientImpl.scmd[" + i + "] = 0x" + Integer.toHexString( ClientImpl.scmd[i]) + ", ClientImpl.sdat[" + i + " ] = 0x" + Integer.toHexString( ClientImpl.sdat[i])); ClientImpl.server.camac_cmd(ClientImpl.scmd, ClientImpl. sdat, l_count ); } catch ( Exception e ) { System.err.println ("Failed to setup for RMI step2"); } } public void camac_reply( int[] c_reply, int[] d_reply, int l_reply) thro ws RemoteException { System.out.println(); System.out.println(" RMI: Received CAMAC reply: " + "array len gth = " + l_reply); for (int i = 0; i < l_reply + 1; i++) System.out.println(" c_reply[" + i + "] = 0x" + Integer .toHexString(c_reply[i]) + ", d_reply[" + i + "] = 0x" + Integer.toHexString(d_r eply[i])); } // TX // +---------+-------+-------+-------+-------+---------------------------+ // | cmd | N | A | F | | 24-bit DATA | // +---------+-------+-------+-------+-------+---------------------------+ // // cmd Header pattern // +-------------+---------+---------+---------+---------------+ // | | Packet | Packet | Packet | Single | // | | Start | Period | End | Frame Packet | // +-------------+---------+---------+---------+---------------+ // | CAMAC | | | | | // | Operation | 0xC0 | 0x8C | 0xA0 | 0xE0 | // +-------------+---------+---------+---------+---------------+ // | CAMAC | | | | | // | LAM | -- | -- | -- | 0xE8 | // +-------------+---------+---------+---------+---------------+ // | DAQ Trigger | | | | | // | out | 0xD0 | 0x90 | 0xB0 | 0xF0 | // +-------------+---------+---------+---------+---------------+ // | DAQ | | | | | // | Interrupt | -- | -- | -- | 0xF8 | // +-------------+---------+---------+---------+---------------+ // // CAMAC N. // 55 54 53 52 51 50 49 48 47 32 // +--------------------+----------------+-------------------+---------------+ // | - - - N16 | N8 N4 N2 N1 | | | | | // +--------------------+----------------+-------------------+---------------+ // // CAMAC A. // 47 46 45 44 43 42 41 40 32 // +--------------------+-------------------+----------------+---------------+ // | - - - - | A8 A4 A2 A1 | | | // +--------------------+-------------------+----------------+---------------+ // // CAMAC F. // 39 38 37 36 35 34 33 32 // +--------------------+----------------+------------------+----------------+ // | - - - F16 | F8 F4 F2 F1 | // +--------------------+----------------+------------------+----------------+ // public void cmdbld( int n, int a, int f, int l_count ){ // CAMAC Single action. System.out.println ( " Make up CAMAC Command of Single action." ); System.out.println ( " Accepted data: n = " + n + ", a = " + a + ", f = " + f + ", l_count = " + l_count ); a = a << 8; n = n << 16; ClientImpl.scmd [ l_count -1 ] = 0xE0000000 | ( 0x0000001F & f ) | ( 0x000 00F00 & a ) | ( 0x001F0000 & n ); System.out.println ( " ClientImpl.scmd [ " + ( l_count -1 ) + " ] = " + ClientImpl.scmd [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( ClientI mpl.scmd [ l_count -1 ] ) + "(hex)" ); System.out.println ( " ClientImpl.sdat [ " + ( l_count -1 ) + " ] = " + ClientImpl.sdat [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( ClientI mpl.sdat [ l_count -1 ] ) + "(hex)" ); // CAMAC LAM handling. // CAMAC DMA action. } public void keyincmd() { char cstr[] = new char[20]; char n[] = new char[4]; char a[] = new char[4]; char f[] = new char[4]; int c[] = new int[3]; int i, i2, count, loop, k_error; int spoin, epoin; String cn = "0", ca = "0", cf = "0"; String tmp; String nchk[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", " b", "c", "d", "e", "f" }; InputStream inStream = System.in; InputStreamReader InData = new InputStreamReader ( inStream ); int s_flg = 0; try{ spoin = 0; epoin = 0; loop = 1; k_error = 0; System.out.println ( "" ); System.out.println ( " (1). Enter 'q' to quit." ); System.out.println ( " (2). Enter numerical value to sep up CAMAC comma nd"); System.out.println ( " (3). Enter 's' to start up command execution." ) ; System.out.println ( "" ); do { if ( k_error == 1 ) { System.out.println ( "" ); k_error = 0; } System.out.print ( "Command (N, A, F)(dec) = " ); count = InData.read ( cstr, 0, 19 ); String str = new String ( cstr ); if ( QUIT == str.charAt ( 0 ) ) { s_flg = 2; break; } else if ( STAR == str.charAt ( 0 )) { if ( epoin == 0 ) { System.out.print ( " Command bufer is empty !!"); System.out.println ( "" ); continue; } else { // camacstart(); s_flg = 1; System.out.println( " Ok. Start up CAMAC execution. " ); break; } } tmp = str.substring ( 0, count -1 ); System.out.println ( " 入力されたCommand: " + tmp ); i2 = 0; for ( i = 0; i < str.length(); i++ ) { if ( COM == str.charAt ( i ) ) { c[ i2++ ] = i; } } cn = str.substring ( 0, c[ 0 ] ); ca = str.substring ( c[ 0 ] +1, c[ 1 ] ); cf = str.substring ( c[ 1 ] +1, count-1 ); try{ int in = Integer.parseInt(cn, 10); if ( ( in < 0 ) || ( in > 25 ) ) { System.out.println ( " Command Error: Illegal value of N: O ut of range !! " ); k_error = 1; continue; } int ia = Integer.parseInt(ca, 10); if ( ( ia < 0 ) || ( ia > 15 ) ) { System.out.println ( " Command Error: Illegal value of A: O ut of range !! " ); k_error = 1; continue; } int inf = Integer.parseInt(cf, 10); if ( ( inf < 0 ) || ( inf > 31 ) ) { System.out.println ( " Command Error: Illegal value of F: O ut of range !! " ); k_error = 1; continue; } if ( ( inf >= 16 ) && ( inf <= 23 ) ) { // データ入力要求 int datf = 0; do { System.out.print ( " Write Data(hex) = " ); count = InData.read ( cstr, 0, 19 ); str = new String ( cstr ); String cdat = str.substring ( 0, count -1 ); for ( i = 0; i < count -1; i++) { String cdat1 = cdat.substring ( i, i + 1 ); // numerical check for ( i2 = 0; i2 < 16; i2++ ) { if ( cdat1.equals( nchk [ i2 ] ) ) { datf = 0; break; } datf = 1; } if ( datf == 1 ) { System.out.println ( " Data error: Illegal character - -- " + cdat1 + " !" ); System.out.println ( "" ); break; } } if ( datf == 1) { continue; } ClientImpl.sdat [ loop -1 ] = Integer.parseInt( cdat, 16); System.out.println ( " 入力されたData: " + ClientImpl.sdat [ loop -1 ] + "(dec), 0x" + Integer.toHexString( ClientImpl.sdat [ loop -1 ] ) + "(hex)"); if ( ( ClientImpl.sdat [ loop -1 ] < 0 ) || ( ClientImpl.sdat [ loop -1 ] > 0xffffff ) ) { System.out.println ( " Data error: Out of range --- " + ClientImpl.sdat [ loop -1 ] + " !" ); System.out.println ( "" ); datf = 1; continue; } } while ( datf == 1 ); } // CAMAC command set up. cmdbld ( in, ia, inf, loop ); epoin++; loop++; System.out.println ( "" ); } catch (NumberFormatException e) { System.out.println(" NumberFormatException occurred !!"); System.out.println ( "" ); } } while ( loop > 1 ); if ( s_flg == 1 ) { // System.out.println ( " CAMAC execution. " ); camac_exec( loop -1 ); } else if ( s_flg == 2 ) { System.out.println ( " Quited Program. Enter Ctl-C. " ); } } catch ( IOException e ) { System.out.println ( " IOException Error:" + e + " !"); } } public static void main(String argv[]) throws Exception{ String host = (argv.length == 1) ? argv[0] : "localhost"; ClientImpl obj = new ClientImpl(host); obj.keyincmd(); } } [inoue@onlsbc1 keyin-21]$ (2-1-3c). Server.java [inoue@onlsbc1 keyin-21]$ cat Server.java // File Name: Server.java // Date: Feb 19, 2003 // Edited by: Eiji Inoue import java.rmi.*; public interface Server extends java.rmi.Remote { void register(Client aclient) throws java.rmi.RemoteException; void camac_cmd(int[] ia, int[] ib, int ic) throws RemoteException; } [inoue@onlsbc1 keyin-21]$ (2-1-3d). ServerImpl.java [inoue@onlsbc1 keyin-21]$ more ServerImpl.java // File Name: ServerImpl.java // Date: Feb 19, 2003 // Edited by: Eiji Inoue import java.rmi.*; import java.rmi.server.*; public class ServerImpl extends UnicastRemoteObject implements Server { Client client; static String serverName; static int[] r_cmd, r_dat; static camac p; static { try { serverName = java.net.InetAddress.getLocalHost().getHost Name(); }catch(Exception e){ serverName = "localhost"; } } public ServerImpl() throws Exception { super(); r_cmd = new int[4096*16]; r_dat = new int[4096*16]; p = new camac(); } public void register (Client aclient) { client = aclient; } public void camac_cmd(int[] cmd, int[] dat, int length) throws RemoteExc eption{ System.out.println(" RMI: Server side: "); System.out.println(" RMI: Received CAMAC command: " + "array length = " + length); for (int i = 0; i < length + 1; i++) System.out.println(" cmd[" + i + "] = 0x" + Integer.toHexStr ing(cmd[i]) + ", dat[" + i + "] = 0x" + Integer.toHexString(dat[i])); ServerImpl.r_cmd = cmd; ServerImpl.r_dat = dat; //JNI try{ System.out.println(); System.out.println(" JNI, Java side: before Native Call"); for (int i = 0; i < length + 1; i++) System.out.println(" ServerImpl.r_cmd[" + i + "] = 0x" + Integer.t oHexString(ServerImpl.r_cmd[i]) + ", ServerImpl.r_dat[" + i + "] = 0x" + Integer .toHexString(ServerImpl.r_dat[i])); int sum = ServerImpl.p.cmdArray(ServerImpl.r_cmd, ServerImpl.r_dat, length); System.out.println(); System.out.println(" JNI, Java side: after Native Call" + " array length = " + length); for (int i = 0; i < length + 1; i++) System.out.println(" ServerImpl.r_cmd[" + i + "] = 0x" + Integer.t oHexString(ServerImpl.r_cmd[i]) + ", ServerImpl.r_dat[" + i + "] = 0x" + Integer .toHexString(ServerImpl.r_dat[i])); client.camac_reply (ServerImpl.r_cmd, ServerImpl.r_dat, length); } catch ( Exception e ) { System.err.println ("Failed to exec for camac"); } //JNI end } public static void main(String argv[]) throws Exception { //System.setSecurityManager(new RMISecurityManager()); ServerImpl obj = new ServerImpl(); Naming.bind("//"+serverName+"/Server", obj); System.out.println("bind done"); } } [inoue@onlsbc1 keyin-21]$ (2-1-3e). camac.java [inoue@onlsbc1 keyin-21]$ cat camac.java // File name: camac.java // Date: Feb 19, 2003 // Edited by: Eiji Inoue // // // Parallel camac // packet format of basic camac opeation // TX // +---------+-------+-------+-------+-------+---------------------------+ // | cmd | N | A | F | | 24-bit DATA | // +---------+-------+-------+-------+-------+---------------------------+ // // RX // +---------+-------+-------+-------+-------+---------------------------+ // | rply | N | A | F | ST | 24-bit DATA | // +---------+-------+-------+-------+-------+---------------------------+ public class camac { public native int cmdArray(int j_cmd[], int j_dat[], int j_length); public static void main(String args[]) { camac p = new camac(); } static { System.loadLibrary("MyImpOfcamac"); } } [inoue@onlsbc1 keyin-21]$ (2-1-3f). camac.c [inoue@onlsbc1 keyin-21]$ more camac.c // file name: camac.c // Date: Mar 6, 2003 // Edited by: E.Inoue // // Parallel camac // packet format of basic camac opeation // TX // +---------+-------+-------+-------+-------+---------------------------+ // | cmd | N | A | F | | 24-bit DATA | // +---------+-------+-------+-------+-------+---------------------------+ // // RX // +---------+-------+-------+-------+-------+---------------------------+ // | rply | N | A | F | ST | 24-bit DATA | // +---------+-------+-------+-------+-------+---------------------------+ #include#include #include #include "camac.h" #define BASE 0xE800 #define TX_DATA1REG BASE #define TX_DATA2REG (BASE+4) /* #define TX_STATUSREG (BASE+0x10) */ #define TX_STATUSREG (BASE+0x1c) #define TXSTATUS_BUSY 0x10000 #define TXSTATUS_TIMEOUT 0x20000 #define RX_DATA1REG (BASE+0x20) #define RX_DATA2REG (BASE+0x24) /* #define RX_FIFOREG (BASE+0x30) */ #define RX_FIFOREG (BASE+0x3c) #define CMD_F16_A0_N3 0xE0030010 #define CMD_F0_A0_N3 0xE0030000 unsigned long long int value; unsigned int camac; JNIEXPORT jint JNICALL Java_camac_cmdArray(JNIEnv *env, jobject obj, jintArray r_cmd, jintArray r_dat, jint length) { int i, sum = 0; jsize len = (*env)->GetArrayLength(env, r_cmd); jint *c_cmd = (*env)->GetIntArrayElements(env, r_cmd, 0); jsize len2 = (*env)->GetArrayLength(env, r_dat); jint *c_dat = (*env)->GetIntArrayElements(env, r_dat, 0); int loop = length; int ii, j, data, cmd, value; printf ("\n JNI, C side: Received CAMAC command: "); printf ("array length = %d\n", length); for (i=0; i < length +1; i++) { printf(" c_cmd[%d] = 0x%x, c_dat[%d] = 0x%x\n", i, c_cmd[i], i, c_dat[i]); } if( iopl(3) ){ printf("can not change the privilege level\n"); exit(0); } printf("\n JNI, C side: CAMAC access\n"); for( i = 0; i < loop; i++) { switch (c_cmd[i] & 0x00000018) { // CAMAC Write case 0x00000010 : // 送信可能状態になるまで待つ value = inl(TX_STATUSREG); while (value & TXSTATUS_BUSY) { if (value & TXSTATUS_TIMEOUT) break; value = inl(TX_STATUSREG); } // camac writeコマンド&データをセットして、PCIレジスタに書き込む data = c_dat[i] & 0x00ffffff; outl(data, TX_DATA1REG); outl(CMD_F16_A0_N3, TX_DATA2REG); printf(" camac write data: data = 0x%x\n", data); // camac応答が読み出し可能状態になるまで待つ value = 0; do { value = inl(RX_FIFOREG); // for PCI ROM of new version // value = value >> 24; } while( value < 2 ); // camacからの受信用レジスタを読んで camacからの応答を得る data = inl(RX_DATA1REG); cmd = inl(RX_DATA2REG); printf(" camac write command reply: cmd = 0x%x : d ata = %x\n", cmd, data); c_cmd[i] = cmd; c_dat[i] = data; break; // CAMAC Read case 0x00000000 : // 送信可能状態になるまで待つ value = inl(TX_STATUSREG); while (value & TXSTATUS_BUSY) { if (value & TXSTATUS_TIMEOUT) break; value = inl(TX_STATUSREG); } // camac readコマンド&データをセットして、PCIレジスタに書き込む outl(CMD_F0_A0_N3, TX_DATA2REG); // camac応答が読み出し可能状態になるまで待つ value = 0; do { value = inl(RX_FIFOREG); // for PCI ROM of new version // value = value >> 24; } while( value < 2); // camacからの受信用レジスタを読んで camacからの応答を得る data = inl(RX_DATA1REG); cmd = inl(RX_DATA2REG); data = 0xffffff & data; ii = 0xffffff & c_dat[i]; printf(" camac read command reply: cmd = 0x%x : da ta = 0x%x\n", cmd, data); c_cmd[i] = cmd; c_dat[i] = data; break; // Default default : break; } } (*env)->ReleaseIntArrayElements(env, r_cmd, c_cmd, 0); (*env)->ReleaseIntArrayElements(env, r_dat, c_dat, 0); return sum; } [inoue@onlsbc1 keyin-21]$ (2-1-3g). Makefile [inoue@onlsbc1 keyin-21]$ more Makefile # File Name: Makefile # Date: Mar 4, 2003 # Edited by: Eiji Inoue all : camac.class camac.h libMyImpOfcamac.so Client.class ClientImpl.class Serv er.class ServerImpl.class ClientImpl_Skel.class ClientImpl_Stub.class ServerImpl _Skel.class ServerImpl_Stub.class camac.class: camac.java javac camac.java Client.class: Client.java javac Client.java ClientImpl.class: ClientImpl.java javac ClientImpl.java Server.class: Server.java javac Server.java ServerImpl.class: ServerImpl.java javac ServerImpl.java ClientImpl_Skel.class: ClientImpl.class rmic ClientImpl ServerImpl_Skel.class: ServerImpl.class rmic ServerImpl camac.h: camac.class javah -jni camac libMyImpOfcamac.so: camac.c gcc -O -shared -I/usr/java/include -I/usr/java/include/linux camac.c -o libMyImpOfcamac.so clean: rm -f *.class camac.h libMyImpOfcamac.so *.o core *~ [inoue@onlsbc1 keyin-21]$ (2-1-3h). 上記のソースプログラムをコンパイルする [inoue@onlsbc1 keyin-21]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [inoue@onlsbc1 keyin-21]$ ls -l 合計 36 -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-r--r-- 1 inoue inoue 11478 3月 6 16:25 ClientImpl.java -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:25 camac.c -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java [inoue@onlsbc1 keyin-21]$ [inoue@onlsbc1 keyin-21]$ make clean rm -f *.class camac.h libMyImpOfcamac.so *.o core *~ [inoue@onlsbc1 keyin-21]$ make javac camac.java javah -jni camac gcc -O -shared -I/usr/java/include -I/usr/java/include/linux camac.c -o libMyImp Ofcamac.so javac Client.java javac ClientImpl.java javac ServerImpl.java rmic ClientImpl rmic ServerImpl [inoue@onlsbc1 keyin-21]$ ls -l 合計 88 -rw-rw-r-- 1 inoue inoue 202 3月 7 15:35 Client.class -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-rw-r-- 1 inoue inoue 5783 3月 7 15:35 ClientImpl.class -rw-r--r-- 1 inoue inoue 11478 3月 6 16:25 ClientImpl.java -rw-rw-r-- 1 inoue inoue 1689 3月 7 15:36 ClientImpl_Skel.class -rw-rw-r-- 1 inoue inoue 3046 3月 7 15:36 ClientImpl_Stub.class -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-rw-r-- 1 inoue inoue 243 3月 7 15:35 Server.class -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-rw-r-- 1 inoue inoue 2429 3月 7 15:35 ServerImpl.class -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 1939 3月 7 15:36 ServerImpl_Skel.class -rw-rw-r-- 1 inoue inoue 3477 3月 7 15:36 ServerImpl_Stub.class -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:25 camac.c -rw-rw-r-- 1 inoue inoue 449 3月 7 15:35 camac.class -rw-rw-r-- 1 inoue inoue 391 3月 7 15:35 camac.h -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java -rwxrwxr-x 1 inoue inoue 6984 3月 7 15:35 libMyImpOfcamac.so [inoue@onlsbc1 keyin-21]$ (2-2). クライアント側、onlpara.kek.jp のソース (2-2-1). コンパイル [inoue@onlpara keyin-21]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [inoue@onlpara keyin-21]$ ls -l 合計 36 -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-r--r-- 1 inoue inoue 11478 3月 6 16:08 ClientImpl.java -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:09 camac.c -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java [inoue@onlpara keyin-21]$ (2-2-1a). Client.java 上記の項目(2-1-3a)を参照。 (2-2-1b). ClientImpl.java 上記の項目(2-1-3b)を参照。 (2-2-1c). Server.java 上記の項目(2-1-3c)を参照。 (2-2-1d). ServerImpl.java 上記の項目(2-1-3d)を参照。 (2-2-1e). camac.java 上記の項目(2-1-3e)を参照。 (2-2-1f). camac.c 上記の項目(2-1-3f)を参照。 (2-2-1g). Makefile 上記の項目(2-1-3g)を参照。 (2-2-1h). コンパイル [inoue@onlpara keyin-21]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [inoue@onlpara keyin-21]$ ls -l 合計 36 -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-r--r-- 1 inoue inoue 11478 3月 6 16:08 ClientImpl.java -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:09 camac.c -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java [inoue@onlpara keyin-21]$ [inoue@onlpara keyin-21]$ make clean rm -f *.class camac.h libMyImpOfcamac.so *.o core *~ [inoue@onlpara keyin-21]$ make javac camac.java javah -jni camac gcc -O -shared -I/usr/java/include -I/usr/java/include/linux camac.c -o libMyImp Ofcamac.so javac Client.java javac ClientImpl.java javac ServerImpl.java rmic ClientImpl rmic ServerImpl [inoue@onlpara keyin-21]$ ls -l 合計 88 -rw-rw-r-- 1 inoue inoue 202 3月 7 15:26 Client.class -rw-rw-r-- 1 inoue inoue 213 3月 6 16:00 Client.java -rw-rw-r-- 1 inoue inoue 5783 3月 7 15:26 ClientImpl.class -rw-r--r-- 1 inoue inoue 11478 3月 6 16:08 ClientImpl.java -rw-rw-r-- 1 inoue inoue 1689 3月 7 15:26 ClientImpl_Skel.class -rw-rw-r-- 1 inoue inoue 3046 3月 7 15:26 ClientImpl_Stub.class -rw-rw-r-- 1 inoue inoue 853 3月 6 16:00 Makefile -rw-rw-r-- 1 inoue inoue 243 3月 7 15:26 Server.class -rw-r--r-- 1 inoue inoue 288 3月 6 16:00 Server.java -rw-rw-r-- 1 inoue inoue 2429 3月 7 15:26 ServerImpl.class -rw-r--r-- 1 inoue inoue 2417 3月 6 16:00 ServerImpl.java -rw-rw-r-- 1 inoue inoue 1939 3月 7 15:26 ServerImpl_Skel.class -rw-rw-r-- 1 inoue inoue 3477 3月 7 15:26 ServerImpl_Stub.class -rw-rw-r-- 1 inoue inoue 3846 3月 6 16:09 camac.c -rw-rw-r-- 1 inoue inoue 449 3月 7 15:26 camac.class -rw-rw-r-- 1 inoue inoue 391 3月 7 15:26 camac.h -rw-rw-r-- 1 inoue inoue 828 3月 6 16:00 camac.java -rwxrwxr-x 1 inoue inoue 6659 3月 7 15:26 libMyImpOfcamac.so [inoue@onlpara keyin-21]$ (2-3). サーバ側のプログラムの起動 onlsbc1 のSBCからPCIへアクセスする前に、PCIのシステムレジスタに 1を書き 込んで CAMAC 用の FPGA をイニシャライズしないと CAMACにアクセスできない ようになっている。 今回のテストに使用しているネイティブコードには、この ための操作は含んでいない。 したがって、サーバ側のプログラムを起動する前 に手動でこの操作をする必要がある。 これは、以下の一行のコマンドで行う。 # ./w e840 1 [root@onlsbc1 keyin-21]# pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [root@onlsbc1 keyin-21]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH [root@onlsbc1 keyin-21]# rmiregistry & [1] 1280 [root@onlsbc1 keyin-21]# java ServerImpl bind done RMI: Server side: RMI: Received CAMAC command: array length = 6 cmd[0] = 0xe0030010, dat[0] = 0x0 cmd[1] = 0xe0030000, dat[1] = 0x0 cmd[2] = 0xe0030010, dat[2] = 0xabcdef cmd[3] = 0xe0030000, dat[3] = 0x0 cmd[4] = 0xe0030010, dat[4] = 0x567483 cmd[5] = 0xe0030000, dat[5] = 0x0 cmd[6] = 0x0, dat[6] = 0x0 JNI, Java side: before Native Call ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x0 ServerImpl.r_cmd[1] = 0xe0030000, ServerImpl.r_dat[1] = 0x0 ServerImpl.r_cmd[2] = 0xe0030010, ServerImpl.r_dat[2] = 0xabcdef ServerImpl.r_cmd[3] = 0xe0030000, ServerImpl.r_dat[3] = 0x0 ServerImpl.r_cmd[4] = 0xe0030010, ServerImpl.r_dat[4] = 0x567483 ServerImpl.r_cmd[5] = 0xe0030000, ServerImpl.r_dat[5] = 0x0 ServerImpl.r_cmd[6] = 0x0, ServerImpl.r_dat[6] = 0x0 JNI, C side: Received CAMAC command: array length = 6 c_cmd[0] = 0xe0030010, c_dat[0] = 0x0 c_cmd[1] = 0xe0030000, c_dat[1] = 0x0 c_cmd[2] = 0xe0030010, c_dat[2] = 0xabcdef c_cmd[3] = 0xe0030000, c_dat[3] = 0x0 c_cmd[4] = 0xe0030010, c_dat[4] = 0x567483 c_cmd[5] = 0xe0030000, c_dat[5] = 0x0 c_cmd[6] = 0x0, c_dat[6] = 0x0 JNI, C side: CAMAC access camac write data: data = 0x0 camac write command reply: cmd = 0xe0030010 : data = 23000000 camac read command reply: cmd = 0xe0030000 : data = 0x0 camac write data: data = 0xabcdef camac write command reply: cmd = 0xe0030010 : data = 23000000 camac read command reply: cmd = 0xe0030000 : data = 0xabcdef camac write data: data = 0x567483 camac write command reply: cmd = 0xe0030010 : data = 23000000 camac read command reply: cmd = 0xe0030000 : data = 0x567483 JNI, Java side: after Native Call array length = 6 ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x23000000 ServerImpl.r_cmd[1] = 0xe0030000, ServerImpl.r_dat[1] = 0x0 ServerImpl.r_cmd[2] = 0xe0030010, ServerImpl.r_dat[2] = 0x23000000 ServerImpl.r_cmd[3] = 0xe0030000, ServerImpl.r_dat[3] = 0xabcdef ServerImpl.r_cmd[4] = 0xe0030010, ServerImpl.r_dat[4] = 0x23000000 ServerImpl.r_cmd[5] = 0xe0030000, ServerImpl.r_dat[5] = 0x567483 ServerImpl.r_cmd[6] = 0x0, ServerImpl.r_dat[6] = 0x0 [root@onlsbc1 keyin-21]# kill -KILL 1280 [root@onlsbc1 keyin-21]# [1]+ 強制終了 rmiregistry [root@onlsbc1 keyin-21]# (2-4). クライアント側のプログラムの起動 [inoue@onlpara keyin-21]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-21 [inoue@onlpara keyin-21]$ rmiregistry & [1] 30910 [inoue@onlpara keyin-21]$ java ClientImpl onlsbc1 (1). Enter 'q' to quit. (2). Enter numerical value to sep up CAMAC command (3). Enter 's' to start up command execution. Command (N, A, F)(dec) = 3,0,16 入力されたCommand: 3,0,16 Write Data(hex) = 0 入力されたData: 0(dec), 0x0(hex) Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 16, l_count = 1 ClientImpl.scmd [ 0 ] = -536674288(dec), 0xe0030010(hex) ClientImpl.sdat [ 0 ] = 0(dec), 0x0(hex) Command (N, A, F)(dec) = 3,0,0 入力されたCommand: 3,0,0 Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 0, l_count = 2 ClientImpl.scmd [ 1 ] = -536674304(dec), 0xe0030000(hex) ClientImpl.sdat [ 1 ] = 0(dec), 0x0(hex) Command (N, A, F)(dec) = 3,0,16 入力されたCommand: 3,0,16 Write Data(hex) = abcdef 入力されたData: 11259375(dec), 0xabcdef(hex) Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 16, l_count = 3 ClientImpl.scmd [ 2 ] = -536674288(dec), 0xe0030010(hex) ClientImpl.sdat [ 2 ] = 11259375(dec), 0xabcdef(hex) Command (N, A, F)(dec) = 3,0,0 入力されたCommand: 3,0,0 Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 0, l_count = 4 ClientImpl.scmd [ 3 ] = -536674304(dec), 0xe0030000(hex) ClientImpl.sdat [ 3 ] = 0(dec), 0x0(hex) Command (N, A, F)(dec) = 3,0,16 入力されたCommand: 3,0,16 Write Data(hex) = 567483 入力されたData: 5665923(dec), 0x567483(hex) Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 16, l_count = 5 ClientImpl.scmd [ 4 ] = -536674288(dec), 0xe0030010(hex) ClientImpl.sdat [ 4 ] = 5665923(dec), 0x567483(hex) Command (N, A, F)(dec) = 3,0,0 入力されたCommand: 3,0,0 Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 0, l_count = 6 ClientImpl.scmd [ 5 ] = -536674304(dec), 0xe0030000(hex) ClientImpl.sdat [ 5 ] = 0(dec), 0x0(hex) Command (N, A, F)(dec) = s Ok. Start up CAMAC execution. RMI: Client side: RMI: Sent CAMAC command: array length =6 ClientImpl.scmd[0] = 0xe0030010, ClientImpl.sdat[0] = 0x0 ClientImpl.scmd[1] = 0xe0030000, ClientImpl.sdat[1] = 0x0 ClientImpl.scmd[2] = 0xe0030010, ClientImpl.sdat[2] = 0xabcdef ClientImpl.scmd[3] = 0xe0030000, ClientImpl.sdat[3] = 0x0 ClientImpl.scmd[4] = 0xe0030010, ClientImpl.sdat[4] = 0x567483 ClientImpl.scmd[5] = 0xe0030000, ClientImpl.sdat[5] = 0x0 ClientImpl.scmd[6] = 0x0, ClientImpl.sdat[6] = 0x0 RMI: Received CAMAC reply: array length = 6 c_reply[0] = 0xe0030010, d_reply[0] = 0x23000000 c_reply[1] = 0xe0030000, d_reply[1] = 0x0 c_reply[2] = 0xe0030010, d_reply[2] = 0x23000000 c_reply[3] = 0xe0030000, d_reply[3] = 0xabcdef c_reply[4] = 0xe0030010, d_reply[4] = 0x23000000 c_reply[5] = 0xe0030000, d_reply[5] = 0x567483 c_reply[6] = 0x0, d_reply[6] = 0x0 [inoue@onlpara keyin-21]$ kill -KILL 30910 [inoue@onlpara keyin-21]$ [1]+ Killed rmiregistry [inoue@onlpara keyin-21]$ ok. キーボードから入力した任意のCAMACコマンドをリモートマシンから CAMACコントローラ上のターゲットマシンに送信して、CAMACアクセスを実行し 実行結果のリプライをリモートマシン側へ送り返した。 正常に実行できた。 (3). コマンド入力を繰り返し実行できるように変更 現在のプログラムは、CAMACコマンド群を入力して一度実行するとそこで 終わってしまう。 再度、コマンド入力のところから繰り返し実行できるように したほうが実用的と思う。 そのように変更する。 (3-1). ClientImpl.javaプログラムの修正 [inoue@onlpara keyin-22]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-22 [inoue@onlpara keyin-22]$ ls -l 合計 36 -rw-rw-r-- 1 inoue inoue 213 3月 7 15:51 Client.java -rw-r--r-- 1 inoue inoue 11491 3月 7 15:59 ClientImpl.java -rw-rw-r-- 1 inoue inoue 853 3月 7 15:51 Makefile -rw-r--r-- 1 inoue inoue 288 3月 7 15:51 Server.java -rw-r--r-- 1 inoue inoue 2417 3月 7 15:51 ServerImpl.java -rw-rw-r-- 1 inoue inoue 3846 3月 7 15:51 camac.c -rw-rw-r-- 1 inoue inoue 828 3月 7 15:51 camac.java [inoue@onlpara keyin-22]$ [inoue@onlpara keyin-22]$ vi ClientImpl.java : public void camac_reply( int[] c_reply, int[] d_reply, int l_reply) thro ws RemoteException { System.out.println(); System.out.println(" RMI: Received CAMAC reply: " + "array len gth = " + l_reply); for (int i = 0; i < l_reply + 1; i++) System.out.println(" c_reply[" + i + "] = 0x" + Integer .toHexString(c_reply[i]) + ", d_reply[" + i + "] = 0x" + Integer.toHexString(d_r eply[i])); keyincmd(); } : [inoue@onlpara keyin-22]$ (3-2). コンパイル [inoue@onlpara keyin-22]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-22 [inoue@onlpara keyin-22]$ make clean rm -f *.class camac.h libMyImpOfcamac.so *.o core *~ [inoue@onlpara keyin-22]$ make javac camac.java javah -jni camac gcc -O -shared -I/usr/java/include -I/usr/java/include/linux camac.c -o libMyImp Ofcamac.so javac Client.java javac ClientImpl.java javac ServerImpl.java rmic ClientImpl rmic ServerImpl [inoue@onlpara keyin-22]$ (3-3). 実行 (3-3-1). サーバ側のプログラムの起動 ot@onlsbc1 keyin-22]# pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-22 [root@onlsbc1 keyin-22]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH [root@onlsbc1 keyin-22]# rmiregistry & [1] 1540 [root@onlsbc1 keyin-22]# java ServerImpl bind done RMI: Server side: RMI: Received CAMAC command: array length = 1 cmd[0] = 0xe0030010, dat[0] = 0x0 cmd[1] = 0x0, dat[1] = 0x0 JNI, Java side: before Native Call ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x0 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 JNI, C side: Received CAMAC command: array length = 1 c_cmd[0] = 0xe0030010, c_dat[0] = 0x0 c_cmd[1] = 0x0, c_dat[1] = 0x0 JNI, C side: CAMAC access camac write data: data = 0x0 camac write command reply: cmd = 0xe0030010 : data = 23000000 JNI, Java side: after Native Call array length = 1 ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x23000000 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 RMI: Server side: RMI: Received CAMAC command: array length = 1 cmd[0] = 0xe0030010, dat[0] = 0x555555 cmd[1] = 0x0, dat[1] = 0x0 JNI, Java side: before Native Call ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x555555 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 JNI, C side: Received CAMAC command: array length = 1 c_cmd[0] = 0xe0030010, c_dat[0] = 0x555555 c_cmd[1] = 0x0, c_dat[1] = 0x0 JNI, C side: CAMAC access camac write data: data = 0x555555 camac write command reply: cmd = 0xe0030010 : data = 23000000 JNI, Java side: after Native Call array length = 1 ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x23000000 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 RMI: Server side: RMI: Received CAMAC command: array length = 1 cmd[0] = 0xe0030000, dat[0] = 0x555555 cmd[1] = 0x0, dat[1] = 0x0 JNI, Java side: before Native Call ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0x555555 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 JNI, C side: Received CAMAC command: array length = 1 c_cmd[0] = 0xe0030000, c_dat[0] = 0x555555 c_cmd[1] = 0x0, c_dat[1] = 0x0 JNI, C side: CAMAC access camac read command reply: cmd = 0xe0030000 : data = 0x555555 JNI, Java side: after Native Call array length = 1 ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0x555555 ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0 [root@onlsbc1 keyin-22]# kill -KILL 1540 [root@onlsbc1 keyin-22]# [1]+ 強制終了 rmiregistry [root@onlsbc1 keyin-22]# (3-3-2). クライアント側のプログラムの起動 [inoue@onlpara keyin-22]$ pwd /home/inoue/JavaRMI/CAMAC/Key-in/keyin-22 [inoue@onlpara keyin-22]$ rmiregistry & [1] 31210 [inoue@onlpara keyin-22]$ java ClientImpl onlsbc1 (1). Enter 'q' to quit. (2). Enter numerical value to sep up CAMAC command (3). Enter 's' to start up command execution. Command (N, A, F)(dec) = 3,0,16 入力されたCommand: 3,0,16 Write Data(hex) = 0 入力されたData: 0(dec), 0x0(hex) Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 16, l_count = 1 ClientImpl.scmd [ 0 ] = -536674288(dec), 0xe0030010(hex) ClientImpl.sdat [ 0 ] = 0(dec), 0x0(hex) Command (N, A, F)(dec) = s Ok. Start up CAMAC execution. RMI: Client side: RMI: Sent CAMAC command: array length =1 ClientImpl.scmd[0] = 0xe0030010, ClientImpl.sdat[0] = 0x0 ClientImpl.scmd[1] = 0x0, ClientImpl.sdat[1] = 0x0 RMI: Received CAMAC reply: array length = 1 c_reply[0] = 0xe0030010, d_reply[0] = 0x23000000 c_reply[1] = 0x0, d_reply[1] = 0x0 (1). Enter 'q' to quit. (2). Enter numerical value to sep up CAMAC command (3). Enter 's' to start up command execution. Command (N, A, F)(dec) = 3,0,16 入力されたCommand: 3,0,16 Write Data(hex) = 555555 入力されたData: 5592405(dec), 0x555555(hex) Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 16, l_count = 1 ClientImpl.scmd [ 0 ] = -536674288(dec), 0xe0030010(hex) ClientImpl.sdat [ 0 ] = 5592405(dec), 0x555555(hex) Command (N, A, F)(dec) = s Ok. Start up CAMAC execution. RMI: Client side: RMI: Sent CAMAC command: array length =1 ClientImpl.scmd[0] = 0xe0030010, ClientImpl.sdat[0] = 0x555555 ClientImpl.scmd[1] = 0x0, ClientImpl.sdat[1] = 0x0 RMI: Received CAMAC reply: array length = 1 c_reply[0] = 0xe0030010, d_reply[0] = 0x23000000 c_reply[1] = 0x0, d_reply[1] = 0x0 (1). Enter 'q' to quit. (2). Enter numerical value to sep up CAMAC command (3). Enter 's' to start up command execution. Command (N, A, F)(dec) = 3,0,0 入力されたCommand: 3,0,0 Make up CAMAC Command of Single action. Accepted data: n = 3, a = 0, f = 0, l_count = 1 ClientImpl.scmd [ 0 ] = -536674304(dec), 0xe0030000(hex) ClientImpl.sdat [ 0 ] = 5592405(dec), 0x555555(hex) Command (N, A, F)(dec) = s Ok. Start up CAMAC execution. RMI: Client side: RMI: Sent CAMAC command: array length =1 ClientImpl.scmd[0] = 0xe0030000, ClientImpl.sdat[0] = 0x555555 ClientImpl.scmd[1] = 0x0, ClientImpl.sdat[1] = 0x0 RMI: Received CAMAC reply: array length = 1 c_reply[0] = 0xe0030000, d_reply[0] = 0x555555 c_reply[1] = 0x0, d_reply[1] = 0x0 (1). Enter 'q' to quit. (2). Enter numerical value to sep up CAMAC command (3). Enter 's' to start up command execution. Command (N, A, F)(dec) = q Quited Program. Enter Ctl-C. [inoue@onlpara keyin-22]$ kill -KILL 31210 [inoue@onlpara keyin-22]$ [1]+ Killed rmiregistry [inoue@onlpara keyin-22]$ ok. 一旦CAMACコマンドを実行した後、再度コマンド入力のところから繰り返す ようにできた。 正常に実行できている。 ---xxxx