# VisualBasic.NETからのOPC接続

マニュアル > サーバ作成ガイド > インターフェース編 > OPCインターフェース > # VisualBasic.NETからのOPC接続 |

概要

VisualBasic.Netによって開発した独自のOPCクライアントアプリケーションから、Panel ServerのOPCインターフェースに対して、OPC接続するための設定例及び、アプリケーションの開発例を紹介します。

ここで紹介する手順としては、大きく分けて以下の３ステップです。尚、OPCサーバとしての接続方法は事前に行って下さい。

Step1.サーバ設定 | タグ登録設定を行います。
Step2.VBの基本設定 | VB.NETからOPC接続などをする上で必要な定義を行います。
Step3.値の読み書き | VB.NETから任意のタイミングでアイテム値の読み書きを行えるようにします。

この機能のサンプルは、以下からご利用頂けます。

なお、サンプル及び詳細の説明は、VB.Net2010で行います。

Step1.サーバ設定

Panel Serverを起動して下記の手順に従ってタグの設定を行って下さい。ここでは、PLCの代わりに仮想デバイスを使用します。もし、PLCが手元にあれば、PLCのタグを設定しても構いません。

1.ユニットの追加
画面左側のツリーから「Driver」を右クリックしてメニューを表示し、「ユニット追加」を選択してください。
選択ダイアログが表示されるので、「メモリ」の「仮想通信」「仮想デバイス」を選択して、「OK」を押してください。

2.フォルダ追加
「U01」を右クリックしてメニューを表示し、「フォルダ追加」を選択します。

3.タグ追加
「F01」を右クリックしてメニューを表示し、「タグ追加」を選択します。　「T01」というタグが追加されます。

4.タグのプロパティ設定
リストから「T01」を右クリックしてメニューを表示し、「プロパティ」を選択します。
「アドレス設定」タブから「04 - D データレジスタ」を選択し、「OK」を押してください。以下は例として、D0000（ワードレジスタ）を数値タグとして設定しています。

5.ここまでの作業で設定ファイルを保存し、アプリケーションをオンラインにしてください。

Step2.VB.NETの基本作成

VB.NET側の基本的な作成内容について説明します。概要のみの説明となっているため、詳細はサンプルと見比べながら確認してください。

| サンプルでは、OPCに関する処理をCommonクラス(Common.vb)に定義しています。一通りの接続から値の読み書きの処理コードを含めております。これからの作成方法では、そのCommonクラスを利用する形での構築方法を記載しています。

| 本項目で利用する「OpcRcw.Comm」と「OPCRcw.Da」の参照ライブラリは、Panel Serverをインストールすることで、VB.NETなどで参照できるようになります。

1.参照設定を行う
OpcRcw.ComnとOPCRcw.Daの参照を追加ボタンから行ってください。

2.コード内でOpcRcwのインポートを行う

    Imports OpcRcw.Da

3.Commonクラスの定義を行う

    Dim WithEvents EvCSvr As Common

サンプルでは、画面ロード時にインスタンスの生成を行っています。

    'Setting Class
    If EvCSvr Is Nothing Then
        EvCSvr = New Common
    End If

4.自動的に値を更新するかどうかの設定を行う
「mvCheckState」にTrueを設定した場合、自動更新が有効になります。
サンプルでは画面上でチェックが入っている場合、自動更新を行うようにしています。
自動更新の必要がなければこの処理は必要ありません。

            'Auto Update Mode Setting
            If chcAuto.CheckState = 1 Then
                EvCSvr.mvCheckState = True
            Else
                EvCSvr.mvCheckState = False
            End If

