IEC 61850 MMSプロトコル

Typhoon HIL ツールチェーンにおける IEC 61850 MMS プロトコルの実装について説明します。

リアルタイムのみ:このドキュメントは、リアルタイム シミュレーションにのみ有効です。

IEC 61850 MMCプロトコル

IEC 61850(変電所における通信ネットワークおよびシステム)規格は、MMSプロトコル(製造メッセージ仕様)をサーバー/クライアント型通信として定義しています。このプロトコルは、IED(インテリジェント電子機器)と上位デバイス(SCADAなど)間のイーサネット経由の情報交換に使用されます。MMSプロトコルはTCP/IPにマッピングされており、IPアドレスに基づいてサーバーにアクセスし、クライアントはデータの読み書き、設定の読み取り、ファイルの交換を行うことができます。

IEC 61850はオブジェクト指向規格です。各物理デバイスは、図1に示すように、論理デバイス(LD)、論理ノード(LN)、データオブジェクト(DO)、およびデータ属性(DA)で構成されています。IEC 61850の各オブジェクトの名称は標準化されています。また、各オブジェクトへのアクセスも標準化されています。

1 IEC 61850規格のオブジェクト指向モデル

各物理デバイスは、1 つ以上の論理デバイスで構成できます。論理デバイスは論理ノードで構成され、各論理ノードは IED デバイスの 1 つの機能を定義します。各論理ノードは、標準で定義された必須およびオプションのデータ オブジェクトで構成され、各データ オブジェクトには定義済みのデータ属性があります。データ属性は、このツリー構造のリーフを表します。IED 構成の例を図 2に示します。IED には、LD1 と呼ばれる 1 つの論理デバイスがあります。IED の 1 つの機能をモデル化する複数の論理ノードがあります。たとえば、XCBR は回路ブレーカー、CSWI モデル、スイッチ コントローラーをモデル化し、XSWI モデルは回路スイッチをモデル化し、MMXU モデルは測定をモデル化します。XCBR ノードには、ブレーカーの位置の情報を表すデータ オブジェクト Pos があります。Pos には、stVal (状態値)、q (品質)、t (タイムスタンプ) などのデータ属性があります。

2 IEDの構成例

設定内の各オブジェクトへのアクセスも標準化されています。例えば、回路遮断器SXCBR1のstValを読み取る場合、パスはLD1/SXCBR1$Pos$stValとなります。クライアントはデータオブジェクト全体の情報にアクセスすることもできます。例えば、回路遮断器のPosオブジェクトのすべての属性を読み取るには、LD1/SXCBR1$Posというパスを使用します。

データセットとレポート

IEC 61850では、任意のデータをグループ化してデータセットを形成できます。データセットは、構成内の任意のオブジェクトをグループ化できます。例えば、回路遮断器ノードのModデータオブジェクトとPos$stValデータ属性を、MMXUノードのオブジェクトまたは属性、あるいはMMXUノード全体とグループ化できます。

これらのデータセットはレポート作成に不可欠な要素です。レポート作成は、クライアントが読み取りリクエストを発行することなく、データが変更されたことをクライアントに通知するために使用されます。各レポートブロックは1つのデータセットへの参照を持ちます。データセットの1つの要素の値が変更されると、データセットのすべての要素の情報を含むレポートがクライアントに送信されます。

Typhoon HILツールチェーンのMMSプロトコル

MMSプロトコルは、Typhoon HILツールチェーン内のMMSサーバーを通じて実装されます。MMSサーバーは、信号処理コンポーネントを使用してモデル化されています。MMSプロトコルは、以下のTyphoon HILデバイスでサポートされています: HIL402、HIL101、HIL404、HIL602+、HIL604、HIL506、およびHIL606

MMS サーバー コンポーネント

コンポーネントが無視されます:このコンポーネントはTyphoonSimでは無視されます。TyphoonSimシミュレーション中、このコンポーネントへの入力は破棄され、コンポーネントからの出力はゼロになります。
3 MMSサーバーコンポーネント

