= 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?) === データの受信フォーマットは以下のようになる。[[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]] === 入力チャネル状態取得(:AMP:CHxx:INP?) === 入力チャネル状態は {{{:AMP:CHxx:INP?}}} で取得している。[[br]] 戻り値としては、 || 受信文字列 || データ種別 || 係数 || || DC || 電圧 || :AMP:CHxx:RANG?で取得 || || TEMP || 温度 || 0.1固定 || || RH || 湿度 || DC1Vと同じ || || OFF || 接続なし || || {{{DC}}}の場合には、{{{:AMP:CHxx:RANG?}}}でレンジを取得して、各チャネルデータ値の係数とする。 === アンプ設定取得(: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 || 換算式は、 {{{ V = (chData / int) * dec V: 電圧 chData: 生データ(SHORT) int: 整数部 dec: 小数部 }}} となっている。 == IOC == IOCのソースコードを置いておきますので、興味のある方はダウンロードしてご使用ください。 attachment:GraphtecGL820_asynport.tar.gz