SR-600モードのコマンドのまとめ

概要

SR-3500をSR-600モードで使うコマンドに限ってまとめをしておきます。マニュアルに書いてあることはマニュアルを見てもらうこととして、書いていないこととSR-3500で使う場合の相違点を書くとともに一覧のような役割をもたせます。

SR-600モードと実機の微妙な相違

全部をきちんと調べたわけではないがSR-600モードを使うにあたり問題になった部分を記録する。

セコニック社のサイトの生産・販売終了機種の表によると中型機の変遷は次のようになる。

SR-505 SR-601J SR-607J SR-2300 SR-3500
インターフェース RS-232C RS-232C RS-232C USB
RS-232C(SR600モード)
USB
RS-232C(SR600モード)
センサピッチ 0.3 0.30.25 0.2 0.30.250.21/6 0.30.250.21/6
行数 24 2632 40 27334048 27334048
欄数 70 140 140 80 80(longは140)

USBが使われるようになってコマンド体系が変わった。RS-232Cを使うならSR600モードを使うのだが、SR-3500のマニュアルにはSR600モードのコマンドの説明はなくセコニックのサイトからSR-601JやSR-607Jのマニュアルをダウンロードして調べることになる。

しかしSR-601などとSR-3500の間に機能の差がありそのままでは分からない部分がある。

この設定はコマンドでPC側から操作できるがSR-600シリーズでは電源を切るとディップスイッチの値に戻る。SR-3500では値はスタティックメモリに保存されるらしく電源を入れ直しても保持される。

SR-600モードのコマンド

使用するコマンドはそれほど多くない。マークシートリーダ交換にもSR-505時代のものを書き写した。今回調べたものを若干追加して使うものだけを詳説する。

chr$(&h18)+CR$                          'リセットコマンド 
chr$(&h10)+"L"+CR$ +chr$(&h2)+"32"+CR$  '読み取り行数設定コマンド(12,14,26,32のみ有効)
chr$(&h10)+"T"+CR$ +chr$(&h2)+"2"+CR$   'タイミング形式設定コマンド(直下)
chr$(&h10)+"T"+CR$ +chr$(&h2)+"102"+CR$ 'タイミング形式設定コマンド(制御・先・2倍(def=3))
"?"+CR$                                 'シート送りコマンド(シートを1枚読み,ステータスコードを返す)
chr$(&h5)+"T"+CR$                 'タイミングマーク数確認コマンド 
chr$(&h10)+"E"+"mmm"+"nnn"+CR$          '読み出しコマンド (0-9:;<=>?@A-P可変長形式)
chr$(&h10)+"DL"+"nn"+CR$                '読み取り濃度設定コマンド
chr$(&h10)+"ED"+"mmm"+"nnn"+CR$         '濃度データつき読み出しコマンド (1)
chr$(&h10)+"ES"+"mmm"+"nnn"+CR$         '濃度データつき読み出しコマンド (2)

リセットコマンド

chr$(&h18)+CR$   'CR$はchr$(&hD), &hは16進数の接頭辞です

マニュアルには電源投入時に戻すリセットコマンドとありますが、少なくとも読み取り行数とタイミング形式設定は元に戻りません。

コマンド実行後ACKコードを受け取る必要があります。

