HOME > ソフテックだより > 第429号(2023年7月5日発行) 技術レポート「ラズパイ + CODESYSで電源を落としてもいいの?」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第429号(2023年7月5日発行)
技術レポート

「ラズパイ + CODESYSで電源を落としてもいいの?」

1. はじめに

昨年来、独Kunbus社の産業向けRaspberry Pi製品 ”Revolution Pi(以下、RevPi)” 上で、独CODESYS社の提供するソフトPLCシステム ”CODESYS” を稼働させる構成の案件に携わっています。

DINレールにマウントされたRevPi Connect+と追加 IOモジュール群
図1. DINレールにマウントされたRevPi Connect+(中央)と追加 IOモジュール群(中央左)

一般的に基板剥き出しで販売されているRaspberry Piとは異なり、RevPiは堅牢にハウジングされており、入出力モジュールとともにDINレールへの導入も可能なので、一見するとPLCそのものに思えます。
ところが、RevPiの中身はRaspberry Piであり、内部ではOSとしてRaspberry Pi OSを実行しています。このRaspberry Pi OSはLinux(Debian)から派生したOSで、実は電源断(いわゆるブチ切り)に対応していません。
本来的には、電源を落とす前には、きちんとした手順でシステムをシャットダウンする必要があるのです。

技術進歩とともにLinuxカーネルも円熟して、今どき電源が落ちてもそうそうファイルシステムがクラッシュするものではありません。
とはいえ、産業の場では瞬停や人為的な電源断によるシステムダウンやデータロストのリスクは少しでも小さくしたいものです。

本記事では、RevPi + CODESYS Control for Raspberry Pi環境で電源断からデータとシステムを保護する方法について解説します。

2. RevPi + CODESYS Control for Raspberry Piの電源断対策

2.1 要件

RevPi + CODESYS Control for Raspberry Piの環境で、電源断対策として必要なのは次の2点です。

  • 復帰不可となることを避けるため、ファイルシステムが破損しないように保護する
  • トレンド・アラームなどの記録データを保持する

まず、電源断によってファイルシステム(特にOSに必要な部分)が破損してしまうと、電源を再投入してもRaspberry Piが起動しなくなり、せっかくPLCよりも安価に構築できたシステムでも損失を生じてしまいます。
また、各種フィールドバスから収集したデータをトレンドとしてロギングしたり、発報したアラームの履歴を残したり、といった用途がある場合には、電源断-->復帰後にもそれらのデータを保持している必要があります。

2.2 Overlay

本記事ではLinuxの”overlay”機能を用いる方法を紹介します。
Overlayとは、Linuxのファイルシステムサービスの一つで、ベースとなるディレクトリ(フォルダ)の上に別のディレクトリを重ね合わせて、あたかも一つのディレクトリであるかのように扱えるという機能です。
ベースとなるディレクトリはLowerdir、重ね合わせるディレクトリはUpperdirと呼ばれます。
overlayによって重ね合わせたディレクトリは、次のような挙動を示します。

  • 基本的にはLowerdirからファイルを読み込む
  • ファイルに変更を加える場合には、元のファイルがUpperdirにコピーされ、Upperdirのファイルに対して変更が行われる。
  • LowerdirとUpperdirに同名のファイルがある場合には、Upperdirのファイルに対して読み書きが行われる。
  • ディレクトリに新たにファイルを作成すると、Upperdirにのみファイルができる。

Linuxのoverlay機能の概要
図2. Linuxのoverlay機能の概要

要するに、重ね合わせたフォルダに対してアクセスすると、Lowerdirには全く変化が起きず、Upperdirにのみ変化の差分が保存されることになります。
原理上、LowerdirのファイルをUpperdirにコピーする時以外にはほとんど遅延が生じず、素早く動作できます。また、3つ以上のディレクトリを重ね合わせることができるのも特長です。

さて、この機能を使えば、OSの起動/稼働に不可欠なファイルへの直接的な読み書きを減らし、特にクラッシュを生じうる直接の書き込み動作は無くすことができそうです。

2.3 tmpfs

Linuxにはtmpfsというファイルシステムサービスも備わっています。
Temporal File System(一時的なファイルシステム)の略でtmpfsですが、これは通常HDDやSSD(RevPiではeMMC)にファイルを保存してデータの読み書きをするところを、コンピュータのメモリ(RAM)上に領域を確保し、その領域にファイルを置き、読み書きを行う機能です。
HDDやSSDに比べて読み書きが早いメモリ上にファイルを置いておくことで、よく使うファイルへのアクセス時間が短縮され動作が早くなるなどのメリットがありますが、電源断によってデータが消える(揮発する)という特徴があります。そういった意味で名称に”temporal”という語が含まれているわけです。

2.4 ファイルシステムの保護方法

RevPi + CODESYS Control for Raspberry Pi環境でファイルシステムを保護するには、前述のoverlayとtmpfsを組み合わせます。
すなわち、

  1. Linuxのboot/rootパーティションをreadonly(読み取り専用)にする。
  2. rootパーティションにtmpfsをoverlayする。
