wiki:epics/contec_cpi

Version 6 (modified by michkawa, 15 months ago) (diff)

--

CONTEC CPIシリーズ用(RaspberyPi用HATサイズ拡張ボード)IOC

CONTEC製RaspberyPi用HATサイズ拡張ボード用IOCを作成したので、設定方法と使い方を記述する。
ほとんどがドライバ設定方法しか書いてない、、、

HW接続

RaspberryPiに必要な機能のボードを接続する。
この時ボード付属のピンヘッダを使用するが、そのままでは高さが足りないので、必要に応じてスペーサーを使用して高さを合わせる。
また、各ボードにはロータリースイッチがあるので、複数枚スタックする時には番号が重ならないように設定しておく。

今回は、

を使用した。

RaspberryPi環境設定

Raspberry Piに今回使用するボードの実行環境を整備する。
今回は​加速器セミナー(2023)で作成したディスクイメージを使用したが、メーカー推奨(?)バージョンで環境を構築してもいい。

今回のIOC作成環境には、RaspberryPi 3B+を使用したが、初代以外のRaspberryPi(HATコネクタの互換性のため)ならば動くと思う(保証はしない!)

実はここが一番の難所。

カーネルヘッダ

デバイスドライバのインストールには、Linuxカーネルヘッダが必要なので、事前にインストールしておく。

# apt install -y raspberrypi-kernel-headers

​加速器セミナー(2023)のディスクイメージを使用する場合、apt updateをしてしまった後なので、普通にパッケージインストールするとカーネル6,xのパッケージがインストールされてしまう。
ドライバのコンパイルには5.xが必要なので、古いライブラリをここから直接ダウンロードしてインストールする。
今回使用したのは、テスト環境で使用しているカーネルのバージョンに合わせて2023/1/6版にした。

# apt remove -y raspberrypi-kernel-headers
# apt install ./raspberrypi-kernel-headers_1.20230106-1_arm64.deb

メーカー製ドライバのダウンロード

AIO制御用ドライバー​DIO制御用ドライバーは​CONTECのHPからダウンロード可能(要ユーザー登録)

ドライバのインストール

AIOとDIOは別々にインストールする必要があるが、インストール方法はほぼ同じ。
例として、AIOドライバをインストールした時のログを記述するが、DIOはcaio->cdioに読み替えればいい。

ドライバーをRaspberryPiにコピーして展開。

epics@raspberrypi:~ $ mkdir epics
epics@raspberrypi:~ $ cd epics/
epics@raspberrypi:~/epics $ tar ztvf caio530F.tgz
epics@raspberrypi:~ $ cd epics/caio530F/contec/caio

ドライバーのコンパイルは、rootになって実行。

epics@raspberrypi:~/epics/caio530F/contec/caio $ sudo su -

展開したドライバをコンパイルしてインストール。

root@raspberrypi:~# cd /home/epics/epics/caio530F/contec/caio/
root@raspberrypi:/home/epics/epics/caio530F/contec/caio# make
root@raspberrypi:/home/epics/epics/caio530F/contec/caio# make install

他にもi2cを有効化する必要があるらしいので、raspi-configでi2cを有効化。

root@raspberrypi:/root# raspi-config

 3 Interface Options -> 
   I5 I2C ->
     Would you like the ARM I2C interface to be enabled? Yes

設定を変更したら、RaspberryPiを再起動。

ボード認識設定

このままではボードが認識されないので、FAQのCPIシリーズが認識しませんを参考に、/boot/config.txtdtparam=i2c_vc=onを追記して再起動。

これで認識されるようになるが、こんな記述はマニュアルにはない!!!

とりあえず認識されているかを確認するために、i2cbusを見てみる。
どうやらi2cbusを2つ使うようで、0と1では違うデバイスが見えている。

root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 52 -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- 22 -- -- -- -- -- 28 -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

0に見えているのが、今回接続したボードのアドレスのようで、試しにロータリースイッチを変更すると番号が変わることが確認できた。

ドライバ設定

このボードをプログラムから使用する際には、ドライバをインストールするだけでなく各ボードに名前を設定する必要がある。
ドライバをコンパイルすると、ディレクトリにconfigディレクトリが作成され、その中のconfigを実行することでボード名を設定する。

root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# ./config
----------------------------------
CONTEC API-AIO(LNX) Configuration
----------------------------------
Message : Auto detecting devices.
...................................................................................
..
--------------------------------------------------------------------------------
 Devices list
--------------------------------------------------------------------------------
    DeviceName   Product Name       ID              IP/Master IP    Status