5.OPCサーバーへのコネクション処理を定義する
コネクションは、「FnConnect」で行います。コネクションの成功とともにAddItemを行い、アイテムの登録を行います。
サンプルではConnectボタン押下で接続を行います。
なお、ProgIDなどが設定されていない場合は処理を行わないなど、エラーチェックも行っています。

    '------------------------------------------
    ' OPC Connect
    '------------------------------------------
    Private Sub btnConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect.Click

        'Configuration Check
        If cmbProgID.Text = "" Then
            MessageBox.Show("ProgID is not set correctly", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            cmbProgID.Focus()
            Exit Sub
        End If

        If txtUpdateRate.Text = "" Then
            MessageBox.Show("UpdateRate is not set correctly", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtUpdateRate.Focus()
            Exit Sub
        End If

        If Not IsNumeric(txtUpdateRate.Text) Then
            MessageBox.Show("UpdateRate set a numerical value", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtUpdateRate.Focus()
            Exit Sub
        End If

        'Auto Update Mode Setting
        If chcAuto.CheckState = 1 Then
            EvCSvr.mvCheckState = True
        Else
            EvCSvr.mvCheckState = False
        End If

        'Connect
        If EvCSvr.FnConnect(cmbProgID.Text, CInt(txtUpdateRate.Text)) = True Then
            For i = 0 To mcItemCount - 1
                mvcH(i) = i
            Next
            If EvCSvr.FnAddItem(mvItemName, mvcH, mvsH) = False Then
                MessageBox.Show("Failed to AddItems!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                EvCSvr.FnDisConnect()
                Exit Sub
            End If

            mvConnectFlg = True

            'Change Enabled
            Call SbChangeEnabled(False, True)

            For i = 0 To mcItemCount - 1
                txtValue(i).Enabled = True
            Next

        Else
            MessageBox.Show("Failed to Connect!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            EvCSvr.FnDisConnect()
            Exit Sub
        End If

    End Sub

6.OPCサーバーへのディスコネクション処理を定義する
ディスコネクションは「FnDisConnect」で行います。

    '------------------------------------------
    ' OPC DisConnect
    '------------------------------------------
    Private Sub btnDisConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnDisConnect.Click

        If EvCSvr.FnDisConnect() = False Then
            MessageBox.Show("Failed to DisConnect!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If

        mvConnectFlg = False

        'Change Enabled
        Call SbChangeEnabled(True, False)

        For i = 0 To mcItemCount - 1
            txtValue(i).Enabled = False
            txtValue(i).Text = ""
        Next

    End Sub

7.自動更新有りの時の設定を行う
「DataChange」イベントの定義を行います。
「mvCheckState」がTrueである場合、DataChangeイベントがUpdateRateの周期で発生します。
自動更新の必要がなければこの処理は必要ありません。
サンプルではエディットボックスに取得したタグの値を設定します。

    '------------------------------------------
    ' Event - DataChange
    '------------------------------------------
    Private Sub EvCSvr_DataChange(vwTransID As Integer, _
                                  vItemCount As Integer, _
                                  vClientHds() As Integer, _
                                  vValues() As Object, _
                                  vftTimeStamps() As OpcRcw.Da.FILETIME, _
                                  vwQualities() As Short, _
                                  vpErrors() As Integer) Handles EvCSvr.DataChange

        Dim i As Integer = 0
        Dim j As Integer = 0

        For i = 0 To vItemCount - 1
            For j = 0 To mcItemCount - 1
                If mvcH(j) = vClientHds(i) Then
                    If vpErrors(i) = 0 Then
                        mvoV(j) = vValues(i)
                    End If
                    Exit For
                End If
            Next
        Next

        For i = 0 To mcItemCount - 1
            mvTarget = i
            txtValue(mvTarget).Invoke(New D_UpdTextBox(AddressOf SbUpdTextBox), CStr(mvoV(mvTarget)))
        Next

    End Sub

Step3.値の読み書き

任意のタイミングでアイテム値の読み書きを行う方法を紹介します。概要のみの説明となっているため、詳細はサンプルと見比べながら確認してください。

読み込み

任意のタイミングでアイテム値の読み込みを行います。特に自動更新を無効にしており、必要なタイミングのみ値が取得したい場合などに活用します。読み込みは「FnSyncRead」で行います。

サンプルではReadボタン押下で値の読み込みが行われます。

    '------------------------------------------
    ' OPC Read
    '------------------------------------------
    Private Sub btnRead_Click(sender As System.Object, e As System.EventArgs) Handles btnRead.Click

        Dim i As Integer

        If EvCSvr.FnSyncRead(OPCDATASOURCE.OPC_DS_DEVICE, mvsH, mvoV, mvdT, mvwQty) = False Then
            MessageBox.Show("Failed to Read!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        For i = 0 To mcItemCount - 1
            txtValue(i).Text = mvoV(i)
        Next

    End Sub

書き込み

任意のタイミングでアイテム値の書き込みを行います。読み込みは「FnSyncRead」で行います。

サンプルではWriteボタン押下で値の書き込みが行われます。

    '------------------------------------------
    ' OPC Write
    '------------------------------------------
    Private Sub btnWrite_Click(sender As System.Object, e As System.EventArgs) Handles btnWrite.Click
        Dim i As Integer
        For i = 0 To mcItemCount - 1
            mvoV(i) = txtValue(i).Text
        Next

        If EvCSvr.FnSyncWrite(mvsH, mvoV) = False Then
            MessageBox.Show("Failed to Write!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If

    End Sub

| 配列を使用する事で、１つのタグで大量のデータをブロックとして扱うことができます。例えば、１万ワードのデータを授受する場合、１万点のタグを個別に作成するのではなく、配列タグを１つ用意して通信を行う事で負荷を下げる事ができます。 配列タグの値を読み書きする場合には、配列形式の変数を使用して値をやり取りする必要があります。ただし、OPCプログラミングでは複数のアイテムをやり取りするために、引数の形式として配列形式の変数が使用されています。 その為、ここで更に配列タグを使用する場合には、二次元配列の変数を扱う必要があります。例えば、「SyncRead」メソッドの使用例の場合、「mvoV(1)」と記述してアイテムの値を参照していましたが、配列タグの場合には、「mvoV(1)(1)」のように記述する事で、配列タグの要素の各デバイス値を参照する事ができます。VB.NETでの配列の使用方法については、VB.NETのヘルプを参照してください。

| Commonクラス(Common.vb)に記述してあるソースコードの中で、重要となるメソッドは以下となります。
メソッド | 説明
AddGroup | OPCサーバーにグループ登録を行います。
AddItems | OPCサーバーにアイテム登録を行います。
RemoveGroup | 登録されたグループを開放します。
Read | データの読み込みを行います。
Write | データの書き込みを行います。