[an error occurred while processing this directive]

HP OpenVMS Systems

ask the wizard
Content starts here

COBOL calling system services?

» close window

The Question is:

 
I want to use sys$qio to "speak" with a bizerba's scales...in cobol,
crossing a decserv 200 Mc....
 
My difficulty it's to code the terminateur ???
I must set the bit 27 (EOB) ??? how can i do that ??
 
can you send me a example of the data format
of the variable and the MOVE sentence to set the terminateur ...
 
thanks
 
PS : If you have a cobol's program examples I'm very interested ;-)
 


The Answer is :

 
  Please contact the customer support center for assistance, and please
  check for available examples on DSN/DSNlink -- DSN is an excellent
  source of programming examples.
 
  The terminator is a bitmask.  That means that you need to set the 27th
  bit in the bitmask, which means that -- among other approaches -- you
  can load an integer value into the proper portion of the bitmask that
  has just the 27th bit set.  (Bit 27 is hexidecimal 08000000, decimal
  134217728.)
 
  COBOL is not generally known as the easiest of languages for making
  OpenVMS system service calls from -- programmers in other languages
  generally have a somewhat easier time than COBOL programmers.
 
  The following is an example of how to trap broadcast messages from
  COBOL, via calls to various system services including sys$qio.  The
  example consists of three COBOL modules.
 
    1 TRAP_BROADCAST.COB, which performs:
        Create the mailbox,
        Associate the mailbox with the terminal,
        Get and save the terminal characteristics,
        Set Terminal /NOBROAD/BRDCSTMBX,
        Declare a write attention AST,
        Hibernate,
        Restore the terminal characteristics,
        Exit.
 
    2 SETWRTAST.COB, a subroutine which performs:
        Declare MAILBOX_AST as the write attention AST.
 
    3 MAILBOX_AST.COB, which is activated for each AST, and performs:
        Read message,
	When the message is retrieved succesfully:
	  Display the message
	  Read message
	Redeclare the write attention AST
	Wake up if message contains the text "EXIT PLEASE"
	Return
 
 
IDENTIFICATION DIVISION.
PROGRAM-ID. HEIN VAN DEN HEUVEL.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01	ONE		PIC S9(9) COMP VALUE 1.
01	TT2$V_BRDCSTMBX	PIC S9(9) COMP VALUE 4.
01	TT$V_NOBRDCST	PIC S9(9) COMP VALUE 17.
01	IO$_SETMODE	PIC S9(9) COMP VALUE EXTERNAL IO$_SETMODE.
01	IO$_SENSEMODE 	PIC S9(9) COMP VALUE EXTERNAL IO$_SENSEMODE.
01	SS$_NORMAL	PIC S9(9) COMP VALUE EXTERNAL SS$_NORMAL.
01	ALL_CHARACTERISTICS.
  03	FILLER		PIC S9(9) COMP.
  03	CHARACTERISTICS	PIC S9(9) COMP.
  03	EXTENDED_CHAR	PIC S9(9) COMP.
01	ALL_CHAR REDEFINES ALL_CHARACTERISTICS PIC X(12).
01	SAVE_CHAR	PIC X(12).
01	IO_STATUS_BLOCK.
  03	IO_STAT		PIC S9(4) COMP.
  03	FILLER		PIC X(6).
01	TT_CHAN		PIC S9(9) COMP.
01	MBX_CHAN	PIC S9(9) COMP.
01	ST		PIC S9(9) COMP.
*	SETWRTAST		PIC S9(4) COMP VALUE EXTERNAL acms$k_proc_io_method.
PROCEDURE DIVISION.
MAIN-program SECTION.
BEGIN-HERE.
	CALL "SYS$CREMBX" USING 	OMITTED,
			BY REFERENCE	MBX_CHAN,
					OMITTED,OMITTED,OMITTED,OMITTED,
			BY DESCRIPTOR	"BROADCAST_MAILBOX"
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	CALL "SYS$ASSIGN" USING
			BY DESCRIPTOR	"TT",
			BY REFERENCE	TT_CHAN, OMITTED,
			BY DESCRIPTOR	"BROADCAST_MAILBOX"
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	CALL "SETWRTAST" USING MBX_CHAN, IO_STAT.
 
* Get and save current terminal characteristics, then
* Set NOBROADCAST and BRDCSTMBX characteristics.
 
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	TT_CHAN,
			BY VALUE 	IO$_SENSEMODE,
			BY REFERENCE	IO_STAT, OMITTED, OMITTED, ALL_CHAR,
			BY VALUE	12, OMITTED, OMITTED, OMITTED, OMITTED
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	MOVE ALL_CHAR TO SAVE_CHAR
 
* How the F*** does one simply set a single bit in cobol ??!!
 
	CALL "LIB$INSV" USING ONE, TT$V_NOBRDCST, ONE, CHARACTERISTICS.
	CALL "LIB$INSV" USING ONE, TT2$V_BRDCSTMBX, ONE, EXTENDED_CHAR.
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	TT_CHAN,
			BY VALUE 	IO$_SETMODE,
			BY REFERENCE	IO_STAT, OMITTED, OMITTED, ALL_CHAR,
			BY VALUE	12, OMITTED, OMITTED, OMITTED, OMITTED
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	CALL "SYS$HIBER".
 
* Clean up, Restore terminal characteristics.
 
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	TT_CHAN,
			BY VALUE 	IO$_SETMODE,
			BY REFERENCE	IO_STAT, OMITTED, OMITTED, SAVE_CHAR,
			BY VALUE	12, OMITTED, OMITTED, OMITTED, OMITTED
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	EXIT PROGRAM.
 
