VisualBasic.NETからのOPC接続

<< Click to Display Table of Contents >>

マニュアル > サーバ作成ガイド > インターフェース編 > OPCインターフェース >

VisualBasic.NETからのOPC接続

概要

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

 

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

Step1.サーバ設定

タグ登録設定を行います。

Step2.VBの基本設定

VB.NETからOPC接続などをする上で必要な定義を行います。

Step3.値の読み書き

VB.NETから任意のタイミングでアイテム値の読み書きを行えるようにします。

 

 

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

 

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

 

 

Step1.サーバ設定

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

 

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

 

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

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

 

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

 

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

 

 

Step2.VB.NETの基本作成

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

 

hint

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

 

hint

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

 

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

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を設定した場合、自動更新が有効になります。
 
サンプルでは画面上でチェックが入っている場合、自動更新を行うようにしています。
自動更新の必要がなければこの処理は必要ありません。
c_interface_0061
 

        '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, txtServerName.Text, (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の周期で発生します。
自動更新の必要がなければこの処理は必要ありません。
 
サンプルではエディットボックスに取得したタグの値を設定します。
c_interface_0062
 

'------------------------------------------
' 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ボタン押下で値の読み込みが行われます。

c_interface_0063

 

'------------------------------------------
' 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ボタン押下で値の書き込みが行われます。

c_interface_0064

 

'------------------------------------------
' 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

 

 

hint

配列を使用する事で、1つのタグで大量のデータをブロックとして扱うことができます。例えば、1万ワードのデータを授受する場合、1万点のタグを個別に作成するのではなく、配列タグを1つ用意して通信を行う事で負荷を下げる事ができます。

 

配列タグの値を読み書きする場合には、配列形式の変数を使用して値をやり取りする必要があります。ただし、OPCプログラミングでは複数のアイテムをやり取りするために、引数の形式として配列形式の変数が使用されています。

その為、ここで更に配列タグを使用する場合には、二次元配列の変数を扱う必要があります。例えば、「SyncRead」メソッドの使用例の場合、「mvoV(1)」と記述してアイテムの値を参照していましたが、配列タグの場合には、「mvoV(1)(1)」のように記述する事で、配列タグの要素の各デバイス値を参照する事ができます。VB.NETでの配列の使用方法については、VB.NETのヘルプを参照してください。

 

hint

Commonクラス(Common.vb)に記述してあるソースコードの中で、重要となるメソッドは以下となります。

 

メソッド

説明

AddGroup

OPCサーバーにグループ登録を行います。

AddItems

OPCサーバーにアイテム登録を行います。

RemoveGroup

登録されたグループを開放します。

Read

データの読み込みを行います。

Write

データの書き込みを行います。