【PLC上位リンク通信】C#でTCP通信ソケット通信を使用してPLCに機種問合せをしてみた

C#.NET

ad2

【PLC上位リンク通信】C#でTCP通信ソケット通信を使用してPLCに機種問合せをしてみた

キーエンス

キーエンス製のPLCを使用してPCとの通信を確立するPLC上位リンク通信機能を試してみる。

機種問合せのコマンドを投げるとどう返ってくるのかをご紹介します。

画面設計

今回は、サンプルとして、実行ボタンと、結果表示テキストボタンを配置。あとは、好みでタイマー(Tick)を設定。

plc_link

ソースコード

using System;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace Tcp_plc_link
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private TcpClient tcpclient = new TcpClient();
        private NetworkStream netstream;

        /// <summary>
        /// 画面起動時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // TCP接続 PLC側のIPアドレス指定  PLCリンク通信ポート:8501  ※PC側とPLC側のIPアドレスは同一ネットワーク(サブネットマスク範囲を指定すること)
            tcpclient.Connect("196.68.10.5", 8501);
            // ストリーム取得
            netstream = tcpclient.GetStream();
        }

        /// <summary>
        /// ボタンクリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //機種問合せコマンド「?K」
            byte[] send = Encoding.GetEncoding("SHIFT-JIS").GetBytes("?K\r"); 
            //送信
            netstream.Write(send, 0, send.GetLength(0));

            
            byte[] receive = new byte[tcpclient.Available];
            //受信
            netstream.Read(receive, 0, receive.Length);
            
            //結果表示
            textBox1.Text = Encoding.GetEncoding("SHIFT-JIS").GetString(receive);
        }

        /// <summary>
        /// タイマー
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            // 受信
            if (tcpclient.Available > 0)
            {
                byte[] receive = new byte[tcpclient.Available];
                netstream.Read(receive, 0, receive.GetLength(0));
                MessageBox.Show(Encoding.GetEncoding("SHIFT-JIS").GetString(receive));
            }
        }

        /// <summary>
        /// Form Close
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            netstream.Close();
            tcpclient.Close();
        }
    }
}

結果

PLC:KV-7500の場合⇒「55」が返ってくる。

plc_link_result

★機種別のresponseの値一覧★

KV-8000  :‘57’(35H、37H)
KV-7300  :‘54’(35H、34H)
KV-7500  :‘55’(35H、35H)
KV-3000  :‘51’(35H、31H)
KV-5000  :‘52’(35H、32H)
KV-5500  :‘53’(35H、33H)
KV-NC32T :‘128’(31H、32H、38H)

エラー

IPアドレスが違っている場合、下記のエラーが表示される。

System.Net.Sockets.SocketException: ‘接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

PC側のIPアドレスとPLC側のIPアドレスは同一ネットワークになっているか確認しましょう。

例. PC⇒192.178.10.30    PLC⇒192.178.10.15

ポート番号:8501を使用するのですでに他のアプリで使用している場合は変更しましょう。

あとがき

PLCリンク通信を使用している現場はどれほどあるのだろうか?

このブログの中では結構アクセスがあるので、需要があるのかな。。

現場では、どのような活用がされているのか?

私の場合は、トレーサビリティシステムの構築、データの見える化で傾向管理などに利用している。