發表文章

目前顯示的是 10月, 2011的文章

Z-wave 測試環境架設

圖片
    因為寫過很多有關 RS232 聯線的程式,今天又有人希望我幫忙寫測試有關 Z-wave 設備的程式。 其實,Z-wave 我很早就有接觸過,但因為 Z-Wave 的 Protocol 並不是開放式,好像是要花一筆錢購買軟體開發工具,不管怎樣,還是先把要測試的環境架好。    網路上有很多有關資源 Z-Wave 的資源是可以利用的, An introduction to Z-Wave programming in C#   這是一個不錯的網站,大家有空可以去逛逛,該網站是用 Aeon labs 的 Z-Wave stick,我剛好也有一樣的,我用的是 Aeon Labs 的 Z-Stick Series 2 ,產品圖 : Z-Stick Series 2 原廠網站 : Aeon Labs     另外一個要下載的軟體就是 Z-Tool,請上原廠 HomeSeer ,有了這個 Tool 你可以先測試設備是否有確實連入網路,並下簡單的指令。     Z-Tool 執行畫面:  Z-tool By HomeSeer 另外一個是下載 com0com virtual serial port,這樣就可以用來知道Z-Tool 是丟出哪些資料來控制  Z-Wave Stick。 還有一個非常好的軟體 Device Monitor Studio ,這個軟體可以同時看到 Serial Port 傳送及接收的資料,對 Debug 的程是很有用。 已下是在 Z-Tool 上按 "Initialize" 對 Aeon Labs 的 Z-Wave Stick v下指令, 用 Device Monitor Studio 監視的結果: Device Monitor Studio 從 Device Monitor Studio 我們可以看到 Z-Tool 在 Initialize 時是傳送出: 0x01 0x03 0x00 0x02 0xfe 0x01 是傳送 框架的起始碼,0x03 是框架的長度,0xfe 是 Checksum。 而 Aeon Lab 都有回應0x06 (ACK)。

Visual C# 2010 開發 Modbus CRC 演算

圖片
   在 MODBUS 的 RTU 通信協議下,每個傳輸的指令後都要加 2 個 Bytes 的 CRC,CRC的說明如後: CRC Checksum 算法   CRC 的 C# SOURCE ,這一段是我在網路上找到的,我把原始碼上加了說明:  private void GetCRC(byte[] message, ref byte[] CRC) // message : Modbus指令 ; CRC : 2 Byte Checksum         {             ushort CRCFull = 0xFFFF; // CRC 的初值設成 0xFFFF             byte CRCHigh = 0xFF, CRCLow = 0xFF; // CRC 的 High byte 和 Low byte             char CRCLSB; // CRC Least signficant bit             for (int i = 0; i < (message.Length) - 2; i++)             {                 CRCFull = (ushort)(CRCFull ^ message[i]); // exclusive or                  for (int j = 0; j < 8; j++)                 {                     CRCLSB = (char)(CRCFull & 0x0001); // 取得 Least signficant bit                     CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF); // 移去 Least signficant bit,前補0                     if (CRCLSB == 1) // 如果 Least signficant bit 為 1                         CRCFull = (ushort)(CRCFull ^ 0xA00

Visual C# 2010 Serial Port 設定

圖片
    最近一下子太多案子都是要 Rs232,所以先寫一個標準的 RS232 設定,好讓所有的系統共用。    首先,構想是把 RS232 的各項設定值直接放在 Properties.Settings.settings 中 ,所以先在 Visual C# 2010 專案中的 Properties.Settings.settings 中加入: serial_Port serial_Baudrate serial_Parity serial_Databits serial_Stopbit    為了方便,每個變數的型態都是 String,如果是數值變數讀進來時會先用 Int32.TryParse(String, out numValue) 測試 String 是否能轉成 Integer,如果 Parse 可以再執行 ToInt32。 整個程式如後: 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)    

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; usin

Visual C# 2010 簡易開發多國語言程式

