Monitoring AP/Pro - Part I
By Nathan Rector
Last January I was one of the first people to jump on the band wagon and get AP/Pro. With all the extras that Advanced Pick had I was ecstatic and really looking forward to working with the Advanced Pick.
Although I lost some of the functions that I had on my Old Mini computer, AP/Pro presented me with more way and better way to deal with the problems I was having on my old system.
One of them was due to old and bad wiring. Because of the environment in which I had my terminals and how old they were, every once and a while a wire would break loose in the connecters and cause feed back into the computer.
One the old system, this feedback would start chomping away at the CPU and soon bring the computer to halt. Although, on AP/Pro I am using Digiboards which don't use the CPU to manage the display of the terminals connected to it, but the feedback would start eating away at the processing of the Digiboard and bring all the terminals connected to that board to a halt. Once the irate coworkers got a hold of me, I would have to spend 30min trying to find what terminal is causing the problem; a little hard to do with close to 50 cables to search through.
After doing some investigating, I found how the Digiboard works and was able to come up with a little program to help me monitor and insolate the terminal that would cause this problem.
The Digiboard, and most all other Intelligent Serial Boards, you a small section of memory to help manage the display. By reading this area of memory you can tell which terminals are demanding all the processing of the Serial Board.
The program is rather simple in that it will automaticly know if you have installed another Intelligent Serial Board with out you having to change the program. How this is done is by reading the configuration of the system, and then checking for any new cards.
The Intelligent ports that this program will work with leaves a reference of which ports are being used the most in memory. These port addresses are stored in Hex and are the port on the concentrators, not the port numbers that Pick uses. For example, Pick Port number 3 can actually be the first port on the first concentrator, or Pick Port number 19 may actually be the third port on the second concentrator.
The example in Figure #1 is the display of this program. You will notice that it displays which concentrator and the port number on the concentrator and the referencing Pick Port number (Pid). It also show the active on that port. Under the label 'Activ' is the number of times the port was found in memory, and the percentage next to it displays the percentage of the total memory this board has the port is using.
The next peace of data would tell your if the port is logged on and who is currently logged onto that port. This helps you find the physical location of the terminal in the building, which a lot of the time is the most challenging.
This program can be a life save for any MIS department or System Administrator by locating and display where feedback is occurring.
001 * Display active ports on intelligent boards (Digiboard CX, Xem, ClusterPort, Comstax)
002 * WARNING: this program uses USER-EXITs. Do NOT alter the syntex this program uses to
003 equ readmem to 'UB0BA'
004 equ readsystemconfig to 'U5D'
005 equ inqry.cmd to 0
006 equ cmd.sconfig to 20
007 equ maxportno to 16
008 equ am to char(254), vm to char(253), svm to char(252)
010 * Serial card typs
011 * 26- CX/Exm/Cluster/COMStax
013 * Data definitions - Memory read displayed in Hex
014 * concentrator ports '00' thru '0f' are on the 1st concentrator
015 * concentrator ports '10' thru '1f' are on the 2nd concentrator
016 * concentrator ports '20' thru '2f' are on the 3rd concentrator
017 * concentrator ports '30' thru '3f' are on the 4th concentrator
019 * Ex: Port #34 is the 4th port on the 3rd concentrator
020 * Port #37 is the *th port on the 4th concentrotor
022 crt @(-1): ;* clears screen
023 TIMES = 0 ; options = SYSTEM(15)
025 BOARDS = "" ;* base memory :vm: memory address :vm: first Port# :vm: last Port#
026 systemconfig = oconv(inqury.cmd :am: cmd.sconfig,readsystemconfig)
027 no.serial.installed = dcount(systemconfig,am) - 1
028 first.port = 1
029 if no.serial.installed > 0 then
030 for board = 2 to no.serial.installed + 1
031 last.port = first.port + xtd(systemconfig<board,5>) - 1
032 boardID = xtd(systemconfig<board,2>)
034 *** checks to see if this is an Intelligent Board or not. If so, then Add
036 if boardID = 26 then ;* intelligent Board
037 BOARDS<-1> = systemconfig<board,3> :vm: systemconfig<board,4> :vm:
first.port :vm: last.port
039 first.port = last.port + 1
040 next board
042 if BOARDS = "" then goto 50
043 end else
045 crt "No Digiboard CX, Xem, ClusterPort, COMStax Intelligent Boards Installed."
046 goto 900
049 *** Reads the memory Location for each board
052 for board = 1 to board + 1 until BOARDS<board> = ""
053 *setup memory address to read *WARNING* do not alter this information
054 var = ""
055 var<1> = BOARDS<board,2> ;* memory addres
056 var<2> = '0800' ;* offset of port events queue
057 var<3> = 0 ;* this will be replaced by byte from memory
058 * Reads and saves the display information
060 active = ""
061 for i = 1 to 16
062 for j = 1 to 16
063 portnum = oconv(var,readmem)<3>
064 active<board,xtd(portnum) + 1> = active<board,xtd(portnum)> + 1
065 var<2> = dtx(xtd(var<2>)+4) 'r%4" ;* offset inc by 1
066 next j
067 next i
068 next board
070 *** Display results
080 TIMES = TIMES + 1 ; row = 1
081 crt @(0,0) : "(Type 'X' to exit) Snapshot of active ports on Intelligent Board: ": TIMES
082 for board = 1 to board + 1 until BOARDS<board> = ""
083 crt @(0,row) : "Intelligent Board # ": board :" Ports: ": BOARDS<board,3> :" - ":
084 crt @(0,row + 1) : "Pid. Con Port Activ Date Time Who":
085 row = row + 2
087 num = dcount(active<board>,vm)
088 for i = 1 to num
089 if not(active<board,i> = "") then
090 begin case
091 case i >= 1 and i <= max.port.no ; concentrator = 1 ;
port = i
092 case i >= (max.port.no + 1) and i <= (max.port.no * 2) ; concentrator = 2 ;
port = i - max.port.no
093 case i >= (max.port.no * 2) + 1 and i <= (max.port.no * 3) ; concentrator = 3
; port = i - (max.port.no * 2)
094 case i >= (max.port.no * 3) + 1 and i <= (max.port.no * 4) ; concentrator = 4
; port = i - (max.port.no * 3)
095 end case
096 pid = BOARDS<board,3> + i - 1 ;* Finds the Pick port#
098 execute \LIST PIBS "\: pid :\" md-date md-time location (icb\ capturing output
099 display = pid 'r#4' :" ": concentrator 'r#3' :" ": port 'r#8'
100 display = display :" ": active<board,1> 'r#5'
101 display = display :" ": (int(active<board,i> / 256) * 100) :"%") 'r#5'
102 display = display :" ": output[1,40]
103 crt @(0,row) : display 'L#79' :
104 row = row + 1
106 next i
107 next board
108 crt @(0,row) : @(-4) :
110 begin case
111 case index(options,"s",1)
113 case system(14) ;* any key pressed
114 input junk,1 :
115 if junk = "X" then stop
116 end case
117 goto 100
fig #1 (This is and example of the Finished Screen)
(Type 'X' to exit) Snapshot of active ports on intelligent board: 1
Intelligent board #1 Ports: 3 - 66
Pid. Con Port Activ Date Time Who
14 1 12 65 25% 10/02 7:52 Staci Frick Register
15 1 13 191 74% 10/03 19:28 Nate Rector Modem - 839-9602