MMS サーバー コンポーネントのプロパティの説明は次のリストに記載されています。

  • イーサネットポート
    • MMSサーバーアプリケーションで使用するHILデバイス背面のEthernetポートを選択します。第4世代デバイス(HIL101、HIL404、HIL506、HIL606)では、利用可能なポートであればどれでも通信に使用できますが、それ以前のデバイスではポート1経由の通信のみをサポートします。
  • SCLファイルをインポートする
    • このボタンを使用して SCL 構成ファイルをインポートします。
  • パスタイプ
    • SCLファイルパスの保存形式を選択します。絶対パスはSCLファイルへの完全なシステムパスを保存し、相対パスはモデルディレクトリを基準とした相対パスを保存します。
  • シミュレーションするIEDを選択
    • SCL 構成に複数の IED が定義されている場合は、シミュレートする IED を選択します。
  • サーバーのIPアドレス
    • サーバーのIPアドレス値
  • サーバーネットマスク
    • サーバーのネットマスク値
  • サーバーゲートウェイ
    • サーバーゲートウェイ値
  • 実行率
    • MMS サーバー コンポーネントの実行率
注意:回路図モデル内のすべての MMS サーバー コンポーネントは、HIL デバイスごとに同じイーサネット ポートを使用する必要があります。

SCLファイルがダイアログに読み込まれると、ファイルが解析され、IEDのツリービューが生成されます。このビューの例を図4に示します。

ビューは図のように6つの部分に分割できます。 図4:
  1. このウィンドウでは、論理ノードのSCL構造が表示され、構成内のナビゲーションが容易になります。また、データセットとレポートブロックも表示されます。略語は以下のとおりです。
    • IED - 構成で定義されたインテリジェント電子デバイス
    • AP - アクセスポイント
    • LD - 論理デバイス
    • LN - 論理ノード
    • DS - データセット
    • RP - レポートブロック
  2. このウィンドウには、データセットとレポートブロックの詳細情報が表示されます。データセットに関する情報は、データセットを構成する要素で構成されます。レポートブロックに関する情報は、レポートされたデータセット、整合性期間、バッファリングオプション、トリガーオプション、その他のフィールドで構成されます。
  3. 各論理ノードの詳細情報が表示されます。データオブジェクトとデータ属性に関する情報はここで表示および変更できます。
  4. サービス応答項目を識別します。これらの値は、サーバーを識別する際にクライアントに返されます。
  5. SCLファイルの相対パスまたは絶対パスがここに表示されます。SCLファイルへのパスが変更された場合は、ファイルを再度インポートしてサーバーパラメータを変更する代わりに、ここで変更できます。
  6. 「構成を更新」チェックボックスは、構成が既にロードされている場合にのみ使用できます。このチェックボックスをオンにすると、既存の構成のバリエーション(つまり、いくつかの異なる信号を持つ構成)で、入力/出力の構成が同じ新しい.icdファイルをロードできるようになります。
4 .インポートされたSCLファイルを含むMMSサーバーダイアログウィンドウ

MMS サーバー属性の操作

サーバーの属性情報は、前の図の3番でマークされたウィンドウで変更できます。表示される属性情報は次のとおりです。
  • オブジェクト - データオブジェクトとデータ属性の名前
  • タイプ - SCL ファイルで定義されたデータ オブジェクトのクラスとデータ属性のタイプ
  • トリガー - データ属性のトリガーオプション。トリガーは、データ変更(dchg)、データ更新(dupd)、または品質変更(qchg)のいずれかで生成されます。トリガーオプションは、レポートが生成されるタイミングを定義します。
  • 値 - データ属性の値
  • 含める - 含めるが有効になっている場合、コンポーネント上に適切な信号端子が作成され、ユーザーはシミュレーション信号をMMSサーバーコンポーネントに接続できるようになります。
  • 方向 - 信号端子の方向を指定します
  • エイリアス - エイリアスが定義されていない場合、端末ラベルはLDname_LNname_DOname_DAnameというパターンに従って生成されます。エイリアスが定義されている場合、端末ラベルはエイリアスと同じになります。

