Linux コマンドによる PLCnext の時刻合わせ

時計とカレンダー

PLCnext Control をインターネットや時刻サーバーへ接続できない環境で使用する場合、初回設置時や定期的なメンテナンス作業時に PLCnext Control の RTC (Real Time Clock) 時刻を手持ちのパソコンの時刻に合わせたいですよね。

PLCnext Engineer のアプリケーションを用いて時刻を合わせるのが一般的な方法ですが、なんらかの事情で PLCnext Engineer がインストールされていないパソコンで作業を行いたいかもしれません。

この記事では、ターミナルソフトを用いて PLCnext Control へ SSH ログインし、Linux のコマンドを用いて PLCnext Control の時計を合わせる方法をご紹介します。

目次

使用機材・ソフトウエア

機材・ソフトウエアの種類機材 ・ソフトウエアの名称
パソコンWindows 10/11
ターミナル エミュレータ ソフトウエアTeraTerm Ver 4.106 インストール不要版 (zipファイル版)
使用する機材・ソフトウエア

Linux コマンドによる時刻合わせ

Linux コマンドによる時刻合わせ手順は次の通りです。

  1. SSH ログイン (admin ユーザ)
  2. PLCnext Control の現在日時の確認
  3. root ユーザのパスワード設定
  4. root ユーザとしてログイン
  5. Linux システム時刻へ新しい日時を設定
  6. Linux システム時刻を RTC のハードウエアへ記録 (重要)
  7. PLCnext Control の現在日時の確認
コマンド説明
date現在日時を表示します。
date -s
(要管理者権限)
指定日時を Linux システム 時刻へ設定します。
例:date -s ‘2023/12/11 11:11:05’
sudo による実行が可能です。
hwclock –systohc
(要管理者権限)
Linux システム 時刻 を RTC のハードウエアへ書き込みます。
なお、このコマンドは sudo による実行ができないため、
あらかじめ su コマンドで root ユーザとしてログインする必要があります。
sudo指定したコマンドを管理者権限で実行できます。
ただし、実行できるコマンドは限られています。
例:sudo date -s ‘2023/12/11 11:11:05’
passwd
(要管理者権限)
指定したユーザのパスワードを変更します。
まだパスワードを設定されていないユーザが指定された場合は、
パスワードを設定します。
sudo による実行が可能です。
suroot (管理者) ユーザとしてログインします。
使用する Linux コマンド

hwclock –systohc が重要!!
date -s による日時設定だけでは Linux システム時刻 (ソフトウエア上の日時情報) しか変更されないため、この状態で PLCnext Control をリブートすると変更した日時設定情報が失われます。
必ず hwclock –systohc を実行して、 Linux システム時刻を RTC のハードウエアへ書き込んでください。

TeraTerm で PLCnext Control へ SSH ログインしてから、以下の様にコマンドを打ち込んでください。
(Putty でも可)

admin@axcf2152:~$ date  ←----- 2.PLCnext Control の現在日時確認
Mon Dec 11 04:07:18 UTC 2023
admin@axcf2152:~$ sudo passwd root  ←----- 3.root ユーザのパスワード設定
Password: 
New password: 
Retype new password: 
passwd: password updated successfully
admin@axcf2152:~$ su  ←----- 4.root ユーザとしてログイン
Password: 
root@axcf2152:/opt/plcnext/# date -s '2023/12/11 03:40:30'  ←-- 5.Linux システム時刻へ新しい日時を設定
Mon Dec 11 03:40:30 UTC 2023
root@axcf2152:/opt/plcnext/# hwclock --systohc  ←-- 6.Linux システム時刻を RTC のハードウエアへ記録
root@axcf2152:/opt/plcnext/# date  ←----- 7.PLCnext Control の現在日時の確認
Mon Dec 11 03:40:34 UTC 2023

TeraTerm マクロによる時刻合わせの自動化