CR$=chr$(&hD)
RSCMD$=chr$(&h18)+CR$
PRINT #2,RSCMD$;
s$=input$(1,#2)
print asc(s$);     '06

読み取り行数設定コマンド

chr$(&h10)+"L"+CR$ +chr$(&h2)+"32"+CR$

"32"に行数を指定します。IBMカードなど使用行数の少ない用紙を使うときには"12"などとすれば13行以上のデータは送ってきません。

指定できる行数は12,14,26,32に限られるとあります。

SR-3500はセンサ数が33です。でも、"33"は受け付けられません。"12"にしたあと"33"にすることができず"12"のままになってしまいます。"32"ならできます。SR-600シリーズ用のファームウェアをそのまま搭載しているのでしょう。

33にするには設定パネルからの操作が必要です。32までしか使わないことにするか、33固定で送ってくるデータを無視して使うしかないでしょう。(SR-3500モードでは33に出きるはずです)

33固定で使うことにします。したがってこのコマンドは使いません。

タイミング形式設定コマンド

直下型

タイミングマークと同じ幅を読み取り範囲とします。

chr$(&h10)+"T"+CR$ +chr$(&h2)+"2"+CR$     '1:timing 2:chokka

読み取り範囲が狭いので的確な位置にマークできるよう工夫する必要があります。

タイミングマーク間隔をつめて欄を多くすることができます。

小型のマークカードで棒状のマークを書かせると安定します。(実績があります)

A4サイズでは印刷精度や紙送りの精度がシビアになる可能性があります。(実際の経験があるわけではありません)

楕円のマークの場合全部を塗りつぶすなら問題ありませんが、大きめの楕円に棒状にマークを入れると楕円にかかっているけど直下からは外れるという可能性があります。(塗が薄いとたまに起こります)

タイミング制御型

タイミングマークを認識した後で少し広い幅を読み取り範囲とします。

chr$(&h10)+"T"+CR$ +chr$(&h2)+"103"+CR$   '1:timing 0:saki 2:2bai

"103"のうち"1"がタイミング制御型を表し、"0"が先端型("1"が後端型)、"3"がタイミングマーク幅の3倍の範囲を読み取り幅とするという指定です。

SR-505ではずっとこれでやって来ました。安定しています。楕円のマークですが、棒状に塗っても問題ありません。

マーク間型

タイミングマークの間を読みます。

本校では直下型かタイミング制御型かのどちらかを使っています。マーク間型だとタイミングマークの数とマークの欄の数が一致しない場合があり複雑に感じたのだろうと思います(過去の私がですが)。特にマークの必要部分にだけタイミングマークを入れている場合は面倒です。

いま改めてみると、模擬試験のマークシートではマーク間型を使っているようです。タイミングマークは必要ない部分にも均等に入れて使用しています。これもひとつの見識かもしれません。

シート送りコマンド

"?"+CR$            'シートを1枚読み,エラーコードを返す指示

紙を送って読み取ったデータをOMRのメモリに格納し、1バイトのエラーステータスを返します。

読み取ったデータはこの後、別のコマンドで送信させます。

正常に読み取った場合のエラーステータスは"0"です。表によるとSR-505のときよりも細かな取り決めになっている様子です。変更になっているものもあるようなので移植には注意が必要です。

CR$=chr$(&hD)
RDCMD$="?"+CR$
PRINT #2,RDCMD$;
e1$=input$(1,#2)
print e1$;     '0 (正常な場合)

タイミングマーク数確認コマンド

chr$(&h5)+"T"+CR$

応答は3バイトの文字列で返ってきます。

CR$=chr$(&hD)
TMCMD$=chr$(&h5)+"T"+CR$
PRINT #2,TMCMD$;
mkct$=input$(3,#2)
print mkct$;     '066 (66欄あった場合)

読み出しコマンド

いくつかありますが実際に使っている Eコマンド だけ解説します。

chr$(&h10)+"E"+"mmm"+"nnn"+CR$   'mmmからnnnまでのデータ転送を指示

実際に第1欄から第66欄まで読み出す場合は次のようになります。

すでにシート送りコマンドが送られていなければなりません。

CR$=chr$(&hD)
ECMD$=chr$(&h10)+"E"
PRINT #2,ECMD$;"001";"066";CR$;
FOR T=1 TO 66
    line INPUT #2,SE$(T)
NEXT

もちろんSE$(T)の配列は予め宣言されていなければなりません。

どのようなデータが得られるかはEコマンドで得られるデータですでに解説しています。

タイミングマーク数確認コマンドと組み合わせて使用する場合は、次のようにすればいいでしょう。

CR$=chr$(&hD)
TMCMD$=chr$(&h5)+"T"+CR$
ECMD$ =chr$(&h10)+"E"

PRINT #2,TMCMD$;
mkct$=input$(3,#2)
PRINT #2,ECMD$;"001";mkct$;CR$;
FOR T=1 TO val(mkct$)
    line INPUT #2,SE$(T)
NEXT

読み取り濃度設定コマンド

chr$(&h10)+"DL"+"nn"+CR$   '"01"から"16"までの2バイト文字列

設定パネルでは04に設定されていました。電源を入れなおしてもコマンドで設定したものが保持されると思いますが、確認していません。

CR$=chr$(&hD)
DLCMD$ =chr$(&h10)+"DL"
PRINT #2,DLCMD$;"03";CR$;

これで03~16のレベルのマークをマークとして認識します。04~16より敏感になったという事になります。

濃度データつき読み出しコマンド

読み出しコマンドの E が ED になります。

chr$(&h10)+"ED"+"mmm"+"nnn"+CR$   'mmmからnnnまでのデータ転送を指示

マークが どの行にあったかは 0からP までの1バイトの文字で表されますが、これに1バイトの濃度情報が加わります。

Eコマンドでは ある欄に3つマークされていると3バイト返りますが、EDでは6バイト返ります。

濃度情報は 1から16が "1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@" となるらしい。(マニュアルには2,@しか書いていない)

読み出しコマンドの E が ES になるものもあります。

chr$(&h10)+"ES"+"mmm"+"nnn"+CR$   'mmmからnnnまでのデータ転送を指示

濃度データが別になります。一回目の Line input$ で Eコマンドと同じ出力を得て、2回目の Line input$ で 濃度のデータを得ます。

これらはSR-505の時代にはなかった機能なので移植完了後に拡張していく予定です。そのまえにSR-3500モードで使いたいのですが。


Jan.2012
安達順一
http://www.seiai.ed.jp/