MMSサーバーの機能

Typhoon HILツールチェーンでモデル化されたMMSサーバーは、データ属性へのインターフェースのみを有効にし、実際のアプリケーションでこれらの属性がどのように制御されるかをモデル化しません。言い換えれば、IEC 61850規格で定義されているMV(測定値)共通データクラスは、instMag値を使用してmag属性を更新することを規定しており、instMag値がしきい値を超えて変化した場合、mag値はそれに応じて更新されます。一方、しきい値はdb(デッドバンド)、min、max属性の値によって定義されます。同様に、範囲属性値はrangeC(範囲設定)属性によって定義された値によって定義されます。品質も範囲値とmag値に応じて更新されます。

これは自動的にモデル化されるわけではありませんが、信号処理コンポーネントを使用してこの機能をモデル化することは可能です。これを実現する例は、MMSサーバーの例で示されています。

Typhoon HILツールチェーンに実装されたMMSサーバーは、レポート機能もサポートしています。レポートブロックはSCLで適切に定義する必要があります。

MMS サーバーの例

MMSサーバーのサンプルは、examples\models\communication\IEC 61850 MMS Serverのサンプルフォルダにあります。このサンプルモデルは、属性値の定義方法、モデルからの信号と属性を接続する方法、そしてIEC 61850規格で定義されているMV(測定値)データクラスの適切な機能を実現する方法を示しています。

サンプルモデルを図5に示します。インポートされるSCLファイルは、同じくサンプルフォルダ内にあるdemo.icdファイルです。定義されている属性とその値は、図4と同じです。属性のincludeフィールドとdirectionフィールドを定義すると、コンポーネントに適切な端子が作成されます。これらの端子は、サーバーの値をモデルに接続するために使用します。基本的な概念としては、クライアントがシミュレーションから読み取るものはすべてコンポーネントへの入力として定義され、クライアントがシミュレーションに書き込むものはすべて出力として定義されます。

5 MMSサーバーのサンプルモデル

MVと呼ばれるサブシステムは、標準規格で定義されている測定値データクラスの機能を実装しています。MVサブシステムの内容を図6に示します。

6 MVサブシステムブロックの内容

instMagの値は、mag属性の値を計算するために使用されます。また、この値はサーバーコンポーネントのinstMag端子に直接接続されています。magの値は、instMagの値がdbDeltaの値を超えて変化するたびに更新されます。dbDeltaの値は以下の式で計算されます。

dbDelta = (最大値 - 最小値)/100000 * db

規格で定義されているとおりです。zeroDbの値は、ゼロ値の周囲の閾値を定義するために同様に使用されます。

範囲の値は、instMag値と範囲設定値(min、max、hhLim、hLim、lLim、llLim)によって定義されます。q(品質)の値は範囲値によって調整されます。スケールは以下のとおりです。
  • insMag > max - 範囲は高高、qは範囲外であり疑わしい
  • max > instMag > hhLim - 範囲は高から高
  • hhLim > instMag > hLim - 範囲は高い
  • hLim > instMag > lLim - 範囲は正常です
  • lLim > instMag > llLim - 範囲が低い
  • llLim > instMag > min - 低-低の範囲
  • min > instMag - 範囲は低低、qは範囲外であり疑わしい

すべての範囲構成属性は出力端子として定義されているため、クライアントはこれらの値を変更でき、それに応じて範囲が計算されます。

時間同期

時刻同期が必要な場合は、 「時刻同期」をご覧ください。

Schematic API を使用して MMS サーバーのプロパティ値を変更する

