「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
近年、弊社へのcodesysの問い合わせが増えてきています。その中でも特殊だったと感じたのがcodesysのRedundancy機能(冗長化)を用いたシステムの開発です。
弊社でもcodesysのRedundancy機能を使用するのは初めてのことで、検証期間を経てから実際の開発に取り掛かりました。
今回のソフテックだよりでは、codesysのRedundancy機能とはどういうものか、検証や開発のどういった部分で苦戦したかなどをご紹介させていただきます。
codesysのRedundancy機能とは、PLC(実際の案件ではLinux PCにcodesysをインストールしていました)を2台用意しておき、1台をアクティブPLCとして稼働させ、もう1台をスタンバイPLCとして待機させておくことで、アクティブPLCが急なトラブルなどでダウンした時に、スタンバイPLCがプログラムの実行を引き継ぐことで、システム障害が発生することを防ぐことができる機能になります。
図1. codesys Redundancy構成図
Redundancyとして具体的にやっていることとしては、変数の値のコピーになります。
特定のタイミングで同期の処理が走り、codesysのプロジェクト上で選択したオブジェクトに所属する変数の値がコピーされます。これにより、アクティブPLCがダウンした場合でも、スタンバイPLCは直前までのアクティブPLCの状態を保持したまま、動作を開始することができます。
図2. 冗長性構成設定
検証や開発時にいくつか苦戦した点がありますので、紹介させていただきます。
先ほど特定のタイミングで同期されると記載しましたが、最初にRedundancyの設定をしただけでは、同期が実行されずに困っていました。
OnlineHelpを確認したところ、同期処理の実行をするプログラムを書く必要がありました。
もしくは、構成ファイルに特定の設定を用意することでも同期されますが、実際の案件では同期タイミングを制御できる方が都合がよかったため、同期処理を実行するプログラムを書く対応にしました。
[codesys Online Help:Synchronizing Redundant Data]
https://content.helpme-codesys.com/ja/codesys%20Redundancy/_rtsl_redundancy_synchronize_data.html
各種設定値は、PLCの再起動で消えてしまうと困るため、保持変数として宣言していました。
ただ、保持変数を同期対象にしても、アクティブPLCのWebVisuで変えた設定値がスタンバイPLCに反映されない動きをしていました。
codesysの考え方として、Redundancy機能を使用している場合、アクティブPLCとスタンバイPLCで同期中にどちらかがダウンしても値は保持できているので、保持変数の同期は不要という考え方なのかもしれませんが、アクティブPLCとスタンバイPLCが両方ダウンした場合に値が初期化されます。
このため、保持変数と同じ変数内容のオブジェクトを別で用意し、保持変数から通常変数に値をコピーした上で同期処理を行う対応をしました。
同期対象のオブジェクト内にファンクションブロックも含めていたのですが、ファンクションブロック内の変数が同期されない動きをしていました。
例えばタイマーの標準ファンクションブロックを使用したかったのですが、ファンクションブロック内に持っている現在何秒までカウント中かという数値が、アクティブPLCとスタンバイPLCで異なっていました。
このため、タイマーは自作ファンクションを用意し、何秒までカウント中かという数値の変数を同期対象にしました
スタンバイPLC側は普段は何もせず、アクティブPLCがダウンした場合にのみ処理が実行されるのかと思っていましたが、そうではありませんでした。
タスクに登録したプログラムはアクティブPLCでもスタンバイPLCでも動作し、同期のタイミングでアクティブPLCからスタンバイPLCに変数の値がコピーされているだけでした。
何もしなければスタンバイPLCからリモートI/Oに対して値の書き込みなども行うため、リモートI/O側の値を見ると、値がちらつく現象が発生していました。
このため、自分自身がアクティブPLCなのかスタンバイPLCなのかを判断し、アクティブPLCのみが書き込み処理を行う判断をさせていました。
開発を進めていたある日、急に冗長化の状態がおかしくなりました。
何もしなければアクティブとスタンバイの状態を維持して欲しいところなのですが、アクティブPLCとスタンバイPLCをそれぞれ起動した時に、いくら待っても同期されず、スタンドアロンで動き始めました。
同期対象変数が増えてきたために同期に時間がかかるようになり、タイムアウトしているのかと思ったのですが、codesysの画面上の設定を変更しても効果がありませんでした。
色々確認していたところ、ReleaseNotesにBootupWaitTimeの初期値が短すぎる場合があるという記載があったため、「codesysControl_User.cfg」の設定ファイルを直接書き換えたところ、うまく動き始めました。
[CmpRedundancy]
BootupWaitTime=5000ただ、codesysの開発エディタ上からRedundancy関連の設定を変更し、設定書込を実行すると、
「codesysControl_User.cfg」の中身が更新されるのですが、BootupWaitTimeも初期値に戻ってしまっていました。
codesysの代理店のリンクス社にも問い合わせたところ、上記の現象は修正予定ではあるが、時期未定とのことで、実際の案件ではセットアップ手順書にBootupWaitTimeは最後に変更することを明記して対応しました。
なお、本稿執筆時点で開発時のcodesysのバージョン(V3.5SP20)のReleaseNotesを見ると、BootupWaitTimeが上書きされるバグについて記載があり、Fixedの状態になっていました。
[Release Notes: codesys V3.5 SP20]
https://www.codesys.com/fileadmin/data/Images/System/Releaseinformation/Release-Notes-codesys-35200.html
検証段階ではEtherCAT機器を使用してのRedundancyの検証も行っていました。codesys上の設定画面を見ると、EtherCATの設定として、codesysが稼働するPLC上のNICをMACアドレスで指定することができます。
ただ、アクティブPLCが故障し、スタンバイPLCが稼働中に代替機をセットアップすることを考えると、MACアドレスが変わるとプロジェクトの再ダウンロードが必要になり、両方のPLCが停止する時間が発生します。
それは可能ならば避けたかったため、実際の案件ではEtherCATは使用せず、IPアドレスで指定できるModbus/TCPで構成していました。
図3. EtherCAT設定
本番環境でのcodesysの稼働にはランタイムライセンスを購入する必要があります。ランタイムライセンス以外にも追加機能にはそれぞれライセンス購入が必要で、Redundancy機能も追加ライセンスが必要です。
開発環境であれば、ランタイムライセンスは2時間まで稼働できるデモモードを使用することができ、codesys Redundancy SLのSTOREページにもデモモードで2時間と明記されているのですが、Redundancy機能をデモモードで実行していると、ランタイムライセンスより先にRedundancyだけ30分程度で機能が無効になる現象が発生しました。
なお、他の追加ライセンスとして、codesys IIoT Libraries SL(MQTTやHTTPSなど様々な通信プロトコルに対応するライブラリ)というものも使用していましたが、そちらのSTOREページにはデモモードで30分と記載されていました。
実運用で問題があるわけではないのですが、デバッグ中に急にアクティブ・スタンバイの状態がおかしくなることがあり、少し困っていました。
codesysのRedundancy機能を使ってみての感想ですが、何かトラブルがあった場合の対策として良い機能だとは思うのですが、 codesysでRedundancyを使っている人が少ないのか、不具合のような動きをする部分もあり、実際の運用に耐えられる状態まで持っていくのに非常に苦戦しました。 この時対応した案件のように、絶対に稼働を止められないシステムもあると思いますので、本稿なども参考にしていただきつつ、codesysのRedundancy機能を活用していってもらえればと思います。
(Y.O.)
関連ページへのリンク
関連するソフテックだより