[1]:+ AIO000     CPI-AI-1208LI      1
[2]:+ AIO001     CPI-AO-1602LC      0
--------------------------------------------------------------------------------
[#]:Select device       [o]:List sort           [r]:Redetect devices list
[d]:Delete device       [a]:Add device manually [e]:Diagnostic report
[s]:Save settings       [q]:Exit
Please select the device to set up.
Please input >s
********************************************************************************
Save OK?(y/n):y
Message : Setting file is 'contec_aio.conf'.
Message : Start script file is 'contec_aio_start.sh'.
Message : Stop script file is 'contec_aio_stop.sh'.
Confirm(y):y
..
--------------------------------------------------------------------------------
 Devices list
--------------------------------------------------------------------------------
    DeviceName   Product Name       ID              IP/Master IP    Status
[1]:  AIO000     CPI-AI-1208LI      1
[2]:  AIO001     CPI-AO-1602LC      0
--------------------------------------------------------------------------------
[#]:Select device       [o]:List sort           [r]:Redetect devices list
[d]:Delete device       [a]:Add device manually [e]:Diagnostic report
[s]:Save settings       [q]:Exit
Please select the device to set up.
Please input >q
********************************************************************************

DIOの場合、

root@raspberrypi:/home/epics/epics/cdio_820F/contec/cdio/config# ./config
----------------------------------
CONTEC API-DIO(LNX) Configuration
----------------------------------
Message : Auto detecting devices.
........................................................................................................................................................
..
--------------------------------------------------------------------------------
 Devices list
--------------------------------------------------------------------------------
    DeviceName   Product Name       ID              IP/Master IP    Status
[1]:  DIO000     CPI-RRY-16         2
[2]:+ DIO001     CPI-DIO-0808L      3
--------------------------------------------------------------------------------
[#]:Select device       [o]:List sort           [r]:Redetect devices list
[d]:Delete device       [a]:Add device manually [e]:Diagnostic report
[s]:Save settings       [q]:Exit
Please select the device to set up.
Please input >s
********************************************************************************
Save OK?(y/n):y
Message : Setting file is 'contec_dio.conf'.
Message : Start script file is 'contec_dio_start.sh'.
Message : Stop script file is 'contec_dio_stop.sh'.
Confirm(y):
Confirm(y):y
..
--------------------------------------------------------------------------------
 Devices list
--------------------------------------------------------------------------------
    DeviceName   Product Name       ID              IP/Master IP    Status
[1]:  DIO000     CPI-RRY-16         2
[2]:  DIO001     CPI-DIO-0808L      3
--------------------------------------------------------------------------------
[#]:Select device       [o]:List sort           [r]:Redetect devices list
[d]:Delete device       [a]:Add device manually [e]:Diagnostic report
[s]:Save settings       [q]:Exit
Please select the device to set up.
Please input >q
********************************************************************************

ドライバにアクセスするためには、付属ライブラリ内にあるcontec_aio_start.shcontec_dio_start.shを実行する必要があるそうなので、マニュアルに従って/etc/rc.localに記述する。

root@raspberrypi:/root# emacs -nw /etc/rc.local
cd /home/epics/epics/caio530F/contec/caio/config/
./contec_aio_start.sh
cd /home/epics/epics/cdio_820F/contec/cdio/config/
./contec_dio_start.sh

ちなみにこのスクリプトを実行するためには、実行に必要なファイルを適当なディレクトリにコピーすることが求められているが、今回は展開先で直接実行するようにしておいた。

後日、ボードを追加したり、ボードID(ロータリースイッチ)を変更した場合には、再度configをし直す必要があるので注意する。

IOC

IOCは、ai,bi,ao,bo,mbbiDirect,mbboDirectをサポートしている。

まだ実戦投入はしていないが、動作確認済みのものを上げておく。

contecCPI_IOC_1_0.tar.gz

ちなみに今回は最低限各ポートに読み書きができるようにしてあるだけなので、高速化や割り込みには対応していない。
改変は自由なので、変更したら公開してもらうとありがたい。
バージョン管理はローカルのgitlabでしか行っていないが、後日公開したいと考えている。

db ファイル

  • INP,OUT field
    • $(NAME): configで設定したデバイス名
    • $(PORT): ポート番号(bi,bo,mbbiDirect,mbboDirect)
    • $(CH): チャネル番号(ai,ao,bi,bo)
  • ai record
record(ai, "$(USER):ANALOG:CH$(CH):GET") {
    field(DTYP, "devAiCPI")
    field(INP,  "@$(NAME) $(CH)")
    field(SCAN, "1 second")
}
  • ao record
record(ao, "$(USER):ANALOG:CH$(CH):SET") {
    field(DTYP, "devAoCPI")
    field(OUT,  "@$(NAME) $(CH)")
}
  • bi record
record(bi, "$(USER):BIT:PORT$(PORT):CH$(CH):GET") {
    field(DTYP, "devBiCPI")
    field(INP,  "@$(NAME) $(PORT) $(CH)")
    field(SCAN, "1 second")
}
  • bo record
record(bo, "$(USER):BIT:PORT$(PORT):CH$(CH):SET") {
    field(DTYP, "devBoCPI")
    field(OUT,  "@$(NAME) $(PORT) $(CH)")
}
  • mbbiDirect record
record(mbbiDirect, "$(USER):BYTE:PORT$(PORT):GET") {
    field(DTYP, "devMbbiDirectCPI")
    field(INP,  "@$(NAME) $(PORT)")
    field(SCAN, "1 second")
}
  • mbboDirect record
record(mbboDirect, "$(USER):BYTE:PORT$(PORT):SET") {
    field(DTYP, "devMbboDirectCPI")
    field(OUT,  "@$(NAME) $(PORT)")
}

Attachments (1)

Download all attachments as: .zip