2011年10月18日 星期二

Visual C# 2010 開發 Modbus Poll - 測試環境架設篇

  程式設計師最痛苦的事就是自己寫過的程式不見了,雖然曾經有經驗,但是對於很多複雜的運算不件就很痛苦了, Modbus 就是其中之一,很久前就寫過了,但是要重新寫一遍還是很痛苦。

  不管怎樣,先把測試環境架起來再說,首先下載一個虛擬 Com Port (Null Modem) 的程式,com0com 應該是不錯的選擇,這次我下載的是 com0com-2.2.2.0-i386-fre.zip。 解壓縮安裝後就會看到 裝置管理員當中多了:

com0com裝置
  開啟2個超級終端機(如果是 Wwindow 7 可能要找一個類似超級終端機的程式),把連線Port 設成:
連線 Port 一個設成 CONCA0 另一個設成 CONCB0
  把兩個終端機的通信協議設成一樣,如果從一邊輸入而另一邊就可以看到輸入資料的話,那就表示com0comg 是可以運作的。

再來用 Visual C# 快速寫一段模擬終端機的程式,我用我自己原本寫過的 

Window 7 - 列印發票軟體 / Visual C# 2010 express 序列埠 (RS232) - 1 快速完成一個模擬終端機,還有一件事一定要記得,如果是要用 C# 的 serial.portname 去設定 serial port,請先執行com0com的 setup ,把 Null Modem 的 Port Name 改成 COM3 和 COM4,否則你一執行 serialPort1.Open(); 就會有錯誤產生 - "The given port name does not start with COM/com or does not resolve to a valid serial port.",這應該是 Microsoft 開的一個不好笑的玩笑,用 system.io.ports 的  SerialPort.GetPortNames() 可以得到的名稱,而用在 Net 的 serialPort1.PortName 中卻不能用。



簡易的終端機程式畫面如下:


簡易的終端機


程式如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private string RxString;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] SerialPorts = SerialPort.GetPortNames();
            foreach (string port in SerialPorts)
                       {
                comboBox1.Items.Add(port);
            }

            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.SelectedItem.ToString();
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Open();
        }
       
        private void DisplayText(object sender, EventArgs e)
        {
            richTextBox1.AppendText(RxString);
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            RxString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));
        }
    }
}

有了終端機的程式,現在要再找一個可以模擬 Modbus Slave的軟體,我推薦下載 Modbus PLC Simulators,因為這個軟體可以和 com0com 共同使用,軟體的畫面如下:

Modbus PLC Simulator
到此測試環境算是完成了。