PLCnext 用に作成した C 言語コードは、PC 上の Linux でクロスビルドすることが可能です。
しかし、普段使用している Linux 環境を新しいクロスビルド用ソフトウエアで汚染したくない場合もあります。
ここでは、Docker Hub から公開されている Ubuntu イメージをベースにして PLCnext 向けクロスビルド用 Docker イメージを作成するまでの一連の手順を紹介します。
当記事で使用している FW バージョン 2022.0 対応版のクロスビルド用ツールは Ubuntu 18 上で正式な動作確認が行われており、今回紹介するクロスビルド用環境も Ubuntu 18 の Docker イメージをベースにして構築しています。
ベースとするイメージが Ubuntu 20 以上の場合、libssl のバージョンの関係でクロスビルド用ツールである PLCnCLI がうまく動作しない可能性があります。
Docker ホストの用意
この記事では、Docker ホストとして Oracle VM VirtualBox 上に Ubuntu 22 をインストールして使用しました。
Docker を使用するための環境構築
先ほど用意した Docker ホスト (Ubuntu 22) へ、Docker のインストールを行います。
当記事では Docker そのものについての解説は必要最小限に留めます。詳細は、公式サイトの記事などをご参照ください。
Docker のインストールが済んでいる場合、この項目は読み飛ばしてください。
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
$ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable”
$ sudo apt update
これから docker-ce をインストールしようとしていますが、その前にインストールに使用するリポジトリが Ubuntu リポジトリではなく Docker リポジトリであることを確認してください。
$ apt-cache policy docker-ce
以下の様に、docker-ce のインストール元候補が Ubuntu xx.xx(focal)のDockerリポジトリからのものとなっていれば大丈夫です。
Docker をインストールし、実行状態を確認します。
$ sudo apt install docker-ce
$ sudo systemctl status docker
以下の例の様にサービスがアクティブで実行中であれば正常です。
自分自身を docker グループへ追加します。
$ sudo usermod -aG docker ${USER}
いったんログアウトし、ログインし直してください。(Docker ホストの Ubuntu を再起動しても構いません)
自分自身が docker グループへ追加されたかを確認します。
id -nG
以下の例の様に、docker が表示されていれば OK です。
SDKとクロスコンパイル支援用ツールのダウンロード
Docker ホスト上で、クロスビルド用のツール類をダウンロードします。
AXC F 2152 の製品ページから「ダウンロード」をクリックし、ジャンプ先にある「ソフトウエア」の項目を確認して下さい。
「pxc-glibc-」で始まるファイルと「PLCnext」で始まるファイルについて、Linux 用のものをそれぞれダウンロードします。
これらのファイルのバージョンと PLCnext の FW バージョンは基本的に同じである必要があります。今回の例では、FW 2023.0.0 LTS を搭載した AXC F 2152 を対象としているため、LTS 系 FW の中で最もバージョンの近い 2022.0 LTS 向けのファイルを使用しています。
以降、今ダウンロードした「pxc-glibc-」で始まるファイルを Linux SDK、 「PLCnext」で始まるファイルをPLCnCLI と呼びます。
PLCnCLI | Linux SDK を操作するためのコマンドラインツール。Linux SDK のインストールもこちらのツール を使います。 |
Linux SDK | Linux SDK 本体となります。ソースコードのビルドに必要なツールが全て含まれています。 |
クロスビルド環境を Docker コンテナ内へ構築
クロスビルド用環境のベースとして、Ubuntu 18.04 の Docker イメージをDocker Hub から取得します。
$ docker image pull ubuntu:18.04
すると、以下の様なメッセージが表示され、イメージを取得できたことがわかります。
ローカルに持っている Docker イメージは以下のコマンドで確認できます。
$ docker image ls
以下の用に、ローカルに存在するイメージが表示されます。
用意した Docker イメージ ubuntu:18.04 (リポジトリ名 ubuntu と TAG 18.04 を : でつないで指定) を、ubuntu1804 というコンテナ名 (任意に指定可能な文字列) で実行します。
$ docker container run -it –name ubuntu1804 ubuntu:18.04
そうすると、以下の様に Docker コンテナ内のコマンドプロンプトへ入力できるようになります。
ここで、「7c802182104d」は自動的に割り振られたコンテナ ID です。以後このコンテナに対して Docker ホスト側から操作を行うときは、コンテナ ID かコンテナ名を用いてコンテナを特定することになります。
Docker コンテナ内のコマンドプロンプトで以下を実行し、ビルド作業に必要な一般的なツールをDocker コンテナ内にインストールします。
# apt update
# apt install wget xz-utils python3 build-essential libunwind8 sshpass libtool pkg-config
ダウンロード済の Linux SDK と PLCnCLI のファイルが Docker ホスト側の以下のディレクトリにおいてあるとします。
これらのファイルを Docker コンテナ内の /root 以下へディレクトリごとコピーします。
Docker ホストの Ubuntu 上で新しいターミナルを開き、以下を実行してください。
$ docker container cp /media/sf_vbox_share/SDK_and_tool_AXC_F_2152 ubuntu1804:/root/
ファイルサイズが大きいため、コピーに数十秒かかる場合があります。なお、コンテナ名「ubuntu1804」の部分には、コンテナ ID 「7c802182104d」を指定しても構いません。
コピーが完了したら、今度はコンテナ内のコマンドプロンプトで以下の様に /root ディレクトリ以下のファイルを確認してください。
# cd
# ls
以下の様にディレクトリができているはずです。
このディレクトリへ移動してください。
# cd SDK_and_tool_AXC_F_2152
まず PLCnCLI をインストールします。先ほどコンテナ内の /root/SDK_and_tool_AXC_F_2152 ディレクトリへ移動済なので、そこで以下のコマンドを実行してください。
(ファイル名はご使用のバージョンに合わせて適宜読み換えて下さい。)
# chmod a+x PLCnext_Toolchain_Linux_2022.0.sh
# ./PLCnext_Toolchain_Linux_2022.0.sh
実行するとソフトウエアライセンス条項が表示され同意を求められるので、問題がなければ “y” を入力して Enter キーを押して下さい。そうするとシェルスクリプトが置いてあるディレクトリに plxncli というディレクトリが作成され、このディレクトリの下に plcncli というツールが用意されます。
plxncli ディレクトリ下の plcncli ツールにパスを通すため以下のコマンドを実行します。
# ln -s /root/SDK_and_tool_AXC_F_2152/plcncli/plcncli /usr/local/bin/plcncli
plcncli ツールにパスを通っていることを確認するため、root のホームディレクトリから以下のコマンドを実行します。
# plcncli version
以下のようにバージョンが表示されたら、plcncli の準備完了となります。
STEP 5 でインストールした PLCnCLI を用いて Linux SDK をインストールします。
# chmod a+x pxc-glibc-x86_64-axcf2152-image-sdk-cortexa9t2hf-neon-axcf2152-toolchain-2022.0.sh
# plcncli install sdk -d /opt/pxc/sdk/AXCF2152/2022.0 -p ./pxc-glibc-x86_64-axcf2152-image-sdk-cortexa9t2hf-neon-axcf2152-toolchain-2022.0.sh
以下のようなメッセージが表示されれば SDK のインストールは完了です。
SDK インストール先に指定したディレクトリは以下のようになっています。
クロスビルド環境の入ったコンテナを Docker イメージにする
ここまでの作業で作成したクロスビルド環境をDocker イメージにしておきます。こうすると、再びクロスビルド環境構築直後の作業環境が欲しくなったとき、このイメージからコンテナを実行することでその環境が得られます。
コンテナ内のファイルシステムへコピーした Linux SDK と PLCnCLI のインストーラファイルを削除します。
コンテナ内のコマンドラインで以下の操作をして下さい。
# cd ~/SDK_and_tool_AXC_F_2152
# rm *.sh
Docker ホスト側のターミナルで以下を実行してください。
-m の後の文字列は任意の説明文です。-a の後の文字列は任意のユーザー名などの情報です。
その次の文字列はコンテナ名です。コンテナ ID を指定しても構いません。
最後の文字列はレポジトリ名 、つまりイメージの名前です。これは小文字である必要があります。
$ docker commit -m “AXC F 2152 Cross-Build Env.” -a “Test User 01” ubuntu1804 ubuntu18.04-axfc2152-crossbuild
いろいろなツールをインストールして容量が大きくなっているので、完了まで数十秒かかる場合があります。
完了したらDocker ホスト側で以下の様に入力し、イメージが作成されていることを確認してください。
$ docker images
ここで作成したイメージについては後ほど内容を確認することとし、現在実行中の ubuntu1804 コンテナで引き続き作業を行います。
サンプルコードのビルド
現在実行中の ubuntu1804 コンテナ上で、有名なオープンソースコードである 「2048」を PLCnext コントローラ AXC F 2152 用にビルドします。
コンテナ内のコマンドプロンプトにて作業用フォルダを作成し、そこで移動します。
# mkdir ~/2048 && cd ~/2048
wget コマンドを用いて「2048」オープンソースをダウンロードします。
# wget https://raw.githubusercontent.com/mevdschee/2048.c/master/2048.c
クロスビルドのための環境変数設定用スクリプトファイルを実行します。
# source /opt/pxc/sdk/AXCF2152/2022.0/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
オープンソースを $CC コマンドを用いてビルドします。
# $CC -o 2048 2048.c
生成された実行ファイルを file コマンドで確認します。
# file 2048
この例では AXC F 2152 (ARM CPU) 向けなので、ARM 向けの実行ファイルが生成されています。
PLCnext 実機でサンプルコードを実行
コンテナ内に作成された 2048 実行ファイルを取り出すために、Docker ホスト側のターミナルで以下を実行してください。
$ docker container cp ubuntu1804:/root/2048/2048 ./
「2048」実行ファイルを sftp コマンドで PLCnext 実機へ転送します。
$ sftp admin@192.168.1.10
LAN ポート (2ポートとも同一 I/F) | 192.168.1.10 |
ユーザ名 | admin |
パスワード | (PLCnext 本体表面ラベルに記載、8桁の英数字) |
IP アドレスの設定が正しいはずなのに接続できないときは、以下を実行して指定したホストの鍵をknow_hostsから抹消してから、sftp を再試行してみてください。
$ ssh-keygen -R 192.168.1.10
sftp の put コマンドを用いて、2048 実行ファイルを PLCnext へ転送します。転送が終わったら exit コマンドで sftp を終了してください。
sftp> put 2048 /opt/plcnext
PLCnext へ SSH でログインしてください。
$ ssh admin@192.168.1.10
「2048」を実行します。
admin@axcf2152:~$ ./2048
以下のように表示されたら成功です。
クロスビルドの実行と確認自体は、ここまでで終了です。
作成したDocker イメージから別のコンテナを起動してみる
クロスビルド環境の入った Docker イメージから新たにコンテナを起動してみます。
Docker ホスト側で新しいターミナルを起動して、新しいコンテナを実行します。
–name の後の文字列は今回起動するコンテナのコンテナ名です。その後の文字列は、Docker イメージのレポジトリ名です。
$ docker container run -it –name ub1804_crossbuild ubuntu18.04-axfc2152-crossbuild
今起動したコンテナ内のコマンドプロンプトで root のホームディレクトリ内に何があるか確認してみると、SDK_and_tool_AXC_F_2152 ディレクトリしか存在していないことがわかります。
一方、先ほど「2048」のビルドに使用していたコンテナ内のディレクトリを見ると、2048 ディレクトリも存在していることがわかります。
このように、イメージを作成した時点での環境を任意のタイミングで使用できることがわかります。
作成した Docker イメージをファイルへ保存する
作成したクロスビルド環境入りの Docker イメージを別の PC 等へコピーしたい場合は、save コマンドを用いて Docker イメージをファイルへ保存することができます。
Docker ホスト側のターミナルで以下を実行してください。
$ docker save ubuntu18.04-axfc2152-crossbuild > ubuntu18.04-axfc2152-crossbuild.tar
ファイルから Docker イメージを読み込む
saveコマンドで保存した Docker イメージは、 load コマンドで Docker に取り込むことができます。
ここまでの作業で ubuntu18.04-axfc2152-crossbuild イメージから起動したコンテナが実行中であるため、コンテナの停止と消去を行い、イメージも消去しておきます。
$ docker stop ub1804_crossbuild
$ docker rm ub1804_crossbuild
$ docker rmi ubuntu18.04-axfc2152-crossbuild
イメージのリストを確認します。
$ docker images
ubuntu18.04-axfc2152-crossbuild の Docker イメージがなくなったことが確認できました。
$ docker load < ubuntu18.04-axfc2152-crossbuild.tar
イメージのリストを確認します。
$ docker images
ファイルからイメージを取りこむことができました。
このほかに、コンテナそのものを export / import する方法もありますが、この紹介記事では割愛します。詳しくは、Docker に関する WEB サイトをご参照ください。