上述の Linux コマンドを TeraTerm マクロにまとめておくと、作業を自動化することができます。
また、マクロの実行を Windows のバッチファイルから実行するようにすると、ping コマンドなどと組み合わせてより細やかな制御が可能となります。

今回ご紹介するバッチファイルとマクロは、接続先の PLCnext Control が存在するかどうか ping を用いて確認したり、ダイアログボックスによるパスワード入力などに対応しています。

フェイズ処理内容
TeraTerm マクロ実行前1. ping により接続先 PLCnext Control の存在を確認し、結果を取得。
2. 念のために TASKKILL コマンドを用いて TeraTerm プロセスを終了。
3. 「接続先 IP アドレス」、「接続先 ポート番号」、「ping の結果」を引数として
 TeraTerm マクロを実行。
TeraTerm マクロ実行以下は TeraTerm マクロ内で実行。
1. ping 結果が「失敗」なら、マクロ終了。
2. PLCnext Control 接続用パスワード入力ダイアログの表示、
 パスワードが間違っていたら終了、入力されたパスワードが空の場合も終了。
3. PLCnext Control へ SSH 接続、エラーが起きたら終了。
4. ログ取得開始。
5. PLCnext Control と PC それぞれの現在時刻をダイアログへ表示し、
 ユーザーへ操作を続行するか確認。中断が選択されたら終了。
6. 以下を自動実行。
 ・root パスワード設定
 ・su による root ログイン
 ・パソコン時刻を date -s により PLCnext Control の Linux システム時刻へ設定
 ・hwclock –systohc により Linux システム時刻を RTC のハードウエアへ書き込み
 ・root ログインを終了し admin ユーザに戻る
 ・PLCnext Control の現在時刻を取得
7. 時刻設定結果をダイアログへ表示。
8. ログ ファイルのクローズ。
9. 通信終了。
10. マクロ終了。
TeraTerm マクロ実行後TASKKILL コマンドによる TeraTerm プロセスの終了。
マクロ実行用バッチファイルから見た全体の処理

ファイル構成

この章では、以下2つのファイルを作成します。

ファイル名説明
set_plcnext_rtc.batマクロ実行用バッチファイル
set_plcnext_rtc_macro.ttl時刻合わせ用 TeraTerm マクロ
作成するファイル

また、作業フォルダは以下の様な構成になっていることと仮定して説明します。

作業フォルダ
│  set_plcnext_rtc.bat
│  
├─macro フォルダ
│   │  set_plcnext_rtc_macro.ttl
│      
└─teraterm-4.106 フォルダ
    │  ttpmacro.exe
    │  (他、TeraTerm のファイル)

上記の通り、作業フォルダ直下に macro フォルダを作成してください。
また、作業フォルダ直下に TeraTerm (ver4 以上) を配置してください。
teratrem には インストーラ付き版 (exe版) と、インストール不要版 (zip版) が配布されていますが、ここでは TeraTerm Ver 4.106 のインストール不要版を作業フォルダ直下に解凍したと想定しています。

マクロ実行用バッチファイル

以下のコードを「set_plcnext_rtc.bat」として作業フォルダ直下に保存してください。
マクロ実行部分の「teraterm-4.106」は、実際に配置した teraTerm のフォルダ名に合わせて変更してください。

@echo ******************************************************************
@echo ****           時刻合わせツール実行用バッチファイル           ****
@echo ****                                                          ****
@echo ****                   Phoenix Contact Japan                  ****
@echo ****      Ver 1.0: 2023/10/11, Naosugi Yumoto                 ****
@echo ****                                                          ****
@echo ******************************************************************

: --------------------------------------------------------------
: 接続先情報
: --------------------------------------------------------------
: ==== AXC F 1152 実機用設定 ====
@SET hostaddr=192.168.1.10
@SET port=22
: ==== AXC F 1152 Simulator 用設定 ====
:@SET hostaddr=localhost
:@SET port=5555

