PLCnext向けC言語クロスビルド環境をDockerコンテナ上に構築する

PLCnext 用に作成した C 言語コードは、PC 上の Linux でクロスビルドすることが可能です。
しかし、普段使用している Linux 環境を新しいクロスビルド用ソフトウエアで汚染したくない場合もあります。
ここでは、Docker Hub から公開されている Ubuntu イメージをベースにして PLCnext 向けクロスビルド用 Docker イメージを作成するまでの一連の手順を紹介します。

Docker のホスト OS (以下 「Docker ホスト」と表記) として Ubuntu を利用します。Docker ホストは、PC 実機へ直接インストールした物でも、VirtualBox のような仮想PCへインストールした物でも構いません。
・Docker ホストがインターネットへ接続可能である必要があります。

当記事で使用している FW バージョン 2022.0 対応版のクロスビルド用ツールは Ubuntu 18 上で正式な動作確認が行われており、今回紹介するクロスビルド用環境も Ubuntu 18 の Docker イメージをベースにして構築しています。
ベースとするイメージが Ubuntu 20 以上の場合、libssl のバージョンの関係でクロスビルド用ツールである PLCnCLI がうまく動作しない可能性があります。

Docker ホスト側は Ubuntu 20 以上のもので構いません。

目次

Docker ホストの用意

この記事では、Docker ホストとして Oracle VM VirtualBox 上に Ubuntu 22 をインストールして使用しました。

Oracle VM VirtualBox は、VirtualBox のサイトから最新版をダウンロードして使用してください。
Ubuntu 22 のインストール用ファイルは、Ubuntu のサイトからダウンロードして使用してください。

Docker を使用するための環境構築

先ほど用意した Docker ホスト (Ubuntu 22) へ、Docker のインストールを行います。

当記事では Docker そのものについての解説は必要最小限に留めます。詳細は、公式サイトの記事などをご参照ください。

Docker のインストールが済んでいる場合、この項目は読み飛ばしてください。

STEP
Docker のインストールに必要なパッケージのインストール

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

STEP
公式DockerリポジトリのGPGキーをシステムへ追加

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

STEP
Docker リポジトリを APT ソースへ追加

$ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable”

STEP
追加されたリポジトリを用いてパッケージデータベースを更新

$ sudo apt update

STEP
インストール用レポジトリが Docker リポジトリであることを確認

これから docker-ce をインストールしようとしていますが、その前にインストールに使用するリポジトリが Ubuntu リポジトリではなく Docker リポジトリであることを確認してください。

$ apt-cache policy docker-ce

以下の様に、docker-ce のインストール元候補が Ubuntu xx.xx(focal)Dockerリポジトリからのものとなっていれば大丈夫です。

docker-ce:
 インストールされているバージョン: (なし)
 候補: 5:23.0.1-1~ubuntu.20.04~focal
 バージョンテーブル:
  5:23.0.1-1~ubuntu.20.04~focal 500
   500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
(以下略)

STEP
Docker のインストール

Docker をインストールし、実行状態を確認します。

$ sudo apt install docker-ce
$ sudo systemctl status docker

以下の例の様にサービスがアクティブ実行中であれば正常です。

● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-02-20 11:37:07 JST; 2min 48s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 5272 (dockerd)
Tasks: 9
Memory: 24.8M
CPU: 567ms
CGroup: /system.slice/docker.service
└─5272 /usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
(以下略)

STEP
一般ユーザとして Docker を実行可能にする

自分自身を docker グループへ追加します。

$ sudo usermod -aG docker ${USER}

いったんログアウトし、ログインし直してください。(Docker ホストの Ubuntu を再起動しても構いません)

自分自身が docker グループへ追加されたかを確認します。

id -nG

以下の例の様に、docker が表示されていれば OK です。

testuser_01 adm cdrom sudo dip plugdev lpadmin lxd sambashare docker vboxsf

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 SDKLinux SDK 本体となります。ソースコードのビルドに必要なツールが全て含まれています。

PLCnext の AXC F 2152 を例にとって紹介しましたが、AXC F 1152/3152 や EPC 1502/1522 でも手順は同じです。ご利用中の PLCnext の製品ページから Linux SDK と PLCnCLI をダウンロードしてご使用ください。

クロスビルド環境を Docker コンテナ内へ構築

STEP
クロスビルド環境のベースとなる Docker イメージの取得

