2015年10月23日 星期五

亂數的使用簡介

在C#中,要使用亂數產生器是非常容易的

他的建構子有兩種,一種是有參數的,一種是沒有參數的,沒有參數的就會拿時間來當作亂數種子來產生亂數,有參數的則會拿該數值跟種子來產生亂數。

所以如果在非常短的時間內,連續要產生器吐出亂數出來,就要注意種子的給法,不然就會出現一堆都是相同的亂數,因為即便你用了無參數的建構子,他用了「時間」來當參數,但是程式跑得太快,時間還沒有變動下,出來的亂數就會一樣了。

所以建議自己傳入參數,而且每次產生亂數產生器的時候,都給一個當下時間+不定變數,比方給loop的i加上時間的Millisecond或者更複雜等等。


Random RandNum = new Random();


Random RandNum = new Random( DateTime.Now.Millisecond + i );

2015年8月17日 星期一

OPC 協會所定義的 OPC Server and Client簡述

OPC DataAccess Server is comprised of several objects: the server, the group, and
the item The OPC server object maintains information about the server and serves as a container for OPC group objects. The OPC group object maintains information about itself and provides the
mechanism for containing and logically organizing OPC items.

Data can be read and written

Exception based connections can also be created between the client and the items in the group and can be enabled and disabled as needed.

There are two types of groups, public and local (or ‘private’).Public is for sharing across multiple
clients, local is local to a client

The OPC Items represent connections to data sources within the server

An OPC Item, from the custom interface perspective, is not accessible as an object by an OPC Client All access to OPC Items is via an OPC Group object that “contains” the OPC item

Note that the items are not the data sources - they are just connections to them.

For example, the tags in a DCS system exist regardless of whether an OPC client is currently accessing them. The OPC Item should be thought of as simply specifying the address of the data, not as the actual physical source of the data that the address references.

An OPC client application communicates to an OPC server through the specified custom and automation interfaces. OPC servers must implement the custom interface, and optionally may implement

the automation interface












2015年7月29日 星期三

try-catch -finally 之finally之特別用處

為什麼需要寫 finally那段

try
{

}
 catch (Exception e)

         
}
finally
{
       DoSomeClose();
}


如果寫成

try
{

}
 catch (Exception e)

         
}


DoSomeClose();

不也一樣嗎?我就是要在try catch之後去執行DoSomeClose();
事實上確實不同,finally確實有其特別之處

少了他,如果try或catch之中,有直接寫了return
那就不會執行DoSomeClose();

finally則會強制在你即便要return跳離開這段程式碼之前,也會先執行finally裡面的程式的



2015年7月15日 星期三

多國語言小數點符號處理

撰寫多國語系的軟體,必須注意到一些特殊處理事項
本篇所針對的數值呈現問題,將可能造成很嚴重的後果

首先,先明白數值表示法這件事情,在某些歐洲或美洲、東南亞地區數值的小數點符號,並不是「.」,而是「,」,所以當你的程式輸出檔案或者顯示在主控台的時候,會出現312.566被顯示成312,566 這種情形。如下圖的 fValue




這樣的狀況並不只是看起來怪怪的而已,更嚴重的是,如果你要下SQL指令,而且你的指令並不是透過SqlCommand物件的正規使用方式來進行,而是自己串出SQL指令的話,就會讓指令失敗,由於你的數值如果帶有小數點,會變成逗號,這會讓SQL指令被誤解析。

比方
sb.Append("INSERT INTO TB_RECORD_RAW VALUES (").Append(intIoId).Append(",").Append(douValue).Append(");”).
原本預期輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194.566 );
但結果會輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194,566 );
這會讓SQL誤判有三個參數要Insert,但是實際上只有兩個。結果要不就是填錯欄位,要不就會新增失敗(也許欄位不夠多)。