: --------------------------------------------------------------
: 接続先確認
: --------------------------------------------------------------
@echo コントローラ %hostaddr% を探しています...
@ping %hostaddr%
@set PING_RESULT=%ERRORLEVEL%

: --------------------------------------------------------------
: 前処理
: --------------------------------------------------------------
: TeraTerm プロセスが残っている場合に備えて念のために kill しておきます。
: TeraTerm プロセスが存在しない場合は、エラーになりますが、害はありません。
: ただ、エラーメッセージがあるとユーザに無用な心配をかけるため、メッセージ表示を無しにしておきます。
@TASKKILL /F /IM ttermpro.exe /T > nul 2>&1

: --------------------------------------------------------------
: 時刻合わせマクロ実行
: --------------------------------------------------------------
: マクロ実行
@.\teraterm-4.106\ttpmacro /V ..\macro\set_plcnext_rtc_macro.ttl %hostaddr% %port% %PING_RESULT% > nul 2>&1

: --------------------------------------------------------------
: 後処理
: --------------------------------------------------------------
: マクロ終了後も TeraTerm プロセスは残ってしまうので確実に落とします。
@TASKKILL /F /IM ttermpro.exe /T > nul 2>&1


: もしデバッグのために command ウインドウの表示を保持したい場合は、下記の pause を有効化してください。
:@pause

時刻合わせ用 TeraTerm マクロ

マクロは以下3つの引数をとるように作られています。

引数内容
PLCnext Control の IP アドレス例: 192.168.1.10
PLCnext Control の SSH 用ポート番号22 (固定)
ping 結果値0: ping 成功
1: ping 失敗
マクロ実行前に ping により 接続先 PLCnext Control の存在確認を
行うことを想定した機能です。
マクロの引数

以下のコードを「set_plcnext_rtc_macro.ttl」として作業フォルダ直下のmacroフォルダの下に保存してください。

; ******************************************************************
; ****      時刻合わせツール                                    ****
; ****      PLCnext コントローラの時計をパソコンに合わせる      ****
; ****                                                          ****
; ****                   Phoenix Contact Japan                  ****
; ****      Ver 1.0: 2023/10/11, Naosugi Yumoto                 ****
; ****                                                          ****
; ******************************************************************

; ==================================================
; ==== マクロ引数取得 ==============================
; ==================================================
; ---- 引数にて hostname と port を指定する
hostname    = params[2] ;実機 = '192.168.1.10', Sim = 'localhost'
port        = params[3] ;実機 = '22', Sim = '5555'
; ---- 事前の ping 結果取得
ping_result = params[4] ;ping 結果: 0 = 成功, 1 = 失敗

; ==================================================
; ==== コントローラ発見不能時の終了処理 ============
; ==================================================
strcompare ping_result '0' ;ping 成功なら '0' である。
if result <> 0 then
	sprintf2 msg 'コントローラ %s へ接続できませんでした。\n\n・LAN ケーブルの接続状態\n・パソコンの IP アドレス設定\n・コントローラの電源状態\n\nなどをご確認ください。\n\n処理を中断します。' hostname
	strspecial msg
	messagebox msg '接続エラー'
	end
endif

; ==================================================
; ==== パラメータ用意 ==============================
; ==================================================
username    = 'admin'   ;ユーザ名
; ---- ログファイル名作成
getdate log_time '%Y%m%d_%H%M%S' ;ログファイル名用に日時取得
sprintf2 log_name '..\setrtc_%s_%s.log' log_time hostname ;日時と接続先アドレスを含めてログファイル名生成

; ---- デバッグ用機能
; パスワードを決め打ちにして入力を省きたいときは以下2行を有効にしてください。
;plcnext_passwd = 'xxxxxxxx' ;デバッグ実行対象のコントローラのパスワードに書き直してください。
;goto debug_1