カスタムコンポーネントダイアログは、MMSサーバーの入出力を簡単に選択できるように設計されています。これらの値の変更は、Schematic APIの標準関数を使用しても可能ですが、変更された方法で行われます。5つの特別な関数により、Schematic API経由でMMSサーバーを簡単に使用できます。
  • load_config(絶対ファイルパス)
    • 説明:
      • この関数は最初のステップとして使用できます。.icdファイルへの絶対パスを入力として受け取り、解析された設定を辞書形式で返します。
    • 入力:
      • absolute_file_path - .icd ファイルへの絶対ファイルパス。
    • 出力:
      • config - 特定の MMS サーバー コンポーネントに関するすべての必要な情報を保持する構成辞書。
  • import_config(sch_model、item_handle)
    • 説明:
      • この関数は最初のステップとして使用できます。回路図モデルハンドルとMMSサーバーコンポーネントハンドルを入力として受け取り、必要な情報を抽出し、解析された構成を辞書形式で返します。
    • 入力:
      • sch_model - MMS サーバー コンポーネントを含む Typhoon HIL 回路図。
      • item_handle - MMS サーバー スケマティック コンポーネントのハンドル。
    • 出力:
      • config - 特定の MMS サーバー コンポーネントに関するすべての必要な情報を保持する構成辞書。
  • set_leafs(config, ied, leafs_to_include, set_val_leafs, values, direction, aliases)
    • 説明:
      • この関数は、次のステップとして使用できます。設定辞書、IEDの名前、入力と出力のリーフのリスト、初期値を設定するリーフのリスト、初期値のリスト、方向のリスト、エイリアスのリストを入力として受け取り、設定辞書に適用します。入力パラメータの有効性に応じてブール値を返します。
    • 入力:
      • config - 特定の MMS サーバー コンポーネントに関するすべての必要な情報を保持する構成辞書。
      • ied - 使用される IED の名前を表す Python 文字列。
      • leafs_to_include - 含めるリーフ (文字列) のリスト。
      • set_val_leafs - 初期値を設定するリーフ (文字列) のリスト。
      • values - 設定する初期値のリスト。
      • Directions - 含まれるリーフの方向 (文字列) のリスト。
      • aliases - 含まれるリーフのエイリアス (文字列) のリスト。
    • 出力:
      • valid - 入力パラメータの有効性に依存するブール値。
  • export_config(config, ファイル名=なし, ファイルパス=なし)
    • 説明:
      • この関数はステップ1とステップ2の間に使用できます。適用された.icdファイルから使用可能なリーフを決定するのに役立ちます。設定辞書を必須入力として、ファイル名とファイルパスを任意入力として受け取り、使用可能なリーフを記述した.jsonファイルをエクスポートします。
    • 入力:
      • config - MMS サーバー コンポーネントに関するすべての必要な情報を保持する構成辞書。
      • file_name - 作成するファイルの名前。None を指定した場合、出力ファイル名は .icd ファイル名と一致します。
      • file_path - 作成されるファイルへのパス。None のままにした場合、この関数を呼び出したスクリプトのファイルパスにファイルが作成されます。
    • 出力:
      • この関数は、選択可能なリーフの辞書リストを含む.jsonファイルを作成します。ユーザーがどのリーフを選択できるか分からない場合に役立ちます。
  • write_leaf_props_to_mms(config、sch_model、item_handle)
    • 説明:
      • この関数は3番目のステップとして使用できます。MMSサーバーコンポーネントに変更された構成を適用するために使用されます。入力として、構成辞書、回路図モデルハンドル、およびMMSサーバーコンポーネントハンドルを受け取ります。
    • 入力:
      • config - MMS サーバー コンポーネントに関するすべての必要な情報を保持する構成辞書。
      • sch_model - MMS サーバー コンポーネントを含む Typhoon HIL 回路図。
      • item_handle - MMS サーバー スケマティック コンポーネントのハンドル。
