Changes between Initial Version and Version 1 of epics/yokogawa/gm_series


Ignore:
Timestamp:
07/16/19 17:58:00 (5 years ago)
Author:
michkawa
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • epics/yokogawa/gm_series

    v1 v1  
     1[[PageOutline]] 
     2= Yokogawa SMARTDAC+(GM/GPシリーズ)でのIOC作成 = 
     3 
     4 
     5[https://www.yokogawa.co.jp/solutions/services/oprex/oprex-measurement/oprex-data-acquisition/data-logger/modular-gm10/ Yokogawa SMARTDAC+(GMシリーズ)]用のIOCを立て続けに作ることになったので、その時の色々な経緯を書いておく。[[br]] 
     6どちらのシリーズも、GX90xxのモジュールを使うので、その参考になれば幸いである。[[br]] 
     7 
     8== cERLでMV2000をGP20に置き換え == 
     9 
     10cERLで使用していたMV2000は、IOCを落とすと本体の電源をON/OFFしない限り、IOCとの再接続ができないという問題を抱えていた。[[br]] 
     11常時温度監視をするために使用していたので通常は問題ないが、何かの拍子にIOCが落ちたりすると、電源ON/OFFの事を忘れていたためにデータが取れていないということが何回かあったので、運転終了後に入れ替えることになった。[[br]] 
     12候補としては、[https://www.chino.co.jp/ Chino]の[https://www.chino.co.jp/products/recorders/kr3000/ kr3000]等も考えたが、他の所で[https://www-linac.kek.jp/cont/epics/netdev/ netDev]のdarwinプロトコルを使用することでデータが取れることを聞いていたので、今回は[https://www.yokogawa.co.jp/solutions/services/oprex/oprex-measurement/oprex-data-acquisition/portable-data-acquisition/touch-screen-gp10-gp20/ Yokogawa GP20]を使用することにした。 
     13 
     14測定ch構成は、 
     15 * 温度測定 48ch 
     16  * 1~12 ch  [https://www.chino.co.jp/products/sensors/r800/ chino 極低温工業用白金・コバルト測温抵抗体] 
     17  * 13~48ch  T型熱電対(銅コンスタンタン) 
     18 * Alarm接点出力 なし 
     19 
     20測温抵抗体は、測定電圧を変換表で換算することで温度を計算する仕様になっている。[[br]] 
     21この話は今回の本題ではないので割愛。 
     22 
     23== netDev + Darwin == 
     24 
     25始めにnetDevを環境にインストールする。[[br]] 
     26今回は、[https://www-linac.kek.jp/cont/epics/netdev/]から1.0.4を取ってきた。(終わってから、J-PARCの山田さんが[https://github.com/shuei/netDev netDev 1.0.5]を作っていたことを知った。)[[br]] 
     27 
     28=== netDevのインストール === 
     29 
     30{{{ 
     31$ cd インストールディレクトリ 
     32$ wget https://www-linac.kek.jp/cont/epics/netdev/netDev-1.0.4.tar.gz 
     33$ tar zxvf netDev-1.0.4.tar.gz 
     34$ mv netDev-1.0.4 1.0.4 
     35$ cd 1.0.4 
     36$ emacs -nw configure/RELEASE 
     37 
     38EPICS_BASE=/cerl/epics/R315.5/base 
     39 
     40$ make 
     41}}} 
     42 
     43 
     44=== IOC === 
     45 
     46実際にIOCを作成するにあたり、netDev上のdarwin プロトコルでの使用例が直には見つからなかった。[[br]] 
     47冷凍機グループの中西さんが使っていると聞いていたので、使用しているレコードをサンプルとしてもらってきた。[[br]] 
     48 
     49そのサンプルを元に作成したDBファイル。 
     50 
     51{{{ 
     52# Yokogawa GP10  Channel 001 ~ 050 
     53record(channels, "$(USER):$(MODEL):VOL:CH001_050") { 
     54    field(SCAN, "$(SCAN)") 
     55    field(DTYP, "Darwin") 
     56    field(NELM, "50") 
     57    field(INP,  "@$(IP)($(PORT))#001,050")              # @IP(port)#CHs~CHe 
     58} 
     59}}} 
     60 
     61{{{$(PORT)}}}番号は{{{34151}}}で固定だが、{{{$(IP)}}}と共にst.cmdで指定するようにした。[[br]] 
     62ソースコードを確認したところ、{{{channels}}}レコードは最大チャネル数は90chだったので、1レコードで取得できるのはこれが最大らしい。[[br]] 
     63各チャネルのデータは{{{CHxx}}}フィールドから個別に取得できるようになるので、通常は他のレコードにリンクして使用する。 
     64 
     65実際にIOCを作る際には他のモジュールと同様に、{{{configure/RELEASE}}}と{{{xxxApp/src/Makefile}}}を修正する。 
     66 
     67 * configure/RELEASE 
     68 
     69{{{ 
     70     : 
     71NETDEV=$(EPICS_BASE)/../modules/soft/netDev/1.0.4 
     72     : 
     73}}} 
     74 
     75 * xxxApp/src/Makefile 
     76 
     77{{{ 
     78     : 
     79ifneq ($(NETDEV),) 
     80    xxxx_DBD += netDev.dbd 
     81    xxxx_LIBS += netDev 
     82endif 
     83     : 
     84}}} 
     85 
     86st.cmdにはiocInitの後で、[[br]] 
     87 
     88{{{ 
     89dbpf "$(USER):$(MODEL):VOL:CH001_050.MODE" "EL" 
     90}}} 
     91 
     92とすることで、各chの設定を読み込んでレコードに設定する。[[br]] 
     93 
     94この方法でGP20(50ch)は、問題なく通信できている。 
     95 
     96== PF-AR RF温度測定システムの更新 == 
     97 
     98GP20のIOCは、更に多チャンネルを扱う、こちらの案件のための実験も兼ねていた。[[br]] 
     99チャネル数は、{{{analog 140ch + DIO 6ch}}} と {{{analog 80ch + DIO 3ch}}} なので、{{{netDev + darwin}}}の最大チャネル数を超えている。[[br]] 
     100 
     101HWも拡張モジュールを使用しないと対応できないので、subユニットを2つ追加する構成にした。[[br]] 
     102 
     103当初考えていたHW構成は、 
     104 
     105||  slot ||  1  ||  2  ||  3  ||  4  ||  5  ||  6  ||  7  || 
     106|| Main  || CPU || DO  || AI  || AI  || AI  || AI  || EXT || 
     107|| Sub1  || EXT || AI  || AI  || AI  || AI  || AI  || EXT || 
     108|| Sub2  || EXT || AI  || AI  || AI  || AI  || AI  ||  -  || 
     109 
     110GMのWeb画面から、通信(イーサネット)設定->サーバ設定 サーバリスト->DARWIN->チャネル変換→拡張タイプを設定した。[[br]] 
     111とりあえず、一番最後のchに熱電対を取り付けて実験してみた。 
     112 
     113=== netDev + darwinでの実験 === 
     114 
     1151チャネルの数を増やさなくても、ユニット毎にレコードを設定すればデータの取得が可能なのではないかと考えた。 
     116 
     117{{{ 
     118record(channels, "$(user):GM:CH001050") { 
     119    field(SCAN, "$(SCAN)") 
     120    field(DTYP, "Darwin") 
     121    field(INP,  "@$(IP)($(PORT))#001,050")              # @IP(port)#CHs~CHe 
     122    field(NELM, "50") 
     123    field(FLNK, "$(user):GM:CH100150") 
     124} 
     125 
     126record(channels, "$(user):GM:CH100150") { 
     127    field(DTYP, "Darwin") 
     128    field(INP,  "@$(IP)($(PORT))#100,150")              # @IP(port)#CHs~CHe 
     129    field(NELM, "50") 
     130} 
     131}}} 
     132 
     133エラーにはなるが、最後の熱電対のデータが取れているので、複数レコードでも通信自体はできているようだ。[[br]] 
     134その後色々デバッグしてみるが、どうしても140ch分のデータが出てこない。[[br]] 
     135tcpdumpでELコマンド(EL001,250)の出力を見てみると、 
     136 
     137{{{ 
     138  001 C    ,1 
     139  002 C    ,1 
     140  003 C    ,1 
     141  004 C    ,1 
     142  005 C    ,1 
     143  006 C    ,1 
     144  007 C    ,1 
     145  008 C    ,1 
     146  009 C    ,1 
     147  010 C    ,1 
     148     : 
     149  049 C    ,1 
     150  050 C    ,1 
     151  101 C    ,1 
     152  102 C    ,1 
     153     : 
     154  149 C    ,1 
     155 E150 C    ,1 
     156}}} 
     157 
     158となっていた。[[br]] 
     159ch番号を色々と変更しても、このch番号のデータに変化はない。 
     160 
     161HW構成を色々と変えてみて、変化を確認してみた。 
     162 
     163 * DO moduleなし 
     164   * 変わらず 
     165 
     166 || slot || 1   || 2  || 3  || 4  || 5  || 6  || 7   || 
     167 || main || CPU || AI || AI || AI || AI || -  || EXT || 
     168 || sub1 || EXT || AI || AI || AI || AI || AI || EXT || 
     169 || sub2 || EXT || AI || AI || AI || AI || AI ||  -  || 
     170 
     171 * DO moduleなし,EXT module変更 
     172   * 変わらず 
     173 
     174 || slot || 1   || 2  || 3  || 4  || 5  || 6   || 7   || 
     175 || main || CPU || AI || AI || AI || AI || EXT || -   || 
     176 || sub1 || EXT || AI || AI || AI || AI || AI  || EXT || 
     177 || sub2 || EXT || AI || AI || AI || AI || AI  ||  -  || 
     178 
     179 * sub1,sub2なし 
     180   * サーバー設定 サーバーリストのDarwin設定をstandaloneに設定すると40chが見えた。 
     181   * 設定を変更しないとエラー(E1) 
     182 
     183 || slot || 1   || 2  || 3  || 4  || 5  || 6   || 7   || 
     184 || main || CPU || AI || AI || AI || AI || -   || -   || 
     185 
     186 
     187 * DOユニットなし 
     188   * darwin設定が standaloneままだと40chしか見えない 
     189   * darwin設定が 拡張設定だと 50ch + 50ch 
     190 
     191 || slot || 1   || 2  || 3  || 4  || 5  || 6  || 7   || 
     192 || main || CPU || AI || AI || AI || AI || -  || EXT || 
     193 || sub1 || EXT || AI || AI || AI || AI || AI || EXT || 
     194 || sub2 || EXT || AI || AI || AI || AI || AI ||  -  || 
     195 
     196このことから、HW構成を変更することで対処しようとすると、 
     197 
     198 || slot || 1   || 2  || 3   || 4  || 5  || 6   || 7   || 
     199 || main || CPU || DO || EXT || -  || -  || -   || -   || 
     200 || sub1 || EXT || AI || AI  || AI || AI || EXT || -   || 
     201 || sub2 || EXT || AI || AI  || AI || AI || AI  || EXT || 
     202 || sub3 || EXT || AI || AI  || AI || AI || AI  ||  -  || 
     203 
     204という構成にするしかないようだ。[[br]] 
     205但し、電源とEXTが一つずつ追加することになり、今更変更(追加購入)はしたくない(できない)とのこと。 
     206 
     207一応、Yokogawaには問い合わせを行ったが、FWでこの問題を解決しない限り、DARWINプロトコルを使うユーザー側のソフトウェアでの解決できなさそう。[[br]] 
     208結局は仕様ということになりそうだが、今の所{{{netdev+ darwin}}}で動作可能な以下の構成に変更して動作試験をしてみた。[[br]] 
     209 
     210 || slot || 1   || 2  || 3   || 4  || 5  || 6   || 7   || 
     211 || main || CPU || DO || EXT || -  || -  || -   || -   || 
     212 || sub1 || EXT || AI || AI  || AI || AI || EXT || -   || 
     213 || sub2 || EXT || AI || AI  || AI || AI || AI  || EXT || 
     214 || sub3 || EXT || AI || AI  || AI || AI || AI  ||  -  || 
     215 
     216レコードはこのようなものにした。 
     217 
     218{{{ 
     219record(channels, "$(user):GM:CH001040") { 
     220    field(SCAN, "$(SCAN)") 
     221    field(DTYP, "Darwin") 
     222    field(INP,  "@$(IP)($(PORT))#001,040")              # @IP(port)#CHs~CHe 
     223    field(NELM, "40") 
     224    field(FLNK, "$(user):GM:CH101150") 
     225} 
     226 
     227record(channels, "$(user):GM:CH101150") { 
     228    field(DTYP, "Darwin") 
     229    field(INP,  "@$(IP)($(PORT))#101,150")              # @IP(port)#CHs~CHe 
     230    field(NELM, "50") 
     231    field(FLNK, "$(user):GM:CH201250") 
     232} 
     233 
     234record(channels, "$(user):GM:CH201250") { 
     235    field(DTYP, "Darwin") 
     236    field(INP,  "@$(IP)($(PORT))#201,250")              # @IP(port)#CHs~CHe 
     237    field(NELM, "50") 
     238} 
     239}}} 
     240 
     241st.cmdには、iocInit後に以下のコマンドを実行して、HW設定を読み込ませる。 
     242 
     243{{{ 
     244dbpf "$(USER):GM:CH001040.MODE" "EL" 
     245epicsThreadSleep 1 
     246dbpf "$(USER):GM:CH101150.MODE" "EL" 
     247epicsThreadSleep 1 
     248dbpf "$(USER):GM:CH201250.MODE" "EL" 
     249}}} 
     250 
     251epicsThreadSleepを入れないと{{{drvNetMpf: send error [32]}}}が発生する。[[br]] 
     252この状態でIOCを起動すると、エラーも出なくなって正常に動作する。 
     253 
     254 
     255試しに、DO moduleをsub1に移動して、レコードも追加して実行してみた。 
     256 
     257 || slot || 1   || 2  || 3   || 4  || 5  || 6   || 7   || 
     258 || main || CPU ||EXT || -   || -  || -  || -   || -   || 
     259 || sub1 || EXT || DO || AI  || AI || AI || AI  || EXT || 
     260 || sub2 || EXT || AI || AI  || AI || AI || AI  || EXT || 
     261 || sub3 || EXT || AI || AI  || AI || AI || AI  ||  -  || 
     262 
     263 
     264{{{ 
     265record(channels, "$(user):GM:CH001006") { 
     266    field(SCAN, "$(SCAN)") 
     267    field(DTYP, "Darwin") 
     268    field(INP,  "@$(IP)($(PORT))#001,006")             # @IP(port)#CHs~CHe 
     269    field(NELM, "6") 
     270    field(FLNK, "$(user):GM:CH011050") 
     271} 
     272}}} 
     273 
     274この状態で実行すると、以前と同じでエラーになってしまう。 
     275 
     276{{{ 
     277drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH011050"):2019.07/09 15:42:32.769832 *** 
     278drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH001006"):2019.07/09 15:42:34.764932 *** 
     279parse_chan_response: Data Length dose not match: 8224, 208, 50, 0("michkawa:pfarthrm:GM:CH101150") 
     280drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH011050"):2019.07/09 15:42:36.761678 *** 
     281parse_chan_response: Data Length dose not match: 8224, 208, 50, 0("michkawa:pfarthrm:GM:CH201250") 
     282drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH001006"):2019.07/09 15:42:38.758844 *** 
     283parse_chan_response: Data Length dose not match: 8, 208, 50, 0("michkawa:pfarthrm:GM:CH101150") 
     284drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH011050"):2019.07/09 15:42:40.755598 *** 
     285parse_chan_response: Data Length dose not match: 8224, 208, 50, 0("michkawa:pfarthrm:GM:CH201250") 
     286drvNetMpf: *** mpf_timeout_handler("michkawa:pfarthrm:GM:CH001006"):2019.07/09 15:42:42.752343 *** 
     287}}} 
     288 
     289netdev + darwinはDOモジュールには対応していない?[[br]]