クロスビルド用環境のベースとして、Ubuntu 18.04 の Docker イメージをDocker Hub から取得します。

$ docker image pull ubuntu:18.04

すると、以下の様なメッセージが表示され、イメージを取得できたことがわかります。

18.04: Pulling from library/ubuntu
Digest: sha256:a3765b4d74747b5e9bdd03205b3fbc4fa19a02781c185f97f24c8f4f84ed7bbf
Status: Image is up to date for ubuntu:18.04
docker.io/library/ubuntu:18.04

ローカルに持っている Docker イメージは以下のコマンドで確認できます。

$ docker image ls

以下の用に、ローカルに存在するイメージが表示されます。

STEP
Docker イメージからコンテナを実行

用意した Docker イメージ ubuntu:18.04 (リポジトリ名 ubuntu と TAG 18.04 を : でつないで指定) を、ubuntu1804 というコンテナ名 (任意に指定可能な文字列) で実行します。

$ docker container run -it –name ubuntu1804 ubuntu:18.04

そうすると、以下の様に Docker コンテナ内のコマンドプロンプトへ入力できるようになります。

testuser_01@vbox:~$ docker container run -it –name ubuntu1804 ubuntu:18.04
root@7c802182104d:/#

ここで、「7c802182104d」は自動的に割り振られたコンテナ ID です。以後このコンテナに対して Docker ホスト側から操作を行うときは、コンテナ ID かコンテナ名を用いてコンテナを特定することになります。

STEP
Docker コンテナへ一般的なビルド用ツールをインストール

Docker コンテナ内のコマンドプロンプトで以下を実行し、ビルド作業に必要な一般的なツールをDocker コンテナ内にインストールします。

# apt update
# apt install wget xz-utils python3 build-essential libunwind8 sshpass libtool pkg-config

STEP
Docker ホストからコンテナ内へ SDK とツールをコピー

ダウンロード済の 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

以下の様にディレクトリができているはずです。

SDK_and_tool_AXC_F_2152

このディレクトリへ移動してください。

# cd SDK_and_tool_AXC_F_2152

STEP
コンテナ内で PLCnCLI をインストール

まず 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 というツールが用意されます。

(中略)
Please type y to accept, n otherwise: y
Creating directory plcncli
Verifying archive integrity… 100% MD5 checksums are OK. All good.
Uncompressing PlcNextCli 22.0.0.952 100%
PLCnext 2022.0 was installed in ./plcncli. To include the CLI in the path please execute the following command: sudo ln -sf /root/SDK_and_tool_AXC_F_2152/plcncli/plcncli /bin/plcncli

plxncli ディレクトリ下の plcncli ツールにパスを通すため以下のコマンドを実行します。

# ln -s /root/SDK_and_tool_AXC_F_2152/plcncli/plcncli /usr/local/bin/plcncli

plcncli ツールにパスを通っていることを確認するため、root のホームディレクトリから以下のコマンドを実行します。

# plcncli version

以下のようにバージョンが表示されたら、plcncli の準備完了となります。

plcncli 22.0.0 LTS (22.0.0.952)

STEP
コンテナ内で Linux SDK をインストール

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

上記の plcncli コマンドは、
plcncli install sdk -d [SDK インストール先ディレクトリへのパス] -p [SDK スクリプトファイルへのパス]
という構成になっています。
[SDK インストール先ディレクトリへのパス] 名に、AXCF2152/2022.0 のように ターゲット名/バージョン番号を入れておくと管理しやすくなります (ディレクトリは自動的に作られます)。

以下のようなメッセージが表示されれば SDK のインストールは完了です。

[…中略…]
[100%] Install SDK.
Exploring the SDK /opt/pxc/sdk/AXCF2152/2022.0.
Successfully installed sdk ./pxc-glibc-x86_64-axcf2152-image-sdk-cortexa9t2hf-neon-axcf2152-toolchain-2022.0.sh in /opt/pxc/sdk/AXCF2152/2022.0.

SDK インストール先に指定したディレクトリは以下のようになっています。

クロスビルド環境の入ったコンテナを Docker イメージにする

ここまでの作業で作成したクロスビルド環境をDocker イメージにしておきます。こうすると、再びクロスビルド環境構築直後の作業環境が欲しくなったとき、このイメージからコンテナを実行することでその環境が得られます。

