忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

三菱「GT SoftGOT1000」用のアクセスDLL「GDevlib_GT16.dll」の利用について
最近の仕事で、三菱のシーケンサソフトである「GT SoftGOT1000」との通信を行うものがあり、 そのアクセス用のDLLとしての「GDevlib_GT16.dll」を使用しました。

「GT SoftGOT1000」と通信を行うために、「GT SoftGOT1000」がインストールされているパソコンに さらに今回開発のプログラムと同一ディレクトリに「GDevlib_GT16.dll」を設置しました。

「GDevlib_GT16.dll」を使うにあたって、三菱さんからはサンプルプログラムが提供されていますが VC++のソースしか無かったので、今回VB.NET用に書き換えました。
VB.NET用のソースは以下にありますので、よろしければお使い下さい。 但し、間違い等があるかもしれませんので、責任は負いかねますのでご了承下さい。
(「GDevlib_GT16.dll」利用するためのクラスとして「CDev.vb」の1個のファイルにしてあります。)

尚、「GDevlib_GT16.dll」を使っての開発は、三菱さんに伺ったところ「VisualStudios2012上での開発については、保証外となります」 とのことですので、VisualStudio2008で開発を行いました。

■「CDev.vb」クラスの使い方

大体以下の様な感じで使えますが、ErrLogはこの関数外で宣言したエラー出力用の関数です。
'[GT SoftGOT1000]内部デバイス操作クラス
Private Device As GDev

Private Sub TestSub()
    ' [GT SoftGOT1000]内部デバイス操作クラス作成
    Device = New GDev()

    '-----
    '開始処理
    '-----
    If Device.IsOpen() = False Then
        'SoftGOT1000内部デバイス・オープン
        If Device.Open(1) = False Then
            'オープンエラー
            ErrLog("GT SoftGOT1000 が開始されていません。 ")
            Exit Sub
        End If
    End If

    '=====
    'SGT1000.exeの実行中確認
    '=====
    Dim ArrProcess As Process()
    ArrProcess = Process.GetProcessesByName("SGT1000")
    If ArrProcess.Length <= 0 Then
        ErrLog("SoftGOT1000が動作していません。")
        Exit Sub
    End If

    '-----
    '読出
    '-----
    'デバイスNO
    Dim DevNum As UInt32 = 82       'デバイスNO:82から8個のWORD領域
    '内部デバイス入力データ領域
    Dim ArrDev(8 * 2 + 1) As UShort '8ワードの領域
    Dim blnRet As Boolean
    blnRet = Device.Read(GDev.DeviceName.GD, DevNum, ArrDev)
    If blnRet = False Then
        ErrLog("読出エラー(" & DevNum.ToString & ")")
        Exit Sub
    End If

    '-----
    '書込
    '-----
    'デバイスNO
    Dim DevNumO As UInt32 = 400     'デバイスNO:400から8個のWORD領域
    '内部デバイス出力データ領域
    Dim ArrDevO(8 * 2 + 1) As UShort '8ワードの領域
    blnRet = Device.Write(GDev.DeviceName.GD, DevNumO, ArrDevO)
    If blnRet = False Then
        ErrLog("書込エラー")
        Exit Sub
    End If

    'SoftGOT1000内部デバイス・クローズ
    If Device.IsOpen() Then
        Device.Close()
    End If
End Sub
■「CDev.vb」クラスのソース

Imports System
Imports System.Text
Imports System.Runtime.InteropServices

