| 1 | = Aloka ポータブルエリアモニタ MAR-783 制御方法 = |
| 2 | |
| 3 | == 接続 == |
| 4 | |
| 5 | RS-422が製品のデフォルトらしいが、今回の製品はRS-232C版なので、MOXAのEther-Serialコンバータで接続する。[[br]] |
| 6 | |
| 7 | * ケーブル: D-Sub 9pin クロス |
| 8 | |
| 9 | |
| 10 | || baud rate || 9600 || |
| 11 | || parity || even || |
| 12 | || data bits || 7 || |
| 13 | || stop bits || 2 || |
| 14 | || flow ctrl || none || |
| 15 | |
| 16 | |
| 17 | RS-422版をRS-232版へ変更するには、内部基板のコネクタを付け替えて、メニューから制御方法の設定を変更するだけでOK。 |
| 18 | |
| 19 | [[Image(Aloka_rs232.png)]] |
| 20 | |
| 21 | RS-422版は画像のJ4 RS422のコネクタにケーブルがつながっているので、J5 RS232に繋ぎ直す。[[br]] |
| 22 | その後、フロントパネルから、システム設定モードに入って、RS OUTの設定をRS232Cに変更する。設定方法の詳細は[aloka_MAR783.pdf マニュアル]を参照。 |
| 23 | |
| 24 | |
| 25 | == データフォーマット == |
| 26 | |
| 27 | データの送受信はバイナリコマンドで行う。[[br]] |
| 28 | 詳しくは[aloka_MAR783.pdf マニュアル]の6章に書いてあるが、基本的には以下のフォーマットを実装するだけでOKみたい。 |
| 29 | |
| 30 | * 測定値要求コマンド |
| 31 | |
| 32 | 送信 |
| 33 | |
| 34 | || 項目名 || 型 || サイズ(byte) || 説明 || |
| 35 | || STX || 文字列 || 1 || 0x02固定 || |
| 36 | || コマンド || 文字列 || 2 || R0 || |
| 37 | || ETX || 文字列 || 1 || 0x03固定 || |
| 38 | |
| 39 | 受信 |
| 40 | |
| 41 | || 項目名 || 型 || サイズ(byte) || 説明 || |
| 42 | || STX || 文字列 || 1 || 0x02固定 || |
| 43 | || コマンド || 文字列 || 2 || D0 || |
| 44 | || 測定値1 || 文字列 || 4 || 測定値の小数点以下 || |
| 45 | || 測定値2 || 文字列 || 1 || 測定値の10のべき乗 || |
| 46 | || 状態コード || 文字列 || 1 || 状態コード || |
| 47 | || ダミー || 文字列 || 1 || 0x31固定 || |
| 48 | || ETX || 文字列 || 1 || 0x03固定 || |
| 49 | |
| 50 | |
| 51 | 取得したデータは、(0.測定値1 * (10^測定値2^)) uSv/h となる。 |
| 52 | |
| 53 | 例として 測定値1が "0998"、測定値2が "1" とすると、 |
| 54 | |
| 55 | 0.0998 * 10^1^ = 0.998 uSv/h |
| 56 | |
| 57 | となる。 |
| 58 | |
| 59 | |
| 60 | == サンプルスクリプト == |
| 61 | |
| 62 | {{{ |
| 63 | #!/usr/bin/python |
| 64 | import socket |
| 65 | import struct, binascii |
| 66 | |
| 67 | host = '172.28.5.253' |
| 68 | port = 4001 |
| 69 | |
| 70 | clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 71 | clientsock.connect((host,port)) |
| 72 | |
| 73 | sendVal = (0x02, 'R0', 0x03) |
| 74 | |
| 75 | ss = struct.Struct('b 2s b') |
| 76 | ssp = ss.pack(*sendVal) |
| 77 | |
| 78 | print 'Send bin: ' + binascii.hexlify(ssp) |
| 79 | |
| 80 | clientsock.sendall(ssp) |
| 81 | rcvp = clientsock.recv(1024) |
| 82 | |
| 83 | print 'Recv bin: ' + binascii.hexlify(rcvp) |
| 84 | |
| 85 | rs = struct.Struct('b 2s 4s c c c b') |
| 86 | |
| 87 | print 'Recv pack: ' + str(rs.unpack(rcvp)) |
| 88 | |
| 89 | clientsock.close() |
| 90 | |
| 91 | }}} |
| 92 | |
| 93 | このスクリプトを実行すると以下の様な結果が出力される。 |
| 94 | |
| 95 | {{{ |
| 96 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 97 | Send bin: 02523003 |
| 98 | Recv bin: 0244303130363830363103 |
| 99 | Recv pack: (2, 'D0', '1068', '0', '6', '1', 3) |
| 100 | |
| 101 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 102 | Send bin: 02523003 |
| 103 | Recv bin: 0244303039353930363103 |
| 104 | Recv pack: (2, 'D0', '0959', '0', '6', '1', 3) |
| 105 | |
| 106 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 107 | Send bin: 02523003 |
| 108 | Recv bin: 0244303039353230363103 |
| 109 | Recv pack: (2, 'D0', '0952', '0', '6', '1', 3) |
| 110 | |
| 111 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 112 | Send bin: 02523003 |
| 113 | Recv bin: 0244303039343530363103 |
| 114 | Recv pack: (2, 'D0', '0945', '0', '6', '1', 3) |
| 115 | |
| 116 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 117 | Send bin: 02523003 |
| 118 | Recv bin: 0244303039333830363103 |
| 119 | Recv pack: (2, 'D0', '0938', '0', '6', '1', 3) |
| 120 | |
| 121 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 122 | Send bin: 02523003 |
| 123 | Recv bin: 0244303039333830363103 |
| 124 | Recv pack: (2, 'D0', '0938', '0', '6', '1', 3) |
| 125 | |
| 126 | [michkawa@pfrproc4 test]$ ./testClient.py |
| 127 | Send bin: 02523003 |
| 128 | Recv bin: 0244303037333230363103 |
| 129 | Recv pack: (2, 'D0', '0732', '0', '6', '1', 3) |
| 130 | |
| 131 | }}} |