シーケンサとの通信を行う「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」の使用テストソース
2014/10/06:の時の情報
この「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参加を待つ」部分を改良したソース(抜粋)''' 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テスト用メイン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
コメント