MI 命令を RPG で使う/製品情報を API で取得する (V5R4)

ILE であれば RPG や CL で MI命令を使用することができます。

システムやマシンの情報など、MI命令でないと取ってこれないものもあるので、今回はそうした例を使って RPG での MI命令の使い方を見てみたいと思います。


マシン情報の取得

MI(Machine Interface) 命令の使い方については、インフォメーション・センターの「i5/OS Machine Interface」に記載があります。

i5/OS Machine Interface Instructions」の Materialize Machine Attributes (MATMATR) を参照してみてください。
今回は Vital product Data (Hex 012C) 情報を取得しています。

OS のリリース情報の取得

OS のリリース情報は QSZRTVPR という API で取得できますので、これを利用します。

Retrieve Product Information (QSZRTVPR) API


  Required Parameter Group:

1 Receiver variable Output Char(*)
2 Length of receiver variable Input Binary(4)
3 Format name Input Char(8)
4 Product information Input Char(*)
5 Error code I/O Char(*)

  Optional Parameter:

6 Product information format name Input Char(8)

  Default Public Authority: *USE

  Threadsafe: No

こんな情報が取れます。

PRDR0100 Format

If the product load is not known to the system, an error (CPF0C1F) will occur.
Offset Type Field
Dec Hex
0 0 BINARY(4) Bytes returned
4 4 BINARY(4) Bytes available
8 8 BINARY(4) Reserved
12 C CHAR(7) Product ID
19 13 CHAR(6) Release level
25 19 CHAR(4) Product option
29 1D CHAR(4) Load ID
33 21 CHAR(10) Load type
43 2B CHAR(10) Symbolic load state
53 35 CHAR(10) Load error indicator
63 3F CHAR(2) Load state
65 41 CHAR(1) Supported flag
66 42 CHAR(2) Registration type
68 44 CHAR(14) Registration value
82 52 CHAR(2) Reserved
84 54 BINARY(4) Offset to additional information
88 58 CHAR(4) Primary language load identifier
92 5C CHAR(6) Minimum target release
98 62 CHAR(6) Minimum VRM of *BASE required by option
104 68 CHAR(1) Requirements met between base and option value
105 69 CHAR(3) Level
108 6C CHAR(*) Reserved

プログラミング例