Class GDev
    Private m_hMapFile As IntPtr
    Private m_ulMapPointer As UInt32
    Private m_sGotNo As Int16

    <DllImport("GDevlib_GT16.dll")> _
    Private Shared Function GDev_OpenMapping(ByRef phMapFile As IntPtr, ByVal sGotNo As Int16) As UInt32
    End Function

    <DllImport("GDevlib_GT16.dll")> _
    Private Shared Sub GDev_CloseUnMapping(ByVal hMapFile As IntPtr, ByVal ulMapPointer As UInt32)
    End Sub

    <DllImport("GDevlib_GT16.dll")> _
    Private Shared Function GDev_Read(ByVal ulMapPointer As UInt32, ByVal sDevNameID As Int16, 
                    ByVal lDevNum As Int32, ByRef pusDataTable As UInt16, ByVal lDataSize As Int32) As Int32
    End Function

    <DllImport("GDevlib_GT16.dll")> _
    Private Shared Function GDev_Write(ByVal ulMapPointer As UInt32, ByVal sDevNameID As Int16,
                    ByVal lDevNum As Int32, ByRef pusDataTable As UInt16, ByVal lDataSize As Int32) As Int32
    End Function

    Public Enum DeviceName
        GB
        GD
        GS
    End Enum

    Protected Overrides Sub Finalize()
        Try
            Close()
        Finally
            MyBase.Finalize()
        End Try
    End Sub

    ''' -----------------------------------------------------------------------
    ''' 
    ''' オープン処理
    ''' 
    '''GOT-NO
    ''' 処理結果(True:OK, False:NG)
    ''' 
    ''' -----------------------------------------------------------------------
    Public Function Open(ByVal sGotNo As Int16) As Boolean
        If m_hMapFile = IntPtr.Zero Then
            Dim hMapFile As IntPtr
            m_ulMapPointer = GDev_OpenMapping(hMapFile, sGotNo)
            If m_ulMapPointer <> 0 Then
                m_hMapFile = hMapFile
                m_sGotNo = sGotNo

                Return True
            End If
        End If

        Return False
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' オープン済チェック
    ''' 
    ''' チェック結果(True:OK, False:NG)
    ''' 
    ''' -----------------------------------------------------------------------
    Public Function IsOpen() As Boolean
        Return (m_hMapFile <> IntPtr.Zero)
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' クローズ処理
    ''' 
    ''' 
    ''' -----------------------------------------------------------------------
    Public Sub Close()
        If m_hMapFile <> IntPtr.Zero Then
            GDev_CloseUnMapping(m_hMapFile, m_ulMapPointer)

            m_hMapFile = IntPtr.Zero
            m_sGotNo = 0
        End If
    End Sub

    ''' -----------------------------------------------------------------------
    ''' 
    ''' デバイス名からID変換
    ''' 
    '''デバイス名
    ''' ID
    ''' 
    ''' -----------------------------------------------------------------------
    Private Function GetDevNameID(ByVal eDevName As DeviceName) As Int16
        Select Case eDevName
            Case DeviceName.GB
                Return 0
            Case DeviceName.GD
                Return 1
            Case DeviceName.GS
                Return 2
        End Select

        Return -1
    End Function

    Private Function GetFlag(ByVal sVal As UInt16, ByVal iBit As Integer) As Boolean
        Dim iMask As Integer = 1 << iBit
        Return ((sVal And iMask) <> 0)
    End Function

    Private Function SetFlag(ByVal sVal As UInt16, ByVal iBit As Integer, ByVal bFlag As Boolean) As UInt16
        Dim iMask As Integer = (1 << iBit)
        If bFlag Then
            Return CType(sVal Or iMask, UInt16)
        Else
            Return CType(sVal And Not iMask, UInt16)
        End If
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' 単独データ読出し
    ''' 
    '''デバイス名
    '''デバイスNO
    '''返すデータ
    ''' 読出結果(True:OK, False:NG)
    ''' 
    ''' -----------------------------------------------------------------------
    Public Function Read(ByVal eDevName As DeviceName, ByVal lDevNum As Int32, ByRef DataVal As UInt16) As Boolean
        If m_hMapFile <> IntPtr.Zero Then
            Dim usValue As UInt16 = 0
            Dim sDevNameID As Int16 = GetDevNameID(eDevName)

            If GDev_Read(m_ulMapPointer, sDevNameID, lDevNum, usValue, 1) = 0 Then
                If eDevName = DeviceName.GB Then
                    If GetFlag(usValue, lDevNum Mod 16) Then
                        DataVal = 1
                    Else
                        DataVal = 0
                    End If
                Else
                    DataVal = usValue
                End If
                Return True
            End If
        End If

        Return False
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' 連続データ読出し
    ''' 
    '''デバイス名
    '''デバイスNO
    '''データ配列
    ''' 読出結果(True:OK, False:NG)
    ''' ビットデータは想定していない
    ''' -----------------------------------------------------------------------
    Public Function Read(ByVal eDevName As DeviceName, ByVal lDevNum As Int32, ByRef DataTable() As UInt16) As Boolean
        If m_hMapFile <> IntPtr.Zero Then
            Dim sDevNameID As Int16 = GetDevNameID(eDevName)

            If GDev_Read(m_ulMapPointer, sDevNameID, lDevNum, DataTable(0), DataTable.Length) = 0 Then
                Return True
            End If
        End If

        Return False
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' 単独データ書込み
    ''' 
    '''デバイス名
    '''デバイスNO
    '''データ値
    ''' 
    ''' 書込結果(True:OK, False:NG)
    ''' -----------------------------------------------------------------------
    Public Function Write(ByVal eDevName As DeviceName, ByVal lDevNum As Int32, ByVal usValue As UInt16) As Boolean
        If m_hMapFile <> IntPtr.Zero Then
            Dim sDevNameID As Int16 = GetDevNameID(eDevName)

            If eDevName = DeviceName.GB Then
                Dim usTmpValue As UInt16 = 0
                If GDev_Read(m_ulMapPointer, sDevNameID, lDevNum, usTmpValue, 1) = 0 Then
                    usValue = SetFlag(usTmpValue, lDevNum Mod 16, (usValue <> 0))
                End If
            End If

            If GDev_Write(m_ulMapPointer, sDevNameID, lDevNum, usValue, 1) = 0 Then
                Return True
            End If
        End If

        Return False
    End Function

    ''' -----------------------------------------------------------------------
    ''' 
    ''' 連続データ書込み
    ''' 
    '''デバイス名
    '''デバイスNO
    '''データ配列
    ''' 書込結果(True:OK, False:NG)
    ''' ビットデータは想定していない
    ''' -----------------------------------------------------------------------
    Public Function Write(ByVal eDevName As DeviceName, ByVal lDevNum As Int32, ByRef DataTable() As UInt16) As Boolean
        If m_hMapFile <> IntPtr.Zero Then
            Dim sDevNameID As Int16 = GetDevNameID(eDevName)

            If GDev_Write(m_ulMapPointer, sDevNameID, lDevNum, DataTable(0), DataTable.Length) = 0 Then
                Return True
            End If
        End If

        Return False
    End Function

    Public Overrides Function ToString() As String
        Return String.Format("GT SoftGOT1000")
    End Function
End Class
=====
2014/09/03:の時の情報











PR

コメント

コメントを書く