ジョブ間同期・通信マクロ実行
メッセージ通信(+信号通信)サンプルプログラム
- サンプルプログラム
-
A−VXのジョブ間同期・通信マクロ実行のメッセージ通信と信号通信(一般通信)を組み合わせたサンプルプログラムです。
最初はメッセージ通信のサンプルのつもりで作り始めましたが、信号通信の一般通信も混ぜてみました。
メッセージを送る側のプログラム(IJSEND)と受ける側のプログラム(IJRESV)の2つのサンプルプログラムがあります。
メッセージを送る側は、画面上で最大20文字程度の文字列を入力してそれをメッセージ送信、受け側でその文字列を画面出力します。
信号通信の一般通信を利用して、メッセージを受け取ったことを送り側に返信します。
- メッセージ送信側プログラム(IJSEND)
-
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. IJSEND. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060******************************************* 000070*** IJCC DATA AREA *** 000080******************************************* 000090**** メッセージ送信用IJCC **** 000100* 共通部分 000110 01 IJCCA01 PIC X(128). 000120 01 IJCCA02. 000130 02 IJCCA02-1 PIC X(02). 000140 02 IJCCA02-2 PIC X(02). 000150 01 IJCCA03. 000160 02 IJCCA03-1 PIC X(01). 000170 02 IJCCA03-2 PIC X(02). 000180 02 IJCCA03-3 PIC X(02). 000190 02 IJCCA03-4 PIC X(20). 000200* 生成 000210 01 IJCCA14. 000220 02 IJCCA14-1 PIC X(01). 000230 02 IJCCA14-2 PIC X(01). 000240 02 IJCCA14-3 PIC X(01). 000250 02 FILLER PIC X(01). 000260 01 IJCCA15. 000270 02 IJCCA15-1 PIC 9(05). 000280 02 IJCCA15-2 PIC 9(05). 000290* 使用開始宣言 000300 01 IJCCA24 PIC X(01). 000310 01 IJCCA25 PIC X(01). 000320 01 IJCCA26 PIC X(01). 000330 01 IJCCA27 PIC X(01). 000340* メッセージ送信 000350 01 IJCCA34. 000360 02 IJCCA34-1 PIC X(01). 000370 02 IJCCA34-2 PIC X(01). 000380 01 IJCCA35. 000390 02 IJCCA35MSG PIC X(20). 000400 02 IJCCA35NUM PIC 9(06). 000410 02 FILLER PIC X(230). 000420 01 IJCCA36 PIC 9(04). 000430 01 IJCCA37 PIC 9(05). 000440* 使用終了宣言(共通部分のみ) 000450* 解放 000460 01 IJCCA54 PIC X(01). 000470 01 IJCCA55 PIC X(01). 000480*** 信号用IJCC(返信用) *** 000490* 共通 000500 01 IJCCB01 PIC X(128). 000510 01 IJCCB02. 000520 02 IJCCB02-1 PIC X(02). 000530 02 IJCCB02-2 PIC X(02). 000540 01 IJCCB03. 000550 02 IJCCB03-1 PIC X(01). 000560 02 IJCCB03-2 PIC X(02). 000570 02 IJCCB03-3 PIC X(02). 000580 02 IJCCB03-4 PIC X(20). 000590* 生成 000600 01 IJCCB14. 000610 02 IJCCB14-1 PIC X(01). 000620 02 IJCCB14-2 PIC X(01). 000630 02 IJCCB14-3 PIC X(01). 000640 02 FILLER PIC X(01). 000650 01 IJCCB15. 000660 02 IJCCB15-1 PIC 9(05). 000670 02 IJCCB15-2 PIC 9(05). 000680* 使用開始宣言 000690 01 IJCCB24 PIC X(01). 000700 01 IJCCB25 PIC X(01). 000710 01 IJCCB26 PIC X(01). 000720 01 IJCCB27 PIC X(01). 000730* 信号受信 000740 01 IJCCB34 PIC X(01). 000750* 使用終了宣言(共通部分のみ) 000760* 解放 000770 01 IJCCB54 PIC X(01). 000780 01 IJCCB55 PIC X(01). 000790***** キー入力用 ***** 000800 01 ACP1 PIC X(20). 000810 01 ACP2 PIC X(01). 000820 PROCEDURE DIVISION. 000830**************************************************** 000840*** 主処理 *** 000850**************************************************** 000860 MPRG. 000870*** IJCC使用準備 *** 000880 PERFORM IJMINI THRU IJMINIE. 000890 PERFORM IJSINI THRU IJSINIE. 000900*** メッセージ入力 *** 000910 ACCEPT ACP1. 000920*** IJCCでメッセージ送信 *** 000930 PERFORM IJMSND THRU IJMSNDE 000940*** 受け取り確認待ち *** 000950 PERFORM IJSRES THRU IJSRESE 000960 DISPLAY "SUCCESS!!". 000970 ACCEPT ACP2. 000980*** IJCC使用終了 *** 000990 PERFORM IJSEND THRU IJSENDE 001000 PERFORM IJMEND THRU IJMENDE 001010 STOP RUN. 001020*************************************************** 001030****** メッセージ送信用IJCCの処理 ****** 001040*************************************************** 001050 IJMINI. 001060*** IJCC生成 *** 001070 INITIALIZE IJCCA01 IJCCA02 IJCCA03 IJCCA14 IJCCA15 001080 MOVE "A" TO IJCCA03-1 001090 MOVE " " TO IJCCA03-2 001100 MOVE "AA" TO IJCCA03-3 001110 MOVE "TEST-IJCCA" TO IJCCA03-4 001120 MOVE "M" TO IJCCA14-1 001130 MOVE "S" TO IJCCA14-2 001140 MOVE "J" TO IJCCA14-3 001150 MOVE 14 TO IJCCA15-1 001160 MOVE 0 TO IJCCA15-2 001170 CALL "SYSIJCCR" USING IJCCA01 IJCCA02 IJCCA03 001180 IJCCA14 IJCCA15. 001190 IF IJCCA02-1 NOT = "00" 001200 DISPLAY "IJCC A CR ERROR " IJCCA02-1 001210 STOP "NG" 001220 STOP RUN 001230 END-IF. 001240*** IJCC使用開始宣言 *** 001250 INITIALIZE IJCCA24 IJCCA25 IJCCA26 IJCCA27. 001260 MOVE "T" TO IJCCA24 001270 MOVE "S" TO IJCCA25 001280 MOVE "N" TO IJCCA26 001290 MOVE "T" TO IJCCA27 001300 CALL "SYSIJCAT" USING IJCCA01 IJCCA02 IJCCA03 001310 IJCCA24 IJCCA25 IJCCA26 IJCCA27 001320 IF IJCCA02-1 NOT = "00" 001330 DISPLAY "IJCC A AT ERROR " IJCCA02-1 001340 STOP "NG" 001350 STOP RUN 001360 END-IF. 001370 IJMINIE. 001380 EXIT. 001390 IJMSND. 001400*** メッセージ送信 *** 001410 INITIALIZE IJCCA34 IJCCA35 IJCCA36 IJCCA37. 001420 MOVE "N" TO IJCCA34-1 001430 MOVE "W" TO IJCCA34-2 001440 MOVE ACP1 TO IJCCA35MSG 001450 MOVE 1 TO IJCCA35NUM 001460 CALL "SYSIJCSM" USING IJCCA01 IJCCA02 IJCCA03 IJCCA34 001470 IJCCA35 IJCCA36 IJCCA37. 001480 IF IJCCA02-1 NOT = "00" 001490 DISPLAY "IJCC A SD ERROR " IJCCA02-1 001500 STOP "NG" 001510 STOP RUN 001520 END-IF. 001530 IJMSNDE. 001540 EXIT. 001550 IJMEND. 001560*** IJCC使用終了宣言 *** 001570 CALL "SYSIJCDE" USING IJCCA01 IJCCA02 IJCCA03 001580 IF IJCCA02-1 NOT = "00" 001590 DISPLAY "IJCC A DE ERROR " IJCCA02-1 001600 STOP "NG" 001610 STOP RUN 001620 END-IF. 001630*** IJCCの解放 *** 001640 INITIALIZE IJCCA54 IJCCA55. 001650 MOVE "T" TO IJCCA54 001660 MOVE "R" TO IJCCA55 001670 CALL "SYSIJCRL" USING IJCCA01 IJCCA02 IJCCA03 001680 IJCCA54 IJCCA55 001690 IF IJCCA02-1 NOT = "00" 001700 DISPLAY "IJCC A RL ERROR " IJCCA02-1 001710 STOP "NG" 001720 STOP RUN 001730 END-IF. 001740 IJMENDE. 001750 EXIT. 001760*************************************************** 001770****** 信号受信用IJCCの処理 ****** 001780*************************************************** 001790 IJSINI. 001800*** IJCC生成 *** 001810 INITIALIZE IJCCB01 IJCCB02 IJCCB03 IJCCB14 IJCCB15 001820 MOVE "A" TO IJCCB03-1 001830 MOVE " " TO IJCCB03-2 001840 MOVE "AA" TO IJCCB03-3 001850 MOVE "TEST-IJCCB" TO IJCCB03-4 001860 MOVE "S" TO IJCCB14-1 001870 MOVE "S" TO IJCCB14-2 001880 MOVE "J" TO IJCCB14-3 001890 MOVE 1 TO IJCCB15-1 001900 MOVE 0 TO IJCCB15-2 001910 CALL "SYSIJCCR" USING IJCCB01 IJCCB02 IJCCB03 001920 IJCCB14 IJCCB15. 001930 IF IJCCB02-1 NOT = "00" 001940 DISPLAY "IJCC B CR ERROR " IJCCB02-1 001950 STOP "NG" 001960 STOP RUN 001970 END-IF. 001980*** IJCC使用開始宣言 *** 001990 INITIALIZE IJCCB24 IJCCB25 IJCCB26 IJCCB27. 002000 MOVE "T" TO IJCCB24 002010 MOVE "N" TO IJCCB25 002020 MOVE "S" TO IJCCB26 002030 MOVE "T" TO IJCCB27 002040 CALL "SYSIJCAT" USING IJCCB01 IJCCB02 IJCCB03 IJCCB24 002050 IJCCB25 IJCCB26 IJCCB27 002060 IF IJCCB02-1 NOT = "00" 002070 DISPLAY " IJCC B AT ERROR " IJCCB02-1 002080 STOP "NG" 002090 STOP RUN 002100 END-IF. 002110 IJSINIE. 002120 EXIT. 002130 IJSRES. 002140*** 信号受信(待ち) *** 002150 INITIALIZE IJCCB34. 002160 MOVE "W" TO IJCCB34 002170 CALL "SYSIJCRS" USING IJCCB01 IJCCB02 IJCCB03 IJCCB34. 002180 IJSRESE. 002190 EXIT. 002200 IJSEND. 002210*** IJCC使用終了宣言 *** 002220 CALL "SYSIJCDE" USING IJCCB01 IJCCB02 IJCCB03 002230 IF IJCCB02-1 NOT = "00" 002240 DISPLAY "IJCC B DE ERROR " IJCCB02-1 002250 STOP "NG" 002260 STOP RUN 002270 END-IF. 002280*** IJCCの解放 *** 002290 INITIALIZE IJCCB54 IJCCB55. 002300 MOVE "T" TO IJCCB54 002310 MOVE "R" TO IJCCB55 002320 CALL "SYSIJCRL" USING IJCCB01 IJCCB02 IJCCB03 002330 IJCCB54 IJCCB55 002340 IF IJCCB02-1 NOT = "00" 002350 DISPLAY "IJCC B RL ERROR " IJCCB02-1 002360 STOP "NG" 002370 STOP RUN 002380 END-IF. 002390 IJSENDE. 002400 EXIT.
- メッセージ受信側プログラム(IJRESV)
-
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. IJRESV. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060****************************************** 000070*** IJCC DATA AREA *** 000080****************************************** 000090***** メッセージ受信用IJCC **** 000100* 共通 000110 01 IJCCA01 PIC X(128). 000120 01 IJCCA02. 000130 02 IJCCA02-1 PIC X(02). 000140 02 IJCCA02-2 PIC X(02). 000150 01 IJCCA03. 000160 02 IJCCA03-1 PIC X(01). 000170 02 IJCCA03-2 PIC X(02). 000180 02 IJCCA03-3 PIC X(02). 000190 02 IJCCA03-4 PIC X(20). 000200* 使用開始宣言 000210 01 IJCCA24 PIC X(01). 000220 01 IJCCA25 PIC X(01). 000230 01 IJCCA26 PIC X(01). 000240 01 IJCCA27 PIC X(01). 000250* 受信 000260 01 IJCCA34. 000270 02 IJCCA34-1 PIC X(01). 000280 02 IJCCA34-2 PIC X(01). 000290 01 IJCCA35. 000300 02 IJCCA35MSG PIC X(20). 000310 02 IJCCA35NUM PIC 9(06). 000320 02 FILLER PIC X(230). 000330 01 IJCCA36 PIC 9(04). 000340 01 IJCCA37 PIC 9(05). 000350* 使用終了宣言 000360*** 信号用IJCC(返信用) *** 000370* 共通 000380 01 IJCCB01 PIC X(128). 000390 01 IJCCB02. 000400 02 IJCCB02-1 PIC X(02). 000410 02 IJCCB02-2 PIC X(02). 000420 01 IJCCB03. 000430 02 IJCCB03-1 PIC X(01). 000440 02 IJCCB03-2 PIC X(02). 000450 02 IJCCB03-3 PIC X(02). 000460 02 IJCCB03-4 PIC X(20). 000470* 使用開始宣言 000480 01 IJCCB24 PIC X(01). 000490 01 IJCCB25 PIC X(01). 000500 01 IJCCB26 PIC X(01). 000510 01 IJCCB27 PIC X(01). 000520* 信号送信 000530 01 IJCCB34. 000540 02 IJCCB34-1 PIC X(01). 000550 02 IJCCB34-2 PIC X(01). 000560* 使用終了宣言 000570* キー入力 000580 01 ACP1 PIC X(01). 000590 PROCEDURE DIVISION. 000600 MPRG. 000610*** IJCC使用準備 *** 000620 PERFORM IJMINI THRU IJMINIE 000630 PERFORM IJSINI THRU IJSINIE 000640*** IJCCでメッセージ受信 *** 000650 PERFORM IJMRES THRU IJMRESE 000660*** 受け取った確認信号送信 *** 000670 PERFORM IJSSND THRU IJSSND 000680*** 受信したメッセージ内容を表示 *** 000690 DISPLAY IJCCA35MSG 000700 DISPLAY IJCCA35NUM 000710*** IJCC使用終了 *** 000720 PERFORM IJMEND THRU IJMENDE 000730 PERFORM IJSEND THRU IJSENDE 000740*** 何かキーを押したら終了 *** 000750 ACCEPT ACP1 000760 STOP RUN. 000770*********************************************** 000780**** メッセージ受信用IJCCの処理 **** 000790*********************************************** 000800 IJMINI. 000810*** IJCC使用開始宣言 *** 000820 INITIALIZE IJCCA01 IJCCA02 IJCCA03 IJCCA24 IJCCA25 000830 IJCCA26 IJCCA27. 000840 MOVE "A" TO IJCCA03-1 000850 MOVE " " TO IJCCA03-2 000860 MOVE "AA" TO IJCCA03-3 000870 MOVE "TEST-IJCCA" TO IJCCA03-4 000880 MOVE "T" TO IJCCA24 000890 MOVE "N" TO IJCCA25 000900 MOVE "S" TO IJCCA26 000910 MOVE "T" TO IJCCA27 000920 CALL "SYSIJCAT" USING IJCCA01 IJCCA02 IJCCA03 IJCCA24 000930 IJCCA25 IJCCA26 IJCCA27 000940 IF IJCCA02-1 NOT = "00" 000950 DISPLAY " IJCC A AT ERROR " IJCCA02-1 000960 STOP "NG" 000970 STOP RUN 000980 END-IF. 000990 IJMINIE. 001000 EXIT. 001010 IJMRES. 001020*** メッセージの受信 *** 001030 INITIALIZE IJCCA34 IJCCA35 IJCCA36 IJCCA37. 001040 MOVE "W" TO IJCCA34 001050 CALL "SYSIJCRM" USING IJCCA01 IJCCA02 IJCCA03 IJCCA34 001060 IJCCA35 IJCCA36 IJCCA37. 001070 IF IJCCA02-1 NOT = "00" 001080 DISPLAY "IJCC A RM ERROR " IJCCA02-1 001090 STOP "NG" 001100 STOP RUN 001110 END-IF. 001120 IJMRESE. 001130 EXIT. 001140 IJMEND. 001150*** IJCC使用終了宣言 *** 001160 CALL "SYSIJCDE" USING IJCCA01 IJCCA02 IJCCA03 001170 IF IJCCA02-1 NOT = "00" 001180 DISPLAY "IJCC A DE ERROR " IJCCA02-1 001190 STOP "NG" 001200 STOP RUN 001210 END-IF. 001220 IJMENDE. 001230 EXIT. 001240*********************************************** 001250**** 信号送信用IJCCの処理 **** 001260*********************************************** 001270 IJSINI. 001280*** IJCC使用開始宣言 *** 001290 INITIALIZE IJCCB01 IJCCB02 IJCCB03 IJCCB24 IJCCB25 001300 IJCCB26 IJCCB27. 001310 MOVE "A" TO IJCCB03-1 001320 MOVE " " TO IJCCB03-2 001330 MOVE "AA" TO IJCCB03-3 001340 MOVE "TEST-IJCCB" TO IJCCB03-4 001350 MOVE "T" TO IJCCB24 001360 MOVE "S" TO IJCCB25 001370 MOVE "N" TO IJCCB26 001380 MOVE "T" TO IJCCB27 001390 CALL "SYSIJCAT" USING IJCCB01 IJCCB02 IJCCB03 IJCCB24 001400 IJCCB25 IJCCB26 IJCCB27 001410 IF IJCCB02-1 NOT = "00" 001420 DISPLAY "IJCC B AT ERROR " IJCCB02-1 001430 STOP "NG" 001440 STOP RUN 001450 END-IF. 001460 IJSINIE. 001470 EXIT. 001480 IJSSND. 001490*** 信号送信 *** 001500 INITIALIZE IJCCB34. 001510 MOVE "N" TO IJCCB34-1 001520 MOVE "W" TO IJCCB34-2 001530 CALL "SYSIJCSS" USING IJCCB01 IJCCB02 IJCCB03 IJCCB34 001540 IF IJCCB02-1 NOT = "00" 001550 DISPLAY "IJCC B SS ERROR " IJCCB02-1 001560 STOP "NG" 001570 STOP RUN 001580 END-IF. 001590 IJSSNDE. 001600 EXIT. 001610 IJSEND. 001620*** IJCC使用終了宣言 *** 001630 CALL "SYSIJCDE" USING IJCCB01 IJCCB02 IJCCB03 001640 IF IJCCB02-1 NOT = "00" 001650 DISPLAY "IJCC B DE ERROR " IJCCB02-1 001660 STOP "NG" 001670 STOP RUN 001680 END-IF. 001690 IJSENDE. 001700 EXIT.
- ●プログラムの簡単な説明
-
まず、IJCCを生成します。生成するIJCCは2つ、TEST−IJCCAという名前のメッセージ付きIJCCとTEST−IJCCBという名前のメッセージなしIJCCです。
TEST−IJCCAは、IJSENDでキー入力された文字列をIJRESVに渡すためのIJCCです。
TEST−IJCCBは、IJRESVからメッセージを受け付けたことをIJSENDに知らせるためのIJCCです。一般管理用のメッセージなしIJCCです。
サンプルプログラムではIJSENDの方で行っています。
次にIJSENDとIJRESVから、「生成した2つのIJCC」に使用開始宣言を行います。これによって各プログラムからIJCCを使用することができるようになります。
そしてIJSEND側で20文字分のキー入力を行います。ここで入力した文字列がメッセージとしてIJRESV側に送られることになります。
IJSENDからメッセージの送信を行います。英数字項目以外にも数字も送れますということを確認する為に、サンプルプログラムではキー入力した文字列の他に数字も送っています。
一方IJRESVではメッセージの受信を行います。サンプルプログラムでは、「メッセージが送られていない時は送られてくるまで待つ」という指定で受信を行っています。
IJRESV側はメッセージを受け取ったら、「受け取ったよ」という返事をIJSEND側に返します。メッセージは貯めることができるので非同期に送受信することもできますが、今回は送り手と受け手が同期を取っているという作りになっています。
一般管理用の信号通信の例として、返事はメッセージではなく信号通信の方を使っています。
メッセージを受けた方(IJRESV)は、受け取ったメッセージを画面表示します。
これでIJCCは使用しないので、IJSEND、IJRESVの両方で使用終了宣言を行います。
最後に2つのIJCCを解放(削除)します。サンプルプログラムではIJSEND側で行っています。
- ●サンプルプログラムの実行
-
まず、IJSENDを実行します。
下の図はIJSENDを起動する例です。
IJSENDを実行したところ。画面下側に文字列を入力する為の行が出る。
次にIJRESVを実行します。
画面切離コマンドを実行して、新しいRUNコマンド入力画面を表示して、そこからIJRESVを起動します。
IJRESVを実行したところです。まだIJSENDがメッセージを送っていないので、メッセージの受信待ちをしています。
画面接続をして、IJSENDの画面にしてください。(システムの状態によっては、IJSENDの画面になるまで、画面接続を複数回実行しなければならないかもしれません。)
何か文字列を入力してみます。
「SUCCESS!!」と画面に出たら、たぶんメッセージの送信に成功しています。
画面接続して、IJRESVの画面を見てみましょう。
IJRESVの画面です。うまくメッセージの受信をしていれば、画面に入力した文字列が表示されているはずです。
IJSENDとIJRESVは何かキーを押すと終了します。
このサンプルプログラムは、エラーが発生するとプログラムがそのまま終わってしまうので、送信中のデータが消滅してしまいます。実際はもうちょっと堅牢に作ることになるでしょう。