メモリーとプロセッサーの情報については複数ある場合もあるので配列になっているのですが、今回はあくまでシンプルにしようと考えて最初のひとつのみの情報を取ってきています。

     H BNDDIR('QC2LE') DFTACTGRP(*NO)                                                               
                                                                                                    
     D sndMsg          PR                                                                           
     D   msgText                     80    const                                                    
                                                                                                    
     D matmatr         PR                  EXTPROC('matmatr')                                       
     D   atr                           *   VALUE                                                    
     D   atrlen                       5I 0 VALUE                                                    
                                                                                                    
     D rtvprdinf       PR                  extpgm('QSZRTVPR')                                       
     D   rcvvar                   65535    options(*varsize)                                        
     D   rcvvarlen                   10i 0 const                                                    
     D   fmtname                      8a   const                                                    
     D   prdinf                   65535    options(*varsize)                                        
     D   errcode                           like(APIerr)                                             
                                                                                                    
     D PRDR0100        DS                  Qualified                                                
     D  BytesRtnd                    10i 0 inz(0)                                                   
     D  BytesAvail                   10i 0 inz(0)                                                   
     D  rsvd                         10i 0                                                          
     D  prodID                        7a                                                            
     D  rlslvl                        6a                                                            
     D  prodOpt                       4a                                                            
     D  loadId                        4a                                                            
     D  loadType                     10a                                                            
     D  symloadstt                   10a                                                            
     D  loaderrind                   10a                                                            
     D  loadstt                       2a                                                            
     D  supflg                        1a                                                            
     D  regType                       2a                                                            
     D  regval                       14a                                                            
     D  rsvd2                         2a                                                            
     D  ofs2more                     10i 0                                                          
     D  priLangloadid                 4a                                                            
     D  minTgtRls                     6a                                                            
     D  minVRMbase                    6a                                                            
     D  reqBaseOpt                    1a                                                            
     D  level                         3a                                                            
                                                                                                    
     D PRDI0100        DS                  Qualified                                                
     D  prodID                        7a   inz('*OPSYS')                                            
     D  rlslvl                        6a   inz('*CUR')                                              
     D  prodopt                       4a   inz('0000')                                              
     D  loadID                       10a   inz('*CODE')                                             
                                                                                                    
     D MCHATR          DS                  Qualified                                                
     D   BytesUser                   10i 0 inz(0)                                                   
     D   BytesAvail                  10i 0 inz(0)                                                   
     D   MMATR_VPD                 4096                                                             
                                                                                                    
     D VPD_Data        DS                  INZ                                                      
     D  vRsvd                         8                                                             
     D  vOfsMem                      10i 0                                                          
     D  vOfsPrc                      10i 0                                                          
     D  vOfsCol                      10i 0                                                          
     D  vOfsCEC                      10i 0                                                          
     D  vOfsPNL                      10i 0                                                          
     D  vRsvd2                       12                                                             
     D  vMemInstalled                 5i 0                                                          
     D  vMemRequired                  5i 0                                                          
                                                                                                    
     d memVPD          DS                  INZ                                                      
     d  mUsable                       5i 0                                                          
     d  mMinReqrd                     5i 0                                                          
     d  mTotalUsable                  5u 0                                                          
     d  mTotalMinReq                  5u 0                                                          
                                                                                                    
     d prcVPD          DS                  INZ                                                      
     d  prStatus                      4a                                                            
     d  prCCIN                        4a                                                            
     d  prModel                       4a                                                            
     d  prPno                        12a                                                            
     d  prRsvd                        4a                                                            
     d  prManufactID                  4a                                                            
     d  prRsvd2                       4a                                                            
     d  prSerialNo                   10a                                                            
     d  prRsvd3                      34a                                                            
                                                                                                    
     d cecVPD          DS                  INZ                                                      
     d  cCEC_read                     4a                                                            
     d  cManufactID                   4a                                                            
     d  cRsvd                         4a                                                            
     d  cSysType                      4a                                                            
     d  cModel                        4a                                                            
     d  cPseudoModel                  4a                                                            
     d  cGroupId                      4a                                                            
     d  cRsvd2                        4a                                                            
     d  cSysTypeExt                   1a                                                            
     d  cFeatureCode                  4a                                                            
     d  cSerialNo                    10a                                                            
     d  cRsvd3                        1a                                                            
                                                                                                    
     d panelVPD        DS                  INZ                                                      
     d  pRsvd                         2a                                                            
     d  pPanelType                    4a                                                            
     d  pModel                        3a                                                            
     d  pPart                        12a                                                            
     d  pRsvd2                        4a                                                            
     d  pManufactID                   4a                                                            
     d  pROS_Part                    12a                                                            
     d  pROS_Card                    10a                                                            
     d  pROS_ID                       1a                                                            
     d  pROS_Flag                     1a                                                            
     d  pROS_Fix                      1a                                                            
     d  pSerialNo                    10a                                                            
                                                                                                    
     D option_VPD      S              5i 0 INZ(x'012c')                                             
                                                                                                    
     D APIErr          DS                  Qualified                                                
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  ErrLen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                            
     D  rsvd                          1a                                                            
     D  ErrData                   32767a                                                            
                                                                                                    
      /free                                                                                         

         // Get Machine Information                                                                                           
         MCHATR.BytesUser =  %SIZE(MCHATR) ;                                                                                                                                                            
         matmatr( %ADDR(MCHATR)                                                                     
                 :option_VPD ) ;                                                                    
                                                                                                    
         VPD_Data = %subst(MCHATR.MMATR_VPD: 1: %len(VPD_Data)) ;                                   
                                                                                                    
         memVPD   = %subst(MCHATR.MMATR_VPD: vOfsMem-7: %len(memVPD)) ;                             
         prcVPD   = %subst(MCHATR.MMATR_VPD: vOfsPrc-7: %len(prcVPD)) ;                             
         cecVPD   = %subst(MCHATR.MMATR_VPD: vOfsCEC-7: %len(cecVPD)) ;                             
         panelVPD = %subst(MCHATR.MMATR_VPD: vOfsPNL-7: %len(panelVPD)) ;                           

         // Get Product Information                                                                                                                                                                                               
         rtvprdinf  (PRDR0100                                                                       
                    :%size(PRDR0100)                                                                
                    :'PRDR0100'                                                                     
                    :PRDI0100                                                                       
                    :APIErr ) ;                                                                     
                                                                                                    
         // Show Information                                                                                                                                                                                               
         sndMsg('タイプ '     + %trim(cSystype) +                                                     
                'モデル '    + %trim(cModel) +                                                       
                '機械グループ ' + %trim(cGroupID) +                                                     
                'フィーチャー ' + %trim(cFeatureCode) +                                                 
                'シリアル '  + %trim(cSerialNo) +                                                    
                'メモリーサイズ '  + %trim(                                                                
                              %editc(vMemInstalled:'Z')) + 'MB' +                                 
                'リリース '     + %trim(PRDR0100.rlslvl) )  ;                                                                                                           
         *inLR  =  *on  ;                                                                           
         return ;                                                                                   
                                                                                                    
      /end-free                                                                                     
                                                                                                    
     PsndMsg           b                                                                            
     DsndMsg           pi                                                                           
     D text                          80    const                                                    
                                                                                                    
     D sndpgmmsg       PR                  extpgm('QMHSNDPM')                                       
     D  msgID                         7                                                             
     D  msgF                         20                                                             
     D  msgData                            like(text)                                               
     D  msgDataLen                   10i 0                                                          
     D  msgType                      10                                                             
     D  msgStackEnt                  10                                                             
     D  msgStackCnt                  10i 0                                                          
     D  msgKey                        4                                                             
     D  msgErr                             like(APIErr)                                             
                                                                                                    
     D msgID           s              7    inz('CPF9898')                                           
     D msgF            s             20    inz('QCPFMSG   *LIBL     ')                              
     D msgData         s                   like(text)                                               
     D msgDataLen      s             10i 0 inz(%size(msgData))                                      
     D msgType         s             10    inz('*INFO')                                             
     D msgStackEnt     s             10    inz('*')                                                 
     D msgStackCnt     s             10i 0 inz(3)                                                   
     D msgKey          s              4                                                             
     D msgErr          s                   like(APIErr)                                             
                                                                                                    
      /free                                                                                         
         msgData = text  ;                                                                          
                                                                                                    
         sndpgmmsg ( msgID                                                                          
                   : msgF                                                                           
                   : msgData                                                                        
                   : msgDataLen                                                                     
                   : msgType                                                                        
                   : msgStackEnt                                                                    
                   : msgStackCnt                                                                    
                   : msgKey                                                                         
                   : msgErr ) ;                                                                     
                                                                                                    
      /end-free                                                                                     
                                                                                                    
     PsndMsg           e                                                                            

[Top Pageに戻る]

Ads by TOK2