内部属性値読み取りの例

内容
casp1032jp
内容
以下の例では、指定されたモデル ID の属性値を読み取り、表示する方法を示します。
Integer attrID = Integer.decode(args[0]); int[] attrIDList = new int[1]; attrIDList[0] = attrID.intValue(); int[]modelIDList = md.getModelIDListByXmlSearchCriteria( xmlSearchCriteria ) ; CsCAttrReadMode_e[] readMode = {CsCAttrReadMode_e.CSC_MOST_AVAILABLE}; CsCAttrValListOfModels avlom = md.readAttrValListOfModelsByIDs( modelIDList, attrIDList, readMode ); if( avlom.error == CsCError_e.SUCCESS ) { for( int i = 0; i < avlom.list.length; i ++ ) { CsCModelAttrValList mavl = avlom.list[i]; CsCAttrValList avl = mavl.attrValList; if( avl.error == CsCError_e.SUCCESS ) { for( int j = 0; j < avl.length; j ++ ) { CsCAttrValue aval = avl.list[j]; CsCError_e err = aval.error; if( err == CsCError_e.SUCCESS ) { CsCValue val = aval.value; String name = val.textString(); System.out.println("Model Name: " + name ); } } } }
行 1 ~ 3 では、属性 ID の配列を設定しています。行 5 では、前に説明したようにフィルタ検索からモデル ID の整数アレイを取得しています。行 6 では、要求された属性ごとに CsCAttrReadMode_e のアレイを設定しています。行 9 ~ 12 では、検索で見つかったモデル ID のリストの属性のために、モデル ドメイン インターフェースへのコールを実行して、MOST_AVAILABLE の属性を 1 つ読み取っています。メソッド コール readAttrValListOfModelsByIDs は、モデルの属性を読み取り、CsCAttrValListofModels の値を返します。
最初のチェックは、エラー コード全体のためのものです。チェックでは常に FAILURE ではなく SUCCESS を探すようにします。FAILURE には多くのバリエーションがあるためです。行 15 では、FOR ループによって CsCModelAttrValList クラスのアレイを反復処理しています。行 19 では、行 21 で CsCAttrValList を反復処理する前に、SUCCESS がないか再度確認しています。CsCAttrValue ごとにエラー コードをチェックし、最後に CsCValue に対してメソッド textString をコールして、属性を文字列として抽出しています。
エラー コードおよび CsCValue
内部または外部で属性を読み取るときには、エラー コードを確認します。データを渡すデータ クラスには、1 つ以上のモデルに関する情報が含まれています。100 のモデルのうちの 1 つにエラーがあっても、99 のモデルは正常に戻ることができます。モデルの一部のみが成功したかどうかがわかるように、コードを設計してください。
多くのクラスは、メンバ変数および複数のメンバ メソッドの引数として CsCValue を使用します。CsCValue オブジェクトは、以下のようなさまざまなオブジェクトを格納できるので、列挙型と似ています。
  • actionID
  • agentID
  • alarmid
  • attributeID
  • attrGroupID
  • attrValID
  • boolValue
  • counterValue
  • dateTime
  • actionID
  • developerID
  • enumValue
  • eventID
  • eventIDList
  • gaugeValue
  • hiddenValue
  • intValue
  • ipAddress
  • model
  • modelID
  • modelDomain
  • modelDomainID
  • eventIDList
  • modelType
  • modelTypeID
  • nullValue
  • objectID
  • octetString
  • operatorValue
  • realValue
  • 関係
  • relationID
  • taggedOctetString
  • textString
  • timeTicks
void コンストラクタの仕組み
CsCValue クラスを使用するには、void コンストラクタによってそのクラスをインスタンス化する必要があります。
以下のように、void コンストラクタを使用できます。
  1. 以下のように、void コンストラクタを使用してタイプや値がないオブジェクトを作成します。
    CsCValue v = new CsCValue();
  2. 以下のように、適切な set メソッドを使用してそのオブジェクトを特定の値タイプ(たとえば、textString)および値に設定します。
    v.textString("Container III");
  3. 以下のように、適切な get メソッドを使用してオブジェクトから値を抽出します。
    String name = v.textString();
    set
    および
    get
    は、過負荷になるメソッドです。特定の CsCValue オブジェクトのタイプを確認する場合は、以下を入力します。
    CsCValueType_e type = v.discriminator();
  4. CsCValue オブジェクトのタイプおよび値を表示するには、以下のように CsCorbaValueHelper クラスを使用します。
    CsCorbaValueHelper vh = new CsCorbaValueHelper(); System.out.println( v.discriminator().toString() + " " + vh.toStringValue(v));
CsCorbaValueHelper クラスには、CsCValue オブジェクトを処理するためのさまざまなメソッドがあります。このヘルパ クラスに関する詳細については、Java のドキュメント ページ <
$SPECROOT
>/SDK/docs/SSORB/index.html でリンク com.aprisma.spectrum.core.util をクリックしてください。
読み取りモード
CsCAttrReadMode_e には、以下の読み取りモードが用意されています。
  • CSC_MOST_AVAILABLE
    メモリ フラグまたはデータベース フラグが設定されている場合は、内部で読み取ります。このいずれのフラグも設定されていない場合は、属性に外部フラグが設定されていれば、外部になります。
  • CSC_MOST_CURRENT
    外部フラグが設定されている場合は外部から読み取り、それ以外の場合は内部で読み取ります。
  • CSC_TRY_MOST_CURRENT
    外部フラグが設定されている場合は外部から読み取り、それ以外の場合は内部で読み取ります。外部読み取りに失敗した場合は、メモリ フラグまたはデータベース フラグが設定されていれば、内部になります。
  • CSC_SYNC_CURRENT
    最新の値を試すことで同じ機能を容易に実現できるため使用されません。最新の値がメモリまたはデータベースの値と異なる場合は、内部の値を最新の値に更新します。
内部属性を読み取っている場合は CSC_MOST_AVAILABLE を使用し、外部から読み取っている場合は CSC_MOST_CURRENT で読み取ります。属性が外部であるのにメモリまたはデータベースを保持している場合にのみ、判断を下す必要があります。読み取りの方向は、最新の値を必要とするのか、現在の値を使用するのかによって決まります。
外部読み取り用のルール
外部読み取り用のルールは以下のとおりです。
  • 属性 Dev_Contact_Status が 1、つまり[確立]に設定されていることを確認します。
  • 属性 isManaged が TRUE に設定されていることを確認します。
これらの属性に適切な値が設定されていない場合は、読み取ろうとしたものの接続が失われていたために、プログラムがハングする可能性があります。この状況では、読み取り操作はタイムアウトまで待機してから再試行されます。待機の別の理由として、デバイスまたはポートが保守点検中であることが考えられます。
外部属性読み取りの例
以下の例では、外部属性を読み取る方法を示しています。
import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCModelPackage.*; import com.aprisma.spectrum.core.idl.CsCAttribute.*; import com.aprisma.spectrum.core.idl.CsCError.*; import com.aprisma.util.corba.* ; public class ReadExternalAttribute { static CsCModelDomain md = null; public static void main(String[] args) { Integer extAttrID = Integer.decode(args[1]); Integer modelID = Integer.decode(args[0]); int[] modelIDList = new int[1]; int[] extAttrIDList = new int[1]; modelIDList[0] = modelID.intValue(); extAttrIDList[0] = extAttrID.intValue(); try { String domainName = new String("mySpectroSERVER"); // Bind CORBAHelper helper = CORBAHelper.getHelperImpl () ; helper.init(null, null); md = (CsCModelDomain) helper.getObjectImplementation ( CsCModelDomain.class, domainName ) ; if( okToReadExternal( modelIDList )) { CsCAttrReadMode_e [] readMode = { CsCAttrReadMode_e.CSC_MOST_CURRENT}; CsCAttrValListOfModels avlom = md.readAttrValListOfModelsByIDs( modelIDList, extAttrIDList, readMode ); if( avlom.error == CsCError_e.SUCCESS ) { for( int i = 0; i < avlom.list.length; i ++ ) { CsCModelAttrValList mavl = avlom.list[i]; CsCAttrValList avl = mavl.attrValList; if( avl.error == CsCError_e.SUCCESS ) { CsCAttrValue aval = avl.list[0]; CsCError_e err = aval.error; if( err == CsCError_e.SUCCESS ) { CsCValue val = aval.value; System.out.println("Text String: " + val.textString() ); } } } } else { System.out.println("Read was not overall successful"); } } } catch(Throwable e) { System.out.println(e); } } public static boolean okToReadExternal(int[] modelIDList) { boolean ok = false; // Dev_Contact_Status 0x110ed // isManaged 0x1295d int[] okToReadExternAttrs = { 0x110ed, 0x1295d }; CsCAttrReadMode_e[] readMode = { CsCAttrReadMode_e.CSC_MOST_AVAILABLE, CsCAttrReadMode_e.CSC_MOST_AVAILABLE}; try { CsCAttrValListOfModels avlom = md.readAttrValListOfModelsByIDs( modelIDList, okToReadExternAttrs, readMode); if (avlom.error == CsCError_e.SUCCESS) { if (avlom.list[0].attrValList.list[0].value.intValue() == 1 && avlom.list[0].attrValList.list[1].value.boolValue() == true) { ok = true; } } } catch (Throwable e) { System.out.println(e); } return ok; } }
この例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCModelDomain
    • クラス
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCAttribute
    • クラス
      • CsCAttrReadMode_e
      • CsCValueType_e
      • CsCValue
属性テーブルからの値の読み取り
属性テーブルから値を読み取ることは、1 つの属性から値を読み取ることに似ています。適切な読み取りモードを選択する方法と外部から読み取る方法は引き続き有効です。しかし、テーブルが大きい場合、これらの方法では処理時間の増大以外にも、デバイスのパフォーマンス低下やネットワーク トラフィックの増加などの影響が生じる可能性があります。
API テーブル読み取り機能は堅牢で、(上位と下位のインスタンスを定義することで)範囲を指定できるほか、取得できるエントリの数の上限を設定できます。これにより、以下の例のようにテーブルからごくわずかのデータを読み取る場合にはパフォーマンスが向上します。
int [] attr = {attrhandle.intValue()}; CsCOIDSpec low = new CsCOIDSpec(); CsCOIDSpec high = new CsCOIDSpec(); int [] lowValue = { 0 }; int [] highValue = { 100 }; low.objectID( lowValue ); high.objectID( highValue ); int length = 23; CsCModel model = md.getModel( ()); CsCAttrValTable tablevalues = md.readAttrValTable( modelhandle.intValue(),attr,low, high, length, CsCAttrReadMode_e.CSC_MOST_CURRENT ); for( int j = 0; j < tablevalues.table.length; j++ ) { System.out.println( tablevalues.table[j][0].value.toString()); }
最初のパラメータは、読み取られる属性のアレイです。インスタンス アレイの境界がテーブルによって異なる可能性があるため、アレイにはテーブルに属する属性を指定します。
2 番目と 3 番目のパラメータには、インスタンス範囲の下限と上限を指定します。範囲は、以下の理由で CsCOIDSpec データ パラメータを使用して指定します。
  • インスタンスは、1 つ以上の値を含むことができます。
  • 通常、テーブルは一連の値によってインスタンス化されます。
4 番目のパラメータには、収集するテーブル エントリの最大数を指定します。範囲の上限を超えると、最大値のみが指定されます。最大値が満たされていない場合は、テーブル内のエントリのみが返されます。5 番目のパラメータは、単一の読み取り規則に従います。
以下の例では、属性 ID が列を構成し、インスタンスが行を構成しています。CsCValues は、アレイの本体を構成しています。列、行、および値に対してエラー データ構造があります。
注:
下限、上限、制限の各パラメータでは、ワイルドカードを使用できます。
CsCModelDomain md = (CsCModelDomain) helper.getObjectImplementation ( CsCModelDomain.class, domainName ); CsCOIDSpec low = new CsCOIDSpec(); CsCOIDSpec high = new CsCOIDSpec(); int length = 0; low.noLimit(true); high.noLimit(true); int [] attr = {attrid.intValue()}; CsCAttrValTable tablevalues = md.readAttrValTable( modelid.intValue(),attr, low, high, length, CsCAttrReadMode_e.CSC_MOST_CURRENT);
noLimit メソッドが CsCOIDSpec オブジェクトに対してコールされています。これにより、オブジェクトにワイルドカード機能が設定されます。制限パラメータの場合、制限を 0 に設定することで、ワイルドカード機能が設定されます。
この例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCModelDomain
    • クラス
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCAttribute
    • クラス
      • CsCAttrReadMode_e
      • CsCValueType_e
      • CsCValue
      • CsCOIDSpec
      • CsCAttrValTable
      • CsCValueError
      • CsCAttrErrorList
      • CsCError_e
テーブル属性読み取りの例
以下の例では、テーブル属性を読み取る方法を示しています。
import java.io.*; import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCException.*; import com.aprisma.spectrum.core.idl.CsCAttribute.*; import com.aprisma.util.corba.*; public class ReadTableAttr { public static void main( String[] args ) { CsCorbaValueHelper help = new CsCorbaValueHelper(); Integer attrid = Integer.decode( args[0] ); Integer mid = Integer.decode( args[1] ); CsCModelDomain md = null; try { String domainName = new String("mySpectroSERVER"); CORBAHelper helper = CORBAHelper.getHelperImpl(); helper.init( null, null ); md = (CsCModelDomain) helper.getObjectImplementation( CsCModelDomain.class, domainName ); int [] attr = { attrid.intValue() }; int [] lowValue = { 0 }; int [] highValue = { 100 }; CsCOIDSpec low = new CsCOIDSpec(); CsCOIDSpec high = new CsCOIDSpec(); int length = 10; low.objectID( lowValue ); high.objectID( highValue ); CsCAttrValTable tableValues = md.readAttrValTable( mid.intValue(), attr, low, high, length, CsCAttrReadMode_e.CSC_MOST_CURRENT ); CsCAttrErrorList ael = tableValues.columnIndexList; for ( int i=0; i < ael.list.length; i++ ) { System.out.println( "AEL len: " + ael.list.length ); CsCOIDError[] vea = tableValues.rowIndexList; System.out.println( "VEA len: " + vea.length ); for ( int j=0; j < vea.length; j++ ) { CsCValue attrval = tableValues.table[j][i].value; System.out.println( i + ":" + j + " " + attrval.textString() ); } } } catch (Throwable e) { System.out.println( e ); } } }
属性値およびテーブル値の書き込み
属性の読み取りに関する原則は、読み取りモード以外に、属性の書き込みにも適用されます。属性が外部であっても、メモリやデータベースであっても、両方に書き込む必要があります。外部に書き込む前に、属性 Dev_Contact_Status および isManaged を確認してください。モデルの SNMP コミュニティ文字列に書き込み権限があるかどうかを確認してください。そうしないと、外部への書き込みが失敗します。
以下の例では、モデルの属性値を書き込む方法を示しています。
CsCValue val = new CsCValue(); val.textString(args[2] ); CsCAttrValue attrVal = new CsCAttrValue( attrID.intValue(), val, CsCError_e.SUCCESS ); CsCAttrValue[] attrValArray = new CsCAttrValue[1]; attrValArray[0] = attrVal; CsCAttrValList writeValList = new CsCAttrValList( attrValArray, CsCError_e.SUCCESS ); CsCAttrErrorListOfModels aelom = md.writeAttrValListOfModelsByIDs( modelIDList, writeValList );
属性を書き込むには、属性および値が含まれている CsCAttrValList を作成する必要があります。行 1 では、CsCValue を作成することにより CsCAttrValList の構築を開始しています。行 2 では、CsCValue にテスト文字列値を割り当てています。行 3 ~ 5 では、属性 ID、CsCValue、およびエラー コード SUCCESS を渡して CsCAttrValue を作成しています。行 6 は CsCAttrValue 用のサイズが 1 のアレイで、行 7 ではそのアレイに CsCAttrValue を割り当てています。行 8 と 9 では、アレイとエラー コード SUCCESS で CsCAttrValList を構築しています。
以下のように CsCAttrValList を構築することもできます。
CsCAttrValList で返された値を読み取ります。
  1. CsCValue に値を設定して、メソッド writeAttrValListOfModelsByIDs に渡します。
上記の例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCModelDomain
    • クラス
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCModelPackage
    • クラス
      • CsCAttrErrorListOfModels
  • パッケージ com.aprisma.spectrum.core.idl.CsCAttribute
    • クラス
      • CsCAttrReadMode_e
      • CsCValueType_e
      • CsCValue
  • パッケージ com.aprisma.spectrum.core.util
    • クラス
      • CsCorbaValueHelper
属性書き込みの例
以下の例では、属性を書き込む方法を示しています。
import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCModelPackage.*; import com.aprisma.spectrum.core.idl.CsCAttribute.*; import com.aprisma.spectrum.core.idl.CsCError.*; import com.aprisma.util.corba.* ; public class WriteModelInfo { public static void main(String[] args) { Integer attrID = Integer.decode(args[1]); Integer modelID = Integer.decode(args[0]); int[] modelIDList = new int[1]; int[] attrIDList = new int[1]; modelIDList[0] = modelID.intValue(); try { String domainName = new String("mySpectroSERVER"); // Bind CORBAHelper helper = CORBAHelper.getHelperImpl () ; helper.init(null, null); CsCModelDomain md = (CsCModelDomain) helper.getObjectImplementation ( CsCModelDomain.class, domainName ) ; // Create CsCValue CsCValue val = new CsCValue(); val.textString(args[2] ); // Create Attr value CsCAttrValue attrVal = new CsCAttrValue( attrID.intValue(), val, CsCError_e.SUCCESS ); // Construct a CsCAttrValue array CsCAttrValue[] attrValArray = new CsCAttrValue[1]; attrValArray[0] = attrVal; CsCAttrValList writeValList = new CsCAttrValList( attrValArray, CsCError_e.SUCCESS ); CsCAttrErrorListOfModels aelom = md.writeAttrValListOfModelsByIDs( modelIDList, writeValList ); if( aelom.error == CsCError_e.SUCCESS ) { System.out.println("Read was overall successful"); } else { System.out.println("Read was not overall successful"); } } catch(Throwable e) { System.out.println(e); } } }
上記の例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCModelDomain
    • クラス
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCAttribute
    • クラス
      • CsCAttrReadMode_e
      • CsCValueType_e
      • CsCValue
      • CsCOIDSpec
      • CsCAttrValTable
      • CsCValueError
      • CsCAttrErrorList
      • CsCError_e
CsC 属性値テーブル構築の例
CsCAttrValTable を構築してテーブル属性を書き込むことは、単一値を構築することに似ています。
例: CsC 属性値テーブルの構築
以下の例では、CsC 属性値テーブルを構築する方法を示しています。
int size = 5; CsCValueError[][] table = new CsCValueError[size][1]; CsCOIDError[] rowindexlist = new CsCOIDError[size]; CsCValue value; for(int i = 0; i < size; ++i ) { int[] oidsuffix = new int[1]; oidsuffix[0] = i; rowindexlist[i] = new CsCOIDError( oidsuffix,CsCError_e.SUCCESS); value = new CsCValue(); value.textString("Hello"); table[i][0] = new CsCValueError( value, CsCError_e.SUCCESS ); } CsCAttrError[] attrlist = new CsCAttrError[1]; attrlist[0] = new CsCAttrError( attrid.intValue(), CsCError_e.SUCCESS); CsCAttrErrorList columnindexlist = new CsCAttrErrorList( attrlist, CsCError_e.SUCCESS); CsCAttrValTable attrvaltable = new CsCAttrValTable( table, rowindexlist, columnindexlist, CsCError_e.SUCCESS);
行 1 では、テーブルのサイズを設定しています。1 つのテーブル属性のみを設定しています。行 2 では、CsCAttrValTable の本体を形成する CsCValueError の 2 次元アレイを構築しています。行 3 では、テーブルで更新される 5 つのエントリ用にサイズが 5 の CsCOIDError アレイを構築しています。行 5 では、For ループを設定して個々の CsCValues の作成を反復処理しています。行 7、8、および 9 では、OID サフィックスとエラー コード SUCCESS で rowindexlist アレイを設定しています。行 10、11、および 12 では、CsCValue を構築し、Hello というテキスト文字列値を代入し、それを CsCValueError としてテーブル アレイに代入しています。
行 14 ~ 18 では、書き込む属性 ID を設定しています。最初に、サイズが 1 の CsCAttrError アレイを作成します。次に、最初のエレメントに、属性とエラー コード SUCCESS からなる CsCAttrError を代入します。行 19 と 20 では、構築した値を読み取って CsCAttrValTable を構築しています。
テーブル属性書き込みの例
以下の例では、テーブル属性を書き込む方法を示しています。
import java.io.*; import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCException.*; import com.aprisma.spectrum.core.idl.CsCAttribute.*; import com.aprisma.spectrum.core.idl.CsCError.*; import com.aprisma.util.corba.*; public class WriteTableAttr { public static void main( String[] args ) { Integer attrid = Integer.decode( args[0] ); Integer mid = Integer.decode( args[1] ); CsCModelDomain md = null; try { String domainName = new String( "mySpectroSERVER" ); CORBAHelper helper = CORBAHelper.getHelperImpl(); helper.init( null, null ); md = (CsCModelDomain) helper.getObjectImplementation( CsCModelDomain.class, domainName ); int size = 3; CsCValueError[][] table = new CsCValueError[size][1]; CsCOIDError[] rowindexlist = new CsCOIDError[size]; CsCValue value; for ( int i=0; i < size; i++ ) { int [] oidsuffix = new int[1]; value = new CsCValue(); value.textString( "Hello" ); table[i][0] = new CsCValueError( value, CsCError_e.SUCCESS ); oidsuffix[0] = i + 1; rowindexlist[i] = new CsCOIDError( oidsuffix, CsCError_e.SUCCESS ); } CsCAttrError[] attrlist = new CsCAttrError[1]; attrlist[0] = new CsCAttrError( attrid.intValue(), CsCError_e.SUCCESS ); CsCAttrErrorList columnindexlist = new CsCAttrErrorList( attrlist, CsCError_e.SUCCESS ); CsCAttrValTable attrvaltable = new CsCAttrValTable( table, rowindexlist, columnindexlist, CsCError_e.SUCCESS ); CsCAttrErrorTable aet = md.writeAttrValTable( mid.intValue(), attrvaltable ); } catch ( Throwable e ) { System.out.println( e ); } } }
内部属性リストのすべてのエントリをクリアする場合、writeAttrValTable メソッドが補足エントリを追加するため、空の CsCAttrValTable を書き込むことができません。既存のエントリは更新され、新規のエントリは追加されます。
リストをクリアする方法の 1 つは、以下のとおりです。
int[] attr = { 0xffff0021 }; md.clearListAttrs(mid.intValue(),attr);