; ==================================================
; ==== 接続用パスワード入力 ========================
; ==================================================
; ---- パスワード要求メッセージの作成
sprintf2 passwd_msg '接続先 IP アドレス: %s\n接続先 PORT 番号: %s\n\n%s 用のパスワードを入力してください' hostname port username
strspecial passwd_msg
dialog_title = 'パスワード入力'

; ---- パスワード入力ダイアログの表示
passwordbox passwd_msg dialog_title
plcnext_passwd = inputstr

; ---- デバッグ用機能
; パスワード入力を省いたときはここに飛びます。
:debug_1

; ---- パスワードの文字数チェック、空なら処理中断
strlen plcnext_passwd
if result == 0 then
	messagebox 'パスワード入力をキャンセルし、処理を中断します。' '処理の中断'
	end
endif

; ==================================================
; ==== SSH 接続 ====================================
; ==================================================
; ---- 接続用引数の作成
; 完全な例: '192.168.1.10:22 /ssh /nosecuritywarning /auth=password /user=admin /passwd=12345678'
sprintf2 connext_msg '%s:%s /ssh /nosecuritywarning /V /auth=password /user=%s /passwd=%s' hostname port username plcnext_passwd

; ---- SSH 接続
connect connext_msg
; ---- ログイン前メッセージの受信待ち
wait 'you agree to these terms.'

; ---- 接続エラーの判定
pause 5
testlink
if result<>2 then
	msg = '接続できませんでした。\nパスワードをご確認ください。'
	strspecial msg
	messagebox msg '接続エラー'
	end
endif

; ---- ログ取得開始
logopen log_name 0 1 1 1 1 1 0 ;ログのタイムスタンプは JST
;logopen log_name 0 1 1 1 1 1 1 ;ログのタイムスタンプは UTC
logwrite 'ログ開始: 左側のタイムスタンプはパソコンの時計の時刻 (日本標準時) です。'

; ---- プロンプト待ち
wait '$'

; ==============================================================
; ==== コントローラとパソコンの現在時刻確認 (時刻合わせ前)  ====
; ==============================================================
; ---- パソコンの現在時刻の取得
gettime cur_pc_time '%Y/%m/%d %H:%M:%S' 'UTC'

; ---- コントローラの現在時刻の取得 (date +... コマンド)
sendln 'date +"%Y/%m/%d %H:%M:%S"'
recvln
recvln
wait '$'
cur_ctrl_time = inputstr

; ---- 時刻確認メッセージの作成
sprintf2 time_comp_mes 'コントローラの現在時刻 (UTC): %s\n設定用 PC の現在時刻 (UTC): %s\n\n時刻設定処理を進めてよろしいですか?' cur_ctrl_time cur_pc_time
strspecial time_comp_mes

; ---- YES/NO ボックスの表示
yesnobox time_comp_mes '時計の確認'

; ---- 処理を進めるなら [setting_process] ラベルへジャンプ
if result goto setting_process

; ---- 処理を中断するならメッセージを出し、終了処理へジャンプ
abort_mes = '時刻設定を行わずに終了します。'
messagebox abort_mes '処理の中断'
logwrite abort_mes
goto end_macro


; ------------- 以降、時刻合わせ処理 -------------
:setting_process

; ===================================================
; ==== root パスワードの設定 (sudo passswd root) ====
; ===================================================
; ---- passwd コマンド実行
sendln 'sudo passwd root'
wait 'Password:'
sendln plcnext_passwd
wait 'New password:'
sendln plcnext_passwd
wait 'Retype new password:'
sendln plcnext_passwd

; ---- プロンプト待ち
wait '$'

; ==================================================
; ==== su でroot になる ============================
; ==================================================
; ---- su コマンド実行
sendln 'su'
wait 'Password:'
sendln plcnext_passwd

; ---- プロンプト待ち
wait '#'

; ==================================================
; ==== 時刻合わせ ==================================
; ==================================================
; ---- パソコンの現在時刻の取得
gettime datetime_str "'%Y/%m/%d %H:%M:%S'" 'UTC'