これによって、設定などのOSに必要なデータファイルへ直接書き込みを行わせることなく、システムを稼働できます。
複雑なようですが、幸いこの対策方法はRaspberry Pi OSに機能設定として備わっています。raspi-configコマンドからPerformance Options > Overlay File Systemを有効にするだけです。
なお、この設定を有効化した後にネットワーク設定などを変更した場合、再起動すると変更が元に戻ってしまうので、十分に設定を検討した後で有効化し、後々どうしても変更が必要な場合には、機能を一度無効化する必要があります。

2.5 トレンドログ・アラーム履歴の保持

さて、この状態では、CODESYSで収集したトレンドログやアラーム履歴のデータも電源断によって消えてしまいます。
CODESYSでは、これらのデータはそれぞれ”/var/opt/codesys/plclogic/trend” “/var/opt/codesys/ plclogic/alarm”というディレクトリにSQLiteで保存されます。
電源断による揮発を避けるために、これらのディレクトリに対し、不揮発性の(永続的な)ファイルシステム上のディレクトリをさらにoverlayするのがいいでしょう。
RevPiにはUSB2.0のポートが備わっているため、ここに外部ストレージを接続するか、あるいは内部eMMCのパーティションを分割し、boot/rootパーティションとは別のパーティションのディレクトリを重ねれば、電源断後もログ・履歴データを保持できます。
(なお、外部ストレージの利用と内部eMMCのパーティションの分割では、電源断による起動不可リスク低減の面において外部ストレージの利用の方が高い有効性を発揮すると考えられます。)

ここで一つ問題が生じます。それは「データが永続化するように不揮発性のファイルシステムのディレクトリを用いるなら、結局は電源断によるデータ損失リスクを回避できていないのでは?」という懸念です。

CODESYSのトレンドログやアラーム履歴のデータがSQLiteで保存されていることは前述の通りです。(ご存じない方のために補足しておくと、SQLiteはオープンソース・パブリックドメインで開発されているデータベースの一種です。)
SQLiteの公式ウェブサイトを参照すると、次のような記述が見つかります。

“SQLite responds gracefully to memory allocation failures and disk I/O errors. Transactions are ACID even if interrupted by system crashes or power failures.”

本記事ではその仕組みについてまで触れることはしませんが、要するにSQLiteはそもそもシステムクラッシュや電源断に強いことを謳ったデータベースシステムというわけです。

そうはいっても、もしファイルシステム全体がクラッシュするような事態が起きれば、そこに保存されているSQLiteの実態(.sqlite)ファイルは失われてしまうことになりますので、懸念は残ります。
そこでさらに提案したいのは、RevPiへの電源供給にバッファモジュールを挟み、電源断の発生時に電源供給が実際に止まるまでの間に、Raspberry Pi OS上で稼働するCODESYS Controlプロセスを停止することです。RevPi本体にはデジタル入力(DI)が1点備わっているため、バッファモジュールの正常出力をRevPiに入力しておけば、適当な周期で電源断を検知して対策を打てます。

電源状態シグナルを監視して異常時にCODESYS Controlプロセスを停止するST言語PROGRAMの例:

PROGRAM WATCH_POWER
VAR
	command:STRING:="sudo pkill codesyscontrol";
	stdout:STRING(255);
	pResult:POINTER TO SysProcess_Implementation.RTS_IEC_RESULT;
END_VAR

// 電源状態を監視
IF NOT(PowerOK) THEN
	// 電源異常時にpkillコマンドを実行
	SysProcess_Implementation.SysProcessExecuteCommand2(pszCommand:=command, pszStdOut:=stdout, udiStdOutLen:=SIZEOF(stdout), pResult:=pResult);
END_IF

pkill codesyscontrolコマンドの実行時間をtimeコマンドで計測してみると、およそ60~90msで実行が完了します。 ですので、前述の例のようなPROGRAMを用いて100ms間隔で電源状態を監視する場合、電源断から供給停止までに200ms程度確保できればよさそうです。

2.6 まとめ

以上の説明をまとめると、次のようになります。

RevPi + CODESYS Control for Raspberry Pi環境における電源断対策
  1. Linuxのboot/rootパーティションをreadonlyにする
  2. rootパーティションにtmpfsをoverlay
  3. ログ保存用に別途不揮発性ファイルシステムを用意
  4. /var/opt/codesys/plclogic以下の必要ディレクトリに不揮発性ファイルシステムをoverlay
  5. RevPiの電源供給にバッファモジュールを介する
  6. 一次電源断を検知したらCODESYSのプロセスを停止させる

3. おわりに

ここまで、RevPi上でCODESYSを稼働させた際の電源断(いわゆるブチ切りや瞬停)対策についてご紹介しました。

産業用Raspberry PiとソフトPLCの組み合わせは、一般的なPLCを購入する場合よりも安価にシステム構築ができるとあって、当社にも多くご相談いただいております。
PLCライクに構築できるとはいえ、あくまで“代用品”的な側面を持つソフトPLCでは、一筋縄ではいかない点もあります。
今回ご紹介したような対策を講じることで、PLC感覚で電源を切ってシステム停止させてしまったり、ちょっとした瞬間停電が起きたりした場合にも、安全に復帰し、円滑に業務・生産を再開できるようになります。

ソフテックでは、こうした検討を重ねながら、お客様のニーズに合わせたシステム構築や安全対策をご提案いたしております。

(R.O.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