解決這個問題有兩種方式,要不就是透過SqlCommand物件的正規使用方式來進行。要不就是透過修改數值顯示方式(各國有各種特定的表示方式,可以在程式中強制統一),底下針對修改數值顯示方式來介紹。

CultureInfo TheCulture = new CultureInfo("en-US", false);
NumberFormatInfo NumFmtInf = TheCulture.NumberFormat;
NumFmtInf.NumberDecimalSeparator = ".";
NumFmtInf.NumberDecimalDigits = 10;

Double TestDot_ Double = 123.4567;
String Str_Result = String.Format(TheCulture, "{0:F}", TestDot_Double);

透過CultureInfo所建立的物件,會存放著作業系統的文化語言相關設定,指定為"en-US"是美國 “zh-TW則是台灣所有語言列表於http://www.csharp-examples.net/culture-names/


也可以客制化的修改小數點符號,也可指定浮點數一律顯示到小數點後第幾位,這邊稍微要注意的是,當你在此指定了小數點後第幾位,則不足位數會補零,比方123.4567000000。如果不設定呢,則預設會顯示小數點兩位,進行四捨五入。

2015年5月19日 星期二

ref 與 out 修飾詞的比較

1.方法參數宣告為ref與out時,在編譯時視為相同。(同樣的方法,用ref ,另外一個用out並不會被視為多型)
2.ref與out,都是將參數以ByRef方式傳遞。

3.ref參數在傳入方法之前,要先初始化完畢。

4.out參數在方法結束之前,要先初始化完畢。(當呼叫宣告為out參數的方法時,不管變數有沒有初始化,都可以傳入方法中執行,只要在方法結束前,方法內參數有初始化,就不會出現編譯錯誤。)

5.ref 不會強制要求函式內的程式,一定要修改傳入的參數,但 out 會。

2015年5月14日 星期四

C# 中如何將控制項陣列化

C# 如果要做到類似VB那種一大堆控制項陣列的方式來使用控制項
做法如下


先在Form視窗元件上面拉出要使用的控制項
假設要用4個元件,就拉4個出來
然後撰寫以下的程式碼(假設拉出來四個Label。名稱分別是label1 ~ label4)

Label[] Lbl_Shade = new Label[] { label1, label2, label3, label4 };

之後就可以如下的方式來使用


            Lbl_Shade[0].Text = "001";
            Lbl_Shade[1].Text = "002";
            Lbl_Shade[2].Text = "003";
            Lbl_Shade[3].Text = "004";

這樣比一個一個名稱來控制方便多了。

2015年2月8日 星期日

工業設計之跑步機UX

關於UI設計,雖然我也不是很專精
但是,以目前略懂略懂的情況來研究一下手邊的事物,總會有些體會的


來看看「公司的跑步機」



我動身體的時候,也來動動惱了
我們看看這樣的面板吧
第一個印象就是,好擁擠啊,不美觀啊
一堆按鈕也讓人覺得稍微會有恐懼的
加上一堆說明文字,這非常的不OK呀







再來看一個重點了,速度按鈕這邊有三個不好的設計

1.按鈕是沒有很好理解的圖示,這是鯊魚嗎?圓形按鈕上面有個圓角的三角形。簡單的圓形圖示,三角形指示方向就夠了

2.左邊表示提高,右邊表示降低,這裡其實也沒那麼不順,但是,一般提高會擺在右邊的。

3.光看圓形的部分,上升按鈕的圓形在底下,下降按鈕的圓形在上面,這點是蠻矛盾的,各位想像一下電梯的上升跟下降按鈕的位置,往上當然放在上的位置,如果往上放在下面的位置就違反了世俗的規範,容易造成使用者的困惑跟操作錯誤的










最後在看一下兩排速度按鈕跟高度按鈕,這樣的排列方式,說明文字又在奇怪的位置,再一排按鈕的正中間上方,又再調整速度跟高度按鈕的下方,設計的不是很好,還不如用個矩型把按鈕排列好,看起來比較整齊清爽些。