忍者ブログ

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

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

FL-netのアクセスライブラリ「Binarix FL-net Library for Windows」の利用について
シーケンサとの通信を行う「FL-net」を使用する機会が数ヶ月前にありました。
この「FL-net」を使うことで、シーケンサとのプロトコルを意識せずメモリの読み書きで通信ができるものです。
私は知らなかったのですが、シーケンサ(PLC)とパソコン等とを接続し、その間でのデータの授受を行うために「FL-net」はよく用いられているそうです。

「FL-net」の特徴を以下に記します。
■パソコン側のインターフェイスはEthernetがそのまま利用できる。
■FL-netのネットワーク上には、最大254台の機器(ノード)を接続可能。
■各ノードはマスターレス方式で管理され、トークンバス方式でデータを交換する。
■全てのノードが共通認識しているメモリブロックであるコモンメモリが在る。
■コモンメモリは、ビット単位での扱いに適した「領域1(8192ビット分)」と、  ワード単位(16ビット単位)での扱いに適した「領域2(8192ワード分)」の2ブロックがある。
■コモンメモリの自分のノードのデータ領域の公開と、他のノードのデータ領域の参照が可能。

定期的に他のノードのデータを参照することで、それに対応する処理を行ったり、 自分のノードに他のノードへ伝えることを書き込んだりできることになります。

この「FL-net」を.NETから扱えるようにしたライブラリが「Binarix」から発売されています。 「Binarix FL-net Library for Windows」という製品で開発ライセンスフリーで動作させるパソコンには USBキーを装着することになります。(このUSBキーは60,000円)

http://www.binarix.co.jp/ja/products/flnet/

以下にコモンメモリの領域2を読み書きする簡単なテストプログラムを示します。
「Binarix」のサンプルプログラムで行っているように、FL-netをオープンした後でFL-netの 状態変化イベントでFL-netへの参加を検知する様にしています。
この組み方でほぼ動作すると思うのですが、実際にこの様にして数本のプログラムを組み1個のPC上で 同時に走らせた時に問題が発生しました。
実際のプログラムは5本同時に走らせたのですが、各プログラムでオープンした後で、 必ずしも全てのプログラムでオープン後の参加イベントが返ってくるわけではありませんでした。
「Binarix」の方に伺ったところ、イベントで見るのではなく、自ノードの状態を監視するのみでOKとのことでした。
結局ステータスイベントを使わずにオープン後のDo...WhileループをGetNodeInfo関数で監視すればよいことになります。


■「FL-net Library」の使用テストソース
Module Test

'-----
'FL-net用の変数
'-----
Private WithEvents m_flnet As FLnet             'FL-netコントロール
Private m_blnParticipation As Boolean = False   '参加フラグ
Private m_flRet As FLResult                     'FL-net関数戻り値

Private m_intAddr As Integer
Private m_intData As Integer
Private m_ushortArr(10) As UShort

''' 
''' FL-netテスト用メインSub
''' 
Sub Main()
    'FL-netインスタンス
    m_flnet = New Binarix.FALink.FLnet()

    'FL-netオープン
    m_flRet = m_flnet.Open()
    If m_flRet = FLResult.OK Then
        MsgBox("Fl-net Open Error")
        Exit sub
    End If

    'FL-net参加を待つ
    Do
        If m_blnParticipation = True Then Exit Do
        Threading.Thread.Sleep(100)
    While

    m_intAddr = 100
    '1ワードの領域2のコモンメモリの読込(Address:100)
    m_flRet = m_flnet.ReadC2(m_intAddr, m_intData)
    If Not (m_flRet = FLResult.OK) Then
        MsgBox("Fl-net Open Error")
    End If

    '1ワードの領域2のコモンメモリの書込(Address:200)
    m_intAddr = 200
    m_flRet = m_flnet.WriteC2(m_intAddr, m_intData)

    m_intAddr = 100
    '10ワードの連続領域2のコモンメモリの読込(Address:100)
    m_flRet = m_flnet.ReadC2(m_intAddr, m_ushortArr)
    If Not (m_flRet = FLResult.OK) Then
        MsgBox("Fl-net Open Error")
    End If

    '10ワードの連続領域2のコモンメモリの書込(Address:200)
    m_intAddr = 200
    m_flRet = m_flnet.WriteC2(m_intAddr, m_ushortArr)

	'FL-netクローズ
	Dim result As FLResult = flnet1.Close()
	'Display Close Result
	If result = FLResult.OK Then
		MsgBox("Close OK")
	Else
		MsgBox("Close Error:" & result.ToString())
	End If

End Sub

''' 
''' FL-net状態変更通知イベントハンドラ
''' 
Private Sub flnet_StatusChanged(ByVal sender As System.Object, ByVal e As Binarix.FALink.FLStatusEventArgs) Handles m_flnet.StatusChanged
	'GetNodeInfoメソッドを使用して自ノードの状態を調べます。
	Dim nodeInfo As New FLNodeInfo
	If flnet1.GetNodeInfo(nodeInfo) = FLResult.OK Then
		Dim part As String
		If (nodeInfo.NodeStatus And FLNodeStatus.Participation) = FLNodeStatus.Participation Then
		    '参加フラグON
            m_blnParticipation = True
		End If
	End If
End Sub

End Module
■「FL-net参加を待つ」部分を改良したソース(抜粋)

...
...

''' 
''' FL-netテスト用メインSub
''' 
Sub Main()
    'FL-netインスタンス
    m_flnet = New Binarix.FALink.FLnet()

    'FL-netオープン
    m_flRet = m_flnet.Open()
    If m_flRet = FLResult.OK Then
        MsgBox("Fl-net Open Error")
        Exit sub
    End If

    'FL-net参加を待つ
    Do
        If m_flnet.GetNodeInfo(nodeInfo) = FLResult.OK Then Exit Do
        Threading.Thread.Sleep(100)
    While

    m_intAddr = 100
    '1ワードの領域2のコモンメモリの読込(Address:100)
    m_flRet = m_flnet.ReadC2(m_intAddr, m_intData)
    If Not (m_flRet = FLResult.OK) Then
        MsgBox("Fl-net Open Error")
    End If

...
...
=====
2014/10/06:の時の情報











PR

コメント

コメントを書く