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


Ignore:
Timestamp:
07/16/19 17:58:00 (6 years ago)
Author:
Tetsuya Michikawa
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]]