使用例:

    from typhoon.api.iec_61850.mms_utils import load_config, set_leafs, \
        import_config, write_leaf_props_to_mms, export_config
    from typhoon.api.schematic_editor import SchematicAPI, 
    
    # Hepling function to get terminal names
    def get_terminal_name(path):
        path_parts = path.split("$")

        terminal_name = path_parts[2]
        for part in path_parts[3:]:
            terminal_name += f"_{part}"

        return terminal_name    

    mdl = SchematicAPI()
    chosen_leaves = ["E1$P1$E1Test$LLN0$Mod$origin$orCat", "E1$P1$E1Test$LLN0$Mod$ctlNum", "E1$P1$E1Test$LLN0$Mod$stVal", "E1$P1$E1Test$LLN0$Mod$q"]
    alias_list = ["orCat", "ctlNum", "stVal", "dU"]
    dir_list = ["in", "in", "out", "out"]
    value_list = [15, 155, "2 - blocked", "0000000000010"]    
    
    MODEL_NAME = "test_mms.tse"
    mdl.create_new_model(MODEL_NAME)
    mms_server = mdl.create_component("core/MMS Server", name="MMS Server1")
    
    # Load configuration from a .icd file to a dictionary
    mms_dict = load_config("C:/Program Files/Typhoon HIL Control Center 2025.1/examples/models/communication protocols/iec 61850 mms server/demo.icd")
    # Optional step to export a loaded configuration in order to understand the available leaves
    export_config(mms_dict)
    # Apply a new configuration to the configuration dictionary
    valid = set_leafs(mms_dict, "E1", chosen_leaves, chosen_leaves, value_list, dir_list, alias_list)

    if valid:
        # Apply modifications to the MMS Server component properties
        write_leaf_props_to_mms(mms_dict, mdl, mms_server)

        mdl.set_property_value(mdl.prop(mms_server, "server_ip"), "192.168.20.101")
        mdl.set_property_value(mdl.prop(mms_server, "server_netmask"), "255.255.255.0")
        mdl.set_property_value(mdl.prop(mms_server, "server_gateway_enable"), False)
        mdl.set_property_value(mdl.prop(mms_server, "server_gateway"), "")
        mdl.set_property_value(mdl.prop(mms_server, "vendor"), "Typhoon HIL MMS 1")
        mdl.set_property_value(mdl.prop(mms_server, "model_name"), "HIL 404")
        mdl.set_property_value(mdl.prop(mms_server, "revision"), "1.0")
        mdl.set_property_value(mdl.prop(mms_server, "execution_rate"), 0.0007)
        terminals = {}
        for leaf in chosen_leaves:
            terminals.update(
                {
                    leaf : get_terminal_name(leaf)
                }
            )
        
        # Create necessary scada inputs and probes
        scada_input1 = mdl.create_component(type_name="core/SCADA Input", name="scada_input1")
        scada_input2 = mdl.create_component(type_name="core/SCADA Input", name="scada_input2")
        probe1 = mdl.create_component(type_name="core/Probe", name="probe1")
        probe2 = mdl.create_component(type_name="core/Probe", name="probe2")
        
        # Connect inputs and outputs
        mdl.create_connection(mdl.term(scada_input1, "out"), mdl.term(mms_server1_test, terminals[
            chosen_leaves[0]]))
        mdl.create_connection(mdl.term(scada_input2, "out"),
                              mdl.term(mms_server1_test, terminals[chosen_leaves[1]]))

        mdl.create_connection(mdl.term(probe1, "in"),
                              mdl.term(mms_server1_test, terminals[chosen_leaves[2]]))
        mdl.create_connection(mdl.term(probe2, "in"),
                              mdl.term(mms_server1_test, terminals[chosen_leaves[3]]))

        mdl.save_as(MODEL_NAME)
        mdl.save()
        mdl.load(MODEL_NAME)
        mdl.compile()
        mdl.close_model()

仮想HILサポート

Virtual HILは現在このプロトコルをサポートしていません。非リアルタイム環境(例:ローカルコンピュータでモデルを実行する場合)を使用する場合、このコンポーネントへの入力は破棄され、このコンポーネントからの出力はゼロになります。