現在、modbusのRTUプロトコルでPCと温度調節器(CHINO製)で通信を試みています。
プログラムを使って無人で自動調整させるためにC#を使っています。
しかし実際にプログラムを書いても通信できませんでした。
そこで、プログラムにミスがあると考え、Modbusの通信用ソフト(HUMANDATA製 Modbus通信確認用アプリケーション)を使用したところ、問題なく通信が行えました(PCから調節器の設定ができた)。
以下に作製したプログラムを書き出します。有識者の方、どうかお願いします。
c#
1 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using System.ComponentModel; 6using System.Data; 7using System.Drawing; 8using System.Linq; 9using System.Text; 10using System.Threading.Tasks; 11using System.Windows.Forms; 12 13namespace WindowsFormsApp2 14{ 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void Form1_Load(object sender, EventArgs e) 23 { 24 //プロパティ設定 25 comSerialPort.PortName = "COM3"; 26 comSerialPort.BaudRate = 9600; 27 comSerialPort.DataBits = 8; 28 comSerialPort.Parity = System.IO.Ports.Parity.None; 29 comSerialPort.StopBits = System.IO.Ports.StopBits.One; 30 } 31 32 private void connectButton_Click(object sender, EventArgs e) 33 { 34 //通信開始ボタン 35 try 36 { 37 if(comSerialPort.IsOpen==false) 38 { 39 comSerialPort.Open(); 40 connectButton.Text = "通信停止"; 41 } 42 else 43 { 44 comSerialPort.Close(); 45 connectButton.Text = "通信開始"; 46 } 47 } 48 catch(Exception ex) 49 { 50 MessageBox.Show(ex.Message, "通信エラー", 51 MessageBoxButtons.OK, MessageBoxIcon.Error); 52 } 53 } 54 55 private void sendButton_Click(object sender, EventArgs e) 56 { 57 //送信ボタン 58 if (comSerialPort.IsOpen) 59 { 60 try 61 { 62 string strSend = sendDataTextBox.Text; 63 Byte[] byteArry =System.Text.Encoding.UTF8.GetBytes(strSend); 64 comSerialPort.Write(byteArry, 0, byteArry.Length); 65 //文字列をutf-8でByte配列にして送信 66 67 } 68 catch (Exception ex) 69 { 70 //送信エラー時の処理 71 MessageBox.Show(ex.Message, "送信エラー", 72 MessageBoxButtons.OK, MessageBoxIcon.Error); 73 } 74 } 75 else 76 { 77 MessageBox.Show("通信が未開始", "送信エラー", 78 MessageBoxButtons.OK, MessageBoxIcon.Error); 79 } 80 } 81 } 82}
ちなみに送信しているメッセージの内容ですが、「01 06 00 c8 01 2c 08 79」のように、
アドレスからCRCまでを纏めて送信しています。またsendButtonをクリックしても特にエラーコードは出ません。
追記:
例に示しました「01 06 00 c8 01 2c 08 79」は実際にテキストボックスに入力した文字列で、これをbyte配列(byteArry)に変換して送信しています(できていませんが、、)。またこの「01 06 00 c8 01 2c 08 79」は通信確認用アプリケーションから送信した場合実際に動作する文字列です。