IDENTIFICATION DIVISION.
PROGRAM-ID. SETWRTAST.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01	MAILBOX_AST	PIC S9(9) COMP VALUE EXTERNAL MAILBOX_AST.
01	IO$_SETMODE	PIC S9(9) COMP VALUE EXTERNAL IO$_SETMODE.
01	IO$M_WRTATTN	PIC S9(9) COMP VALUE EXTERNAL IO$M_WRTATTN.
01	IO_ATTENTION	PIC S9(9) COMP.
LINKAGE SECTION.
01	MBX_CHAN	PIC S9(9) COMP.
01	MBX_STAT	PIC S9(9) COMP.
PROCEDURE DIVISION USING MBX_CHAN, MBX_STAT.
A.
	MOVE IO$_SETMODE TO IO_ATTENTION.
	ADD IO$M_WRTATTN TO IO_ATTENTION.
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	MBX_CHAN,
			BY VALUE 	IO_ATTENTION,
			BY REFERENCE	MBX_STAT, OMITTED, OMITTED,
			BY VALUE	MAILBOX_AST,
			BY REFERENCE	MBX_CHAN,
					OMITTED, OMITTED, OMITTED, OMITTED
	EXIT PROGRAM.
 
IDENTIFICATION DIVISION.
PROGRAM-ID. MAILBOX_AST.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01	MBX_BUFSIZ	PIC S9(9) COMP VALUE 200.
01	SS$_NORMAL	PIC S9(9) COMP VALUE EXTERNAL SS$_NORMAL.
01	SS$_ENDOFFILE	PIC S9(9) COMP VALUE EXTERNAL SS$_ENDOFFILE.
01	IO$M_NOW	PIC S9(9) COMP VALUE EXTERNAL IO$M_NOW.
01	IO$_READVBLK	PIC S9(9) COMP VALUE EXTERNAL IO$_READVBLK.
01	IO_READ		PIC S9(9) COMP.
01	EXIT_FLAG	PIC S9(9) COMP.
01	MBX_STATUS_BLOCK.
  03	MBX_STATUS	PIC S9(4) COMP.
  03	MBX_BYTECOUNT	PIC S9(4) COMP.
  03	FILLER		PIC S9(9) COMP.
01	MBX_MESSAGE.
  03	MESSAGE_TYPE	PIC S9(4) COMP.
  03	UNIT_NUMBER	PIC S9(4) COMP.
  03 	NAME_LENGTH	PIC X.
  03	CONTROLLER_NAME	PIC X(15).
  03	MESSAGE_LENGTH	PIC S9(4) COMP.
  03	MESSAGE_TEXT	PIC X(200).
01	ST		PIC S9(9) COMP.
LINKAGE SECTION.
01	MBX_CHAN	PIC S9(9) COMP.
01	R0		PIC S9(9) COMP.
01	R1		PIC S9(9) COMP.
01	PC		PIC S9(9) COMP.
01	PSL		PIC S9(9) COMP.
PROCEDURE DIVISION USING MBX_CHAN, R0, R1, PC, PSL.
A.
	MOVE IO$_READVBLK TO IO_READ.
	ADD IO$M_NOW TO IO_READ.
       	DISPLAY "MAILBOX message!"
	MOVE SPACES TO MESSAGE_TEXT.
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	MBX_CHAN,
			BY VALUE 	IO_READ,
			BY REFERENCE	MBX_STATUS, OMITTED, OMITTED,
					MBX_MESSAGE,
			BY VALUE	MBX_BUFSIZ,
					OMITTED, OMITTED, OMITTED, OMITTED,
			GIVING ST.
			IF ST IS FAILURE THEN CALL "SYS$EXIT" USING BY VALUE ST.
	PERFORM PRINT_MESSAGE UNTIL MBX_STATUS IS NOT EQUAL TO SS$_NORMAL.
    	IF MBX_STATUS IS EQUAL TO SS$_ENDOFFILE THEN
		CALL "SETWRTAST" USING MBX_CHAN, MBX_STATUS
	ELSE
		CALL "SYS$EXIT" USING BY VALUE ST.
	INSPECT MESSAGE_TEXT TALLYING EXIT_FLAG FOR ALL "EXIT PLEASE".
	IF EXIT_FLAG IS GREATER THAN ZERO THEN
		CALL "SYS$WAKE" USING OMITTED, OMITTED.
	EXIT PROGRAM.
 
PRINT_MESSAGE.
	DISPLAY "MESSAGE_TYPE : ", MESSAGE_TYPE WITH CONVERSION.
	DISPLAY "NAME         : ", CONTROLLER_NAME.
        DISPLAY "LENGTH       : ", MESSAGE_LENGTH WITH CONVERSION.
        DISPLAY "MESSAGE_TEXT : ", MESSAGE_TEXT.
	CALL "SYS$QIOW" USING		OMITTED,
			BY VALUE 	MBX_CHAN,
			BY VALUE 	IO_READ,
			BY REFERENCE	MBX_STATUS, OMITTED, OMITTED,
					MBX_MESSAGE,
			BY VALUE	MBX_BUFSIZ,
					OMITTED, OMITTED, OMITTED, OMITTED,
			GIVING ST.
END_PRINT_MESSAGE.
 

answer written or last revised on ( 4-SEP-1998 )

» close window