圖片
  寫過很多次多國語言的程式,但是每一次自己都沒有紀錄下來,這一次決定寫一篇,除了自己紀錄外也供大家分享。   首先要確定自己的需求,多國語言有幾種寫法,這次要採定使用設定檔的方式,也就是說不用在程式執行時變換語言種類,只能在程式起始時讀取設定檔確定使用語言的種類。   先在要使用多國語言的 Form 上把會使用到的物件先都擺上: Label、Button、Menu。 先都設定好 Default 的語言,再來要修改 Form 的屬性 Localizable to True ,如下圖: Change Localizable from False to True 接著再把 Language 設定成所需使用的語言: Chinese (Traditional, Taiwan),修改 Lable、Button等的Text ,系統會自動產生相對應的 Form1.zh-TW.resx 如下: Form1.zh-TW.resx 在程式一開始Using的後面加上: using System.Threading; using System.Globalization; using System.Resources; 並在 Form1 的 InitializeComponent(); 前加上: Thread.CurrentThread.CurrentCulture = new CultureInfo(""); Thread.CurrentThread.CurrentUICulture = new CultureInfo(""); 雙引號中間沒資料就是用 Default Language, 如果雙引號中間是 "zh-TW" 就是使用繁體中文如: Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW"); 再從專案中 Properties下的 Settings.settings 加一個 La

Arduino 模擬 Modbus Slave

圖片
最近又有新的案子,是要在 Window 7 下來連 Modbus 設備,很久沒寫有關 Modbus 的連線軟體了,上網再查一下 Modbus 的相關資料,居然發現了好東西,有人用 Arduino 開發模擬 Modbus Slave 的軟件,趕快下載下來測一下。 原始網頁 - Arduino Modbus Slave ,因為是別人寫的,就不方便把人家的程式展示在我這,有興趣的自己去看,我的測試環境如下: Arduin Uno 板。 Dfrobot 出的 I/O expansion (5.0) Board(上有 RS 485 介面)。 USB 轉 RS232。 RS232 轉 RS 485m LCD 1602 (I2C 介面) 。 用來 Debug 用。 Lcd 1602 I2C介面 Arduino Uno 上載 I/O Expansion 板 Usb 轉 RS232 和 Rs232 轉 RS485 還要再下載一個很好用的 Simply Modus ,這是一個把 Window 成 Modbus Master (Poll)的軟體,有了這個軟體,作 Modbus 測試很方便: Simply Modbus 的執行畫面 先用 Arduino - 0022 把下載下來的 Pde 上傳到 Arduino Uno 板子上,我有迫不急待的在Simply Modbus 上按 Send, 好像沒有結果, 下定決心把 LCD 1602的程式碼加入 Modbus_rtu_slave.pde中,我只在程式的一開始加入: #include <Wire.h>  #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); 並在 Setup 程式碼中加上: lcd.init(); lcd.backlight(); lcd.print("Start"); 為了讓 LCD 上是顯示出 HEX 數字,我又找呵一段小程式,把收到的字元轉成16 進位的數字,便於跟 Simply Modbus 上的資料直接作比對,程式如下: void lcdPrintHe

Visual 2010 C# 自動登入遠端 IP Camera

圖片
    今天又接到一個新任務, 為 IP Camera 撰寫遠端監控程式, 現在 IP Camera 無論是有線無線的使用量都很大,要能連接 IP Camera 最先要能解決的就是自動登入,目前多半的 IP Camera 都有一個小型的 Web Server 方便大家遠端設定及連線,所以要設定應該就是用 Http Web 的 Protocol 來聯就可以。 我目前要測的這一款 IP Camera,還可以遠端遙控及夜視功能,不過問題一步一步解決,下面就是我要處理的 IP Camera: Wifi IP Camera     首先先連進去看Ip Camera 自己用瀏覽器如何顯示畫面,並找出產生圖像的位置,這台 Ip Camera 是產生 MJPEG,所以應該可以假設產生圖樣的程式是 *.cgi,果然沒錯用 Chrome 瀏覽器中的檢查元素就找到了: 找到負責圖像顯示的videostream.cgi     先打開 Visual 2010 C#,開啟一個 Window Application Form,為了方便測試,先設一個按鈕及文字方塊用來顯示傳回的資訊,HttpWebRequest 是定義在 System.Net 中,所以要先加一行:            Using System.Net; 接著定義:            HttpWebRequest req;            HttpWebResponse resp = null;            Uri url = new Uri("http://192.168.1.***/videostream.cgi"); //*** 是為隱藏 IP 位置            req = (HttpWebRequest)HttpWebRequest.Create(url); //Create HttpWebRequest 再來就是 Create HttpWebRespond 了,不過任何有關連線的程式多半都會產生意外斷線或連不上,所以一定要準備處理例外 Exception,我是一個懶人,所以每次都先將 try .... catch .... finally 套入,以後再填入程式碼,