CONTEC CPIシリーズ用(RaspberyPi用HATサイズ拡張ボード)IOC
CONTEC製RaspberyPi用HATサイズ拡張ボード用IOCを作成したので、設定方法と使い方を記述する。
ほとんどがドライバ設定方法しか書いてない、、、
HW接続
RaspberryPiに必要な機能のボードを接続する。
この時ボード付属のピンヘッダを使用するが、そのままでは高さが足りないので、必要に応じてスペーサーを使用して高さを合わせる。
また、各ボードにはロータリースイッチがあるので、複数枚スタックする時には番号が重ならないように設定しておく。
今回は、
- 半導体リレー接点出力 CPI-RRY-16
- デジタル入出力 8ch 絶縁 12~24VDC CPI-DIO-0808L
- 絶縁アナログ入力 CPI-AI-1208LI
- 絶縁アナログ出力 CPI-AO-1602LC
を使用した。
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.txtにdtparam=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.shとcontec_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をサポートしている。
まだ実戦投入はしていないが、動作確認済みのものを上げておく。
ちなみに今回は最低限各ポートに読み書きができるようにしてあるだけなので、高速化や割り込みには対応していない。
改変は自由なので、変更したら公開してもらうとありがたい。
バージョン管理はローカルの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)
- contecCPI_IOC_1_0.tar.gz (16.5 KB) - added by michkawa 14 months ago.
Download all attachments as: .zip