; ---- date コマンド用文字列作成
date_msg = 'date -s '
strconcat date_msg datetime_str

; ---- システム時刻設定
sendln date_msg

; ---- プロンプト待ち
wait '#'

; ==================================================
; ==== RTC のハードウエアへシステム時刻を設定 ======
; ==================================================
; ---- hwclock コマンド実行
sendln 'hwclock --systohc'

; ---- プロンプト待ち
wait '#'

; ==================================================
; ==== admin ユーザへ戻る ==========================
; ==================================================
; ---- exit コマンド実行
sendln 'exit'

; ---- プロンプト待ち
wait '$'

; ==================================================
; ==== 設定後の時刻確認 ============================
; ==================================================
; ---- コントローラの現在時刻の取得 (date +... コマンド)
sendln 'date +"%Y/%m/%d %H:%M:%S"'
recvln
recvln
wait '$'
cur_ctrl_time = inputstr

; ---- パソコンの現在時刻の取得
gettime cur_pc_time '%Y/%m/%d %H:%M:%S' 'UTC'

; ---- 時刻確認メッセージの作成
sprintf2 time_comp_mes '時刻設定処理を完了しました。\n\nコントローラの現在時刻 (UTC): %s\n設定用 PC の現在時刻 (UTC): %s\n\n(数秒のズレは読み込みタイミングの差です)' cur_ctrl_time cur_pc_time
strspecial time_comp_mes

; ---- 時刻確認メッセージの表示
messagebox time_comp_mes '時刻設定結果'

; ==================================================
; ==== 終了処理 ====================================
; ==================================================
; ---- 終了処理のジャンプ先ラベル
:end_macro

; ---- ログファイルクローズ
logwrite 'ログ終了'
logclose

; ---- 通信終了
unlink

; ---- マクロ実行終了
end

; 注意:unlink して end しても TeraTerm プロセスはバックグラウンドに残っています。
; そのため、マクロ終了後に TASKKILL にて ttermpro.exe を落とすとよいです。
; 例:TASKKILL /F /IM ttermpro.exe /T

TeraTerm マクロの実行

マクロの実行用バッチファイルの実行

マクロ実行用バッチファイル「set_plcnext_rtc.bat」をダブルクリックしてください。

パスワードの入力

指定した IP アドレスが LAN 上に見つかると、左のようにパスワード入力ダイアログが表示されるので、PLCnext Control のパスワードを入力して「OK」をクリックしてください。

LAN 上にコントローラを発見できなかった場合は、代わりに「接続エラー」ダイアログが表示されます。「OK」をクリックすると処理を終了します。

パスワードが空のまま「OK」をクリックすると「処理の中断」ダイアログが表示され、PLCnext Control の時計は変更されずに処理を終了します。

入力したパスワードが間違っていた場合は「接続エラー」ダイアログが表示され、PLCnext Control の時計は変更されずに処理を終了します。

TeraTerm の仕様により、エラー発生をきっかけにこの様なダイアログが出ることがあります。その場合は「OK」をクリックしてください。(自動的に消える場合もあります)
PLCnext Control やパソコンに影響はありません。

PLCnext Control と PC の現在時刻の確認

パスワード入力後、5秒程度で以下のダイアログが表示されます。
コントローラの時計をパソコンの時計に合わせて良い場合は、「はい」をクリックしてください。
(表示されている時刻は UTC、つまり日本時間 – 9 時間の時刻です)

処理を中断したい場合 (パソコンの時計が正しくないことに気がついた場合など) は、「いいえ」をクリックしてください。「処理の中断」ダイアログボックスがが表示され、PLCnext Control の時計は変更されずに処理を終了します。

時刻合わせ処理の完了と確認

2~3秒してから「時刻設定結果」のダイアログが表示されます。
これで時計合わせ処理は完了です。表示内容を確認したら「OK」をクリックして終了してください。

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