STEP
不要なファイルの消去

コンテナ内のファイルシステムへコピーした Linux SDK と PLCnCLI のインストーラファイルを削除します。
コンテナ内のコマンドラインで以下の操作をして下さい。

# cd ~/SDK_and_tool_AXC_F_2152
# rm *.sh

STEP
コンテナのイメージ化

Docker ホスト側のターミナルで以下を実行してください。
-m の後の文字列は任意の説明文です。-a の後の文字列は任意のユーザー名などの情報です。
その次の文字列はコンテナ名です。コンテナ ID を指定しても構いません。
最後の文字列はレポジトリ名 、つまりイメージの名前です。これは小文字である必要があります。

$ docker commit -m “AXC F 2152 Cross-Build Env.” -a “Test User 01ubuntu1804 ubuntu18.04-axfc2152-crossbuild

いろいろなツールをインストールして容量が大きくなっているので、完了まで数十秒かかる場合があります。
完了したらDocker ホスト側で以下の様に入力し、イメージが作成されていることを確認してください。

$ docker images

ここで作成したイメージについては後ほど内容を確認することとし、現在実行中の ubuntu1804 コンテナで引き続き作業を行います。

サンプルコードのビルド

現在実行中の ubuntu1804 コンテナ上で、有名なオープンソースコードである 「2048」を PLCnext コントローラ AXC F 2152 用にビルドします。

STEP
「2048」のダウンロード

コンテナ内のコマンドプロンプトにて作業用フォルダを作成し、そこで移動します。

# mkdir ~/2048 && cd ~/2048

wget コマンドを用いて「2048」オープンソースをダウンロードします。

# wget https://raw.githubusercontent.com/mevdschee/2048.c/master/2048.c

STEP
クロスビルドの実行

クロスビルドのための環境変数設定用スクリプトファイルを実行します。

# source /opt/pxc/sdk/AXCF2152/2022.0/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi

オープンソースを $CC コマンドを用いてビルドします。

# $CC -o 2048 2048.c

生成された実行ファイルを file コマンドで確認します。

# file 2048

2048: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=05abbfdec6e8fa9a2bc309da446e57d4cc7bad74, for GNU/Linux 3.2.0, with debug_info, not stripped

この例では AXC F 2152 (ARM CPU) 向けなので、ARM 向けの実行ファイルが生成されています。

PLCnext 実機でサンプルコードを実行

STEP
実行ファイルをコンテナ外へ取り出し

コンテナ内に作成された 2048 実行ファイルを取り出すために、Docker ホスト側のターミナルで以下を実行してください。

$ docker container cp ubuntu1804:/root/2048/2048 ./

STEP
PLCnext へ「2048」実行ファイルを転送

「2048」実行ファイルを sftp コマンドで PLCnext 実機へ転送します。

$ sftp admin@192.168.1.10

LAN ポート (2ポートとも同一 I/F)192.168.1.10
ユーザ名admin
パスワード(PLCnext 本体表面ラベルに記載、8桁の英数字)
AXC F 2152 のデフォルト設定

IP アドレスの設定が正しいはずなのに接続できないときは、以下を実行して指定したホストの鍵をknow_hostsから抹消してから、sftp を再試行してみてください。
$ ssh-keygen -R 192.168.1.10

sftp の put コマンドを用いて、2048 実行ファイルを PLCnext へ転送します。転送が終わったら exit コマンドで sftp を終了してください。

sftp> put 2048 /opt/plcnext

STEP
PLCnext のターミナルへログイン

PLCnext へ SSH でログインしてください。

$ ssh admin@192.168.1.10

PLCnext の admin ユーザのホームディレクトリは /opt/plc/next です。
admin@axcf2152:~$ pwd
/opt/plcnext/

STEP
「2048」の実行

「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 に取り込むことができます。

STEP
確認作業のためにいったんイメージを消去

ここまでの作業で 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 イメージがなくなったことが確認できました。

STEP
Docker イメージの読み込み

$ docker load < ubuntu18.04-axfc2152-crossbuild.tar

イメージのリストを確認します。

$ docker images

ファイルからイメージを取りこむことができました。

このほかに、コンテナそのものを export / import する方法もありますが、この紹介記事では割愛します。詳しくは、Docker に関する WEB サイトをご参照ください。

  • URLをコピーしました!
目次