0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

横河製のPLC(F3SP71)を使って、PCと通信してみた

Posted at

image.png

今回横河製のPLCを使用して、PC上で動作するソフトウェアを開発したので
記事にした。

システムの全容は莫大な情報になりすぎるため、
簡単な部分のみ掲載。

(結構組み込み系の開発は多いため今度まとめて色んなPLCの情報をアップします。
三菱電機、キーエンスを予定。オムロンの簡単な開発部分は以下のURLを参照。)
https://qiita.com/Kurogara/items/6a5a51d1d86df1e1f157

横河製PLCの基本情報

初期IPアドレスは「192.168.0.2」
通信ポートはA、Bの2ポートがある。
Aポートはポート番号「12289」初期値「ASCII形式」
Bポートはポート番号「12291」初期値「バイナリ形式」

ASCIIとバイナリで通信コマンドの内容は変わってくる。
今回はASCII形式で通信することにした。

構成図

以下の構成で構築
image.png
LANケーブルで接続

開発環境

PLCは、「WideField3」という横河の専用ソフトでプログラム作成。
PCは、C#(.Net6)で開発した。

通信コマンド

#=CPU番号1-4
xxxxxx=デバイス名
nnn=点数 001-256
d=書き込みデータ ON="1"(\$31) OFF="0"($30)※点数分設定する
cc=ワード数 01-64
eeee=書き込みデータ 16進数パターンの文字列
コマンドの最後には「CRLF」をつける


ビット単位の読出し
0#BRDxxxxxx,nnn
例)CPU1のI00001から1点読み込む場合
01BRDI00001,001
レスポンス「11OK1」

ビット単位の書込み
0#BWRxxxxxx,nnn,d
例)CPU1のI00001から1点分に1を書き込む場合
01BRDI00001,001,1
レスポンス「11OK」

ワード単位の読出し
0#WRDxxxxxx,cc
例)CPU1のD00001から1点読み込む場合
01WRDD00001,01
レスポンス「11OK0001」(16進数の文字列)

ワード単位の書込み
0#WWRxxxxxx,cc,eeee
例)CPU1のD00001から1点分に1を書き込む場合
01WWRD00001,01,0001
レスポンス「11OK」

サンプルコード

今回はD00002の値を読み込んだ後、D00002にFFFFを書き込む処理を作成してみます。

using System.Net.Sockets;
using System.Text;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public TcpClient client;
        public NetworkStream stream;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // ソケットを作成し、接続する
            client = new TcpClient("192.168.0.2", 12289);

            // ネットワークストリームを取得
            stream = client.GetStream();

            //D00002の値を読み込む処理
            string returnData = DataSendReturn("01WRDD00002,01");

            //読み込んだ値を表示
            MessageBox.Show(returnData, "Return Data", MessageBoxButtons.OK, MessageBoxIcon.Information);

            //D00002の値にFFFFを書き込む処理
            returnData = DataSendReturn("01WWRD00002,01,FFFF");

            //読み込んだ値を表示
            MessageBox.Show(returnData, "Return Data", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        //--------------------------------------------------------------
        /// <summary>
        /// PLCにcommandのデータを送信して返ってきた値をString型で返す
        /// </summary>
        /// <param name="command">PLCに送信するデータ</param>
        /// <returns></returns>
        //--------------------------------------------------------------
        private String DataSendReturn(string command)
        {
            string responseData;
            try
            {
                command += Environment.NewLine;
                byte[] dataToSend = Encoding.ASCII.GetBytes(command);
                stream.Write(dataToSend, 0, dataToSend.Length);

                // データを受信
                byte[] dataToReceive = new byte[4096]; // 配列のサイズを指定
                int bytes = stream.Read(dataToReceive, 0, dataToReceive.Length);
                responseData = Encoding.ASCII.GetString(dataToReceive, 0, bytes);

                return responseData;
            }
            catch (Exception)
            {
                return "ER";
            }
        }
    }
}

プログラム実行

まずはボタンをクリックします。
image.png

11OK0000が返ってきました。今の値は「0000」になっているようです。
image.png

つづいてOKボタンを押すと次はD00002にFFFFを書き込む処理が実行されます。
問題なく書き込みが実行された場合は、11OKが返ってきます。
image.png

もう一度button1を押すと次は11OKFFFFが返ってきます。
正常にFFFFの書き込みが行われているようです。
image.png

PLCなどの開発も行っていますので、
組み込み系でお困りの方はお気軽にご相談くださいー

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?