時間監視CLプログラムで、日付・時刻通知メッセージの受け取り時間を動的に変更する弊社のようなソフトウェアハウスでは、残業者の作業終了時間に合わせてシステムの停止時間を任意の時間に変更できれば便利です。
弊社の時間監視CLプログラムは、利用者からの申請でシステムの停止時間を動的に変更しています。
その仕組みは、時間監視CLプログラムのシステム終了時間を変数にしておき、必要な時に値(時間)を変更し、システム停止時間を変更しています。
サンプルCLプログラムを例にして、システム停止時間の変更方法を以下に示します。
/. *****************************************************************
* *
* システム監視ジョブ *
* *
*****************************************************************
./
PGM (P01-?RESTART)
PARA ?RESTART,NAME,IN,RESTART
VAR ?HHMM,STRING*4
VAR ?COMMAND,STRING*16
VAR ?PROGRAM,STRING*16
VAR ?LINE ,STRING*16
VAR ?LABEL ,STRING*16
VAR ?SVPGMEC,INTEGER,VALUE-0
VAR ?SVPGMES,STRING*5
VAR ?SVPGMEM,STRING*99
VAR ?MSGAREA,STRING*99
VAR ?MSG ,STRING*99
VAR ?STPHM ,NAME*12,VALUE-BD0011830 /. ← ① ./
VAR ?STPTM1 ,STRING*10
VAR ?STPTM2 ,STRING*4,VALUE-'1830'
VAR ?STPTM3 ,STRING*5,VALUE-'BD001'
VAR ?STPTM4 ,STRING*9
VAR ?STPTM5 ,STRING*5
VAR ?PGMRM ,STRING*99
VAR ?ARMMSG1,STRING*5
VAR ?ARMMSG2,STRING*6
VAR ?ARMMSG3,STRING*128
VAR ?ARMMSG31,STRING*40
VAR ?ARMMSG4,STRING*136
VAR ?SAVTM ,STRING*4,VALUE-'0000'
ACTMSG:
ACTMSGQ MAXRMSG-100,UC-@YES|@A,
SPI-*.*,
SCI-*|*|@ALL,
CDR-BD0010900|ID0010000
/BD0011300|ID0010000
/BD0011730|ID0010000
/?STPHM|ID0010000 /. ← ② ./
/.
***************************************************************
* 日付・時刻通知メッセージ内容チェック
***************************************************************
./
MSGCHK:
RCVMSG WAIT-@YES
?PGMRM := @PGMRM
?STPTM1 := %SBSTR(?PGMRM,1,10) /. ← ③ ./
IF @PGMRM = 'ENDCHKJOB'
THEN
GOTO SYSSTOP
END
IF ?STPTM1 = 'POWER OFF:'
THEN
GOTO SETTIME
END
/. システムプログラムムの終了状態で、対応処理をする場合
メッセージ番号を追加する ./
CASE @PGMRS OF
#'S5301'# GOTO STPMSG /.無停電電源装置の電源で動作./
END
/. 監視時間の判定 ./
?HHMM := %SBSTR(@PGMRM,5,4) /. ← ④ ./
IF ?HHMM = ?STPTM2 /. ← ⑤ ./
THEN
GOTO SYSSTOP /. ← ⑥ ./
END
CASE ?HHMM OF
#'0900'# GOTO SNDMSG1
#'1300'# GOTO SNDMSG2
#'1730'# GOTO SNDMSG3
END
SETTIME:
?STPTM2 := %SBSTR(?PGMRM,11,4) /. ← ⑦ ./
IF ?SAVTM < ?STPTM2
THEN
?SAVTM := ?STPTM2
?STPTM4 := ?STPTM3 && ?STPTM2 /. ← ⑧ ./
?STPHM := %NAME(?STPTM4) /. ← ⑨ ./
DACTMSGQ /. ← ⑩ ./
GOTO ACTMSG
END
GOTO MSGCHK
STPMSG:
SNDMSG MSG-'******************',TOWS-*
SNDMSG MSG-'* *',TOWS-*
SNDMSG MSG-'* 停電です。 *',TOWS-*
SNDMSG MSG-'* 処理状況を確認し電源切断処理 *',TOWS-*
SNDMSG MSG-'* CALL ENDCHKJBを *',TOWS-*
SNDMSG MSG-'* 起動して下さい。 *',TOWS-*
SNDMSG MSG-'* *',TOWS-*
SNDMSG MSG-'******************',TOWS-*
GOTO MSGCHK
/.
***************************************************************
* メッセージの送信
***************************************************************
./
SNDMSG1:
SNDMSG MSG-'GOOD MORNING',TO-XCTL.*
GOTO MSGCHK
SNDMSG2:
SNDMSG MSG-'GOOD AFTERNOON',TO-XCTL.*
GOTO MSGCHK
SNDMSG3:
?STPTM5 := %SBSTR(?STPTM2,1,2) && ':'
&& %SBSTR(?STPTM2,3,2)
?MSG := '本日の電源切断時間は ' && ?STPTM5 && ' です!'
SNDMSG MSG-?MSG,TO-XCTL.*
GOTO MSGCHK
/.
***************************************************************
* システム制御機能停止処理
***************************************************************
./
SYSSTOP:
DACTMSGQ
/.
***************************************************************
* 各システム制御機能停止処理
***************************************************************
./
CTLEND01:
?MSGAREA := '*** 各システム制御機能停止処理'
&& ' 開始 ***'
LOGMSG MSG-?MSGAREA,JLOG-@YES,SLOG-@YES
/.************************************************************./
/. ./
/. これ以降は、システム停止手順に合わせて変更して下さい ./
/. 手続き名:CTLEND02 ~ PWROFFを御社の運用に変更 ./
/. ./
/.************************************************************./
CTLEND02:
DACTWS WS-*,SIGNOFF-@YES
LOGMSG MSG-'# CNTJOB (DACTWS ) END #',JLOG-@YES,SLOG-@YES
CTLEND03:
CANWTR DEV-SYSPRINT /. ライタの取消し ./
LOGMSG MSG-'# CNTJOB (CANWTR ) END #',JLOG-@YES,SLOG-@YES
CTLEND04:
STPRDAT /. RDA-SVの停止 ./
LOGMSG MSG-'# CNTJOB (STPRDAT ) END #',JLOG-@YES,SLOG-@YES
CTLEND05:
STPPFS /. PCファイルサーバ停止 ./
LOGMSG MSG-'# CNTJOB (STPPFS ) END #',JLOG-@YES,SLOG-@YES
CTLEND06:
STPFTP /. FTP停止 ./
LOGMSG MSG-'# CNTJOB (STPFTP ) END #',JLOG-@YES,SLOG-@YES
CTLEND07:
STPINETD /. INETD 停止 ./
LOGMSG MSG-'# CNTJOB (STPINETD) END #',JLOG-@YES,SLOG-@YES
CTLEND08:
STPCMS /. CMサーバ停止 ./
LOGMSG MSG-'# CNTJOB (STPCMS ) END #',JLOG-@YES,SLOG-@YES
CTLEND09:
STPNSS /. NSS停止 ./
LOGMSG MSG-'# CNTJOB (STPNSS ) END #',JLOG-@YES,SLOG-@YES
CTLEND10:
?MSGAREA := '*** 各システム制御機能停止処理'
&& ' 終了 ***'
LOGMSG MSG-?MSGAREA,JLOG-@YES,SLOG-@YES
/.
***************************************************************
* プログラムパワーオフ処理
***************************************************************
./
PWROFF:
?MSGAREA := '*** プログラムパワーオフ処理'
&& ' 開始 ***'
LOGMSG MSG-?MSGAREA,JLOG-@YES,SLOG-@YES
POWEROFF
?MSGAREA := '*** プログラムパワーオフ処理'
&& ' 終了 ***'
LOGMSG MSG-?MSGAREA,JLOG-@YES,SLOG-@YES
GOTO SAVLOG
/.
***************************************************************
* ステータスチェック
***************************************************************
./
CHECK:
WHEN ABNORMAL
?SVPGMEC := @PGMEC
?COMMAND := %LAST(COMMAND)
?PROGRAM := %LAST(PROGRAM)
?LINE := %LAST(LINE)
?LABEL := %LAST(LABEL)
?SVPGMES := @PGMES
?SVPGMEM := @PGMEM
?MSGAREA := 'COMMAND=' && ?COMMAND
&& ',LINE=' && ?LINE
&& ',LABEL=' && ?LABEL
&& ',PGMES=' && ?SVPGMES
&& ',PGMEM=' && ?SVPGMEM
LOGMSG MSG-?MSGAREA,JLOG-@YES,SLOG-@YES
CASE ?LABEL OF
#'SNDMSG1'# ?SVPGMEC := 0 GOTO MSGCHK
#'SNDMSG2'# ?SVPGMEC := 0 GOTO MSGCHK
#'SNDMSG3'# ?SVPGMEC := 0 GOTO MSGCHK
#'CTLEND01'# ?SVPGMEC := 0 GOTO CTLEND02
#'CTLEND02'# ?SVPGMEC := 0 GOTO CTLEND03
#'CTLEND03'# ?SVPGMEC := 0 GOTO CTLEND04
#'CTLEND04'# ?SVPGMEC := 0 GOTO CTLEND05
#'CTLEND05'# ?SVPGMEC := 0 GOTO CTLEND06
#'CTLEND06'# ?SVPGMEC := 0 GOTO CTLEND07
#'CTLEND07'# ?SVPGMEC := 0 GOTO CTLEND08
#'CTLEND08'# ?SVPGMEC := 0 GOTO CTLEND09
#'CTLEND09'# ?SVPGMEC := 0 GOTO CTLEND10
#'CTLEND10'# ?SVPGMEC := 0 GOTO PWROFF
#'DSPMSG'# GOTO ABEND
#'ABEND'# GOTO OWARI
#'SAVLOG'# GOTO OWARI
END
GOTO DSPMSG
END
DSPMSG:
SNDMSG MSG-'***************',TOWS-*,LEVEL-@B
SNDMSG MSG-'* *',TOWS-*,LEVEL-@B
SNDMSG MSG-'* システム監視ジョブが *',TOWS-*,LEVEL-@B
SNDMSG MSG-'* 異常終了しました。 *',TOWS-*,LEVEL-@B
SNDMSG MSG-'* 直ちに連絡して下さい。*',TOWS-*,LEVEL-@B
SNDMSG MSG-'* *',TOWS-*,LEVEL-@B
SNDMSG MSG-'***************',TOWS-*,LEVEL-@B
?MSGAREA := 'COMMAND=' && ?COMMAND
&& ',PROGRAM=' && ?PROGRAM
&& ',LINE=' && ?LINE
&& ',LABEL=' && ?LABEL
&& ',PGMES=' && ?SVPGMES
&& ',PGMEM=' && ?SVPGMEM
SNDMSG MSG-?MSGAREA,TOWS-*,LEVEL-@B
IF ?LABEL = 'SAVLOG' | ?LABEL = 'ABEND'
THEN
GOTO OWARI
END
GOTO ABEND
/.
***************************************************************
* 異常終了時のジョブログの採取
***************************************************************
./
ABEND:
SAVLOG TOFILE-JLOGFIL.SAVLOG,ADD-@NO,EDT-@JEF
GOTO OWARI
/.
***************************************************************
* ジョブログの採取
***************************************************************
./
SAVLOG:
SAVLOG TOFILE-JLOGFIL.SAVLOG,ADD-@NO,EDT-@JEF
OWARI:
RETURN PGMEC-?SVPGMEC
1.サンプルCLの時間変更処理の定義方法
①時間変更となる変数を定義
通常の運用時間を日付時刻間隔パラメータ形式で定義する。
VAR ?STPHM ,NAME*12,VALUE-BD0011830 ← 通常は、18時30分が規定の時間
VAR ?STPTM1 ,STRING*10
VAR ?STPTM2 ,STRING*4,VALUE-'1830' ← 時間変更用作業エリア
VAR ?STPTM3 ,STRING*5,VALUE-'BD001'
VAR ?SAVTM ,STRING*4,VALUE-'0000' ← 最終時間判定用退避エリア
②ACTMSGQの定義
ACTMSGQの日付時刻間隔パラメータに、①で定義した変数を指定する。
/?STPHM|ID0010000 ← 変数による通知設定
③時間変更の指示の判定
受信したメッセージから時間変更指示メッセージを取り出す。
?STPTM1 := %SBSTR(?PGMRM,1,10) ← メッセージ本文よりキーワードの取り出し
IF ?STPTM1 = 'POWER OFF:' ← 時間変更キーワードの判定
THEN
GOTO SETTIME ← 時間変更処理へ分岐
END
④通知時間の取り出し
システムからの日付時間通知メッセージより、通知時間を取り出す。
?HHMM := %SBSTR(@PGMRM,5,4)
⑤~⑥システム通知時間と変数値の比較と処理分岐
IF ?HHMM = ?STPTM2 ← 停止時間の判定
THEN
GOTO SYSSTOP ← システム停止処理へ分岐
END
⑦通知メッセージから変更時間の取り出し
CLに通知された変更時間からメッセージキューに指定する日付時刻間隔パラメータを作成する。
?STPTM2 := %SBSTR(?PGMRM,11,4) ← 通知メッセージ本文より変更時間の取り出し
⑧~⑨日付時刻間隔パラメータの作成
?STPTM4 := ?STPTM3 && ?STPTM2 ← 日付時刻間隔パラメータの作成
?STPHM := %NAME(?STPTM4) ← 名前型に変更
⑩時間変更を反映するためにメッセージキューの非活性化
メッセージキューの非活性化したのち、再度、活性化することで変更した時間が反映する。
DACTMSGQ ← メッセージキューの非活性化
2.停止時間の変更指示
弊社では、下記のSNDMSGコマンドで変更したい時間を時間監視CLプログラムに通知しています。
SNDMSG MSG-'POWER OFF:hhmm',TO-CNTJOB.?????,SLOG-@YES
*:hhmmの形式で停止時間を指定
RCVMSGコマンドで取得したメッセージ本文には、『POWER OFF:hhmm』でメッセージが設定されるので、③で1桁目から10桁目のキーワードを取り出し、⑦で11桁目から14桁目の変更時間を取り出す処理となる
尚、カレンダータイマーの電源切断時間との関係も考慮が必要となります。
3.サンプルCLのご利用について
サンプルCLは、コピー&ペスートでテキストエディタに貼り付け、御社のオフコンに転送することで利用できますが、システムの停止処理は御社の手順に変更してご利用ください。