= GRAPHTEC GL820(GL840)用EPICS IOC = '''この情報は、昔書いたwikiを転載し加筆したものですので、情報が古いかもしれません。ご注意ください。''' 作成当初は、通信プロトコルのマニュアルがメーカーWeb等に存在しなかったので、GL820本体のデータ表示用Web画面を解析してデータを分離するpythonスクリプトで対応していた。[[br]] メーカーに問い合わせたところ通信マニュアルが入手できたので、asynPortDriverを使ってIOCを再構築した。[[br]] '''現在は、GL-820は廃番で、後継機のGL-840になっている。[[br]] GL-840での動作検証を行って、同じIOC(コマンド)で動作することを確認した。[[br]] ''' == 通信プロトコル == 制御コマンド自体はGPIB形式なのだが出力される一部のデータがバイナリなので、streamdeviceではなくasynPortDriverを使うことにした。[[br]] 制御コマンド用のポート番号は {{{8023}}} でコネクションは1つだけと'''イーサネット共通取り扱い説明書'''に記載されていた。[[br]] 今回実装するコマンドは、最低限必要な各チャネルの測定係数(単位)/モードと瞬時値を取得するコマンドだけにしておく。値の設定や保存してあるバッファを取得するコマンドもあるが今回は割愛。[[br]] || コマンド || 説明 || || :MEAS:OUTP:ONE? || 瞬時値取得 || || :AMP:CHxx:INP? || チャネル毎の入力状態取得 || || :AMP:CHxx:RANG? || チャネル毎のモードと係数取得 || 各コマンドの戻り値は、データ受信関連仕様書(GL220_820).pdfに記載されているが、今回使用するデータフォーマットを記述しておく。[[br]] '''(注)データ受信関連仕様書(GL220_820).pdfが公開不可とのことです。''' == 受信データフォーマット == 瞬時値データの戻り値はバイナリ、それ以外はASCII文字列。 === 瞬時値データ(:MEAS:OUTP:ONE?) === GL820ではデータの受信フォーマットは以下のようになる。[[br]] 2byteデータ(binary)はbig endian[[br]] || データ || byte数 || 型 || 説明 || || !#6 || 2 || ASCII ||ヘッダ !#6 固定文字列 || || !**!**!** || 6 || ASCII ||データ長 || || CH1 アナログデータ || 2 || SHORT || CH1 データ || || : || || || || || CH20 アナログデータ || 2 || SHORT || CH20 データ || || パルス1~4データ1~2 || 16 || SHORT![2]![4] || パルスデータ(使用しない) || || ロジックデータ || 2 || SHORT || ロジックデータ(使用しない) || || アラームデータ1 || 2 || SHORT || CH1~10アラームデータ(使用しない) || || アラームデータ2 || 2 || SHORT || CH11~20アラームデータ(使用しない) || || アラームデータ(ロジック・パルス)|| 2 || SHORT || ロジック・パルスのアラームデータ(使用しない) || || アラーム出力データ || 2 || SHORT || アラーム出力データ(使用しない) || || ステータス || 2 || SHORT || データ状態(使用しない) || 今回、受信データで使用するのはCH1~20までのアナログデータのみで、アラームやパルス、ロジックのデータは使用しない。[[br]] CHデータ数は、HW本体のCH数によって変動するらしいが、CH数を増やしたHWがないため、今回は20CH固定で作成した。[[br]] 今後、多CHのHWを使用する場合には、ソースコードを修正する必要がある。[[br]] CH数は、drvGL820_Cmnd.h の PORT_COUNT として定義しているので、ここだけの修正でsrc側はOKのはず。[[br]] GL840では、GL820とはフォーマットが変更されたようだ。[[br]] GL820ではデータ長が76byteだったが、GL840では56byteになっている。[[br]] データフォーマットの仕様書を確認したわけではないが、ロジックデータとパルスデータを除外すると、GL840のデータ長と一致するので、多分こうなっていると思われる。 || データ || byte数 || 型 || 説明 || || !#6 || 2 || ASCII ||ヘッダ !#6 固定文字列 || || !**!**!** || 6 || ASCII ||データ長 || || CH1 アナログデータ || 2 || SHORT || CH1 データ || || : || || || || || CH20 アナログデータ || 2 || SHORT || CH20 データ || || アラームデータ1 || 2 || SHORT || CH1~10アラームデータ(使用しない) || || アラームデータ2 || 2 || SHORT || CH11~20アラームデータ(使用しない) || || アラーム出力データ || 2 || SHORT || アラーム出力データ(使用しない) || || ステータス || 2 || SHORT || データ状態(使用しない) || 現在プログラム内ではアナログデータの部分までしか使用していないので、今の所は問題ない。 === 入力チャネル状態取得(:AMP:CHxx:INP?) === 入力チャネル状態は {{{:AMP:CHxx:INP?}}} で取得している。[[br]] 戻り値としては、 || 受信文字列 || データ種別 || 係数 || || DC || 電圧 || :AMP:CHxx:RANG?で取得 || || TEMP || 温度 || 0.1固定 || || RH || 湿度 || DC1Vと同じ || || OFF || 接続なし || || {{{DC}}}の場合には、{{{:AMP:CHxx:RANG?}}}でレンジを取得して、各チャネルデータ値の係数とする。[[br]] 一般的な熱電対を使って温度測定をする場合には、レンジ設定を2000℃にしないと正しい値が取得できないので、値がおかしい時は本体の設定を確認する。[[br]] === アンプ設定取得(:AMP:CHxx:RANG?) === {{{DC}}}のレンジ文字列と各チャネルデータの関係は、 || 文字列|| 整数部 || 小数部 || || 20MV || 1 || 1000000 || || 50MV || 4 || 100000 || || 100MV || 2 || 100000 || || 200MV || 1 || 100000 || || 500MV || 4 || 10000 || || 1V || 2 || 10000 || || 2V || 1 || 10000 || || 5V || 4 || 1000 || || 10V || 2 || 1000 || || 20V || 1 || 1000 || || 1-5V || 2 || 1000 || || 50V || 4 || 100 || || 100V || 2 || 100 || '''100VがGL840で追加されていた。'''[[br]] GL820専用のIOCでデータが更新されない状態になっていたのは、100Vがデフォルトの設定になっていたため、換算係数が異常だったのが原因。 換算式は、 {{{ V = (chData / int) * dec V: 電圧 chData: 生データ(SHORT) int: 整数部 dec: 小数部 }}} となっている。 == IOC == IOCのソースコードを置いておきますので、興味のある方はダウンロードしてご使用ください。 * GL820用 [attachment:GraphtecGL820_asynport.tar.gz] * GL820,GL840兼用 [attachment:GraphtecGL820_GL840_asynport.tar.gz] == GL820(GL840)再接続方法 == GL820は、何らかの異常が発生してクライアントとの接続が切れた場合、再接続できなくなる時がたまにある。[[br]] 本体の電源ON/OFFで復帰できるが、物理的に操作できない場所にある場合には、どうしようもなくなる。[[br]] このような状態になった時の復帰方法を記述しておく。[[br]] 1. IOCを停止させる。 1. GL820のWebインターフェイス画面を開く。 1. Webインターフェイス画面の"QUIT"ボタンを押下し、画面上部の外部接続アイコンがグレーアウトすることを確認。この操作によって、ローカルモードに移行できるので、各ボタンの操作が可能になる。 1. IOCを起動させ、外部接続アイコンが点灯すれば、再接続される。 1. 再接続されない場合には、IOCを再度停止後に"MENU"→"I/F"→"設定の反映"を選択し、画面の"ENTER"を押下する。 1. "設定の反映中"ダイアログが消えたら、"QUIT"でメニューを消して、IOCを再起動すれば、再接続できる。 [[Image(quit.png)]] [[Image(icon.png)]] [[Image(restart.png)]] == GL820 データ更新問題 == cERLで使用していたGL820において、接続や通信には問題ないが、GL820側でデータが更新されなくなるという現象が発生した。[[br]]ちなみに、GL840ではこのような問題は発生していない。[[br]] 現在のIOCは、データ取得用のスレッド内でコマンドとデータ取得の間にスリープを入れていないが、コマンド間に1秒以上スリープを入れて実験したところデータ更新が止まることはなくなった。[[br]] また、使用していたGL820のFWバージョンを確認したところ、1.04と1.06となっていて最新版(1.13)ではなかったので、FWを更新後、元のスリープ無し版に戻して再実験を行ったが、止まることはなくなった。[[br]]