• 沒有找到結果。

SML於通訊模組上的應用

4.5 SECS M ESSAGE L ANGUAGE 介紹

4.5.2 SML於通訊模組上的應用

本文所研究的通訊模組中,除了獨立的使用者介面之外,還必須實作 SML 使其具 有支援 SML 語法的功能。內含 SML 功能的通訊模組須具備有 Screen Logging 和 Data Logging 的功能。所謂的 Screen Logging 指的是當通訊模組在傳送與接收訊息時,可 以在使用者介面上將所收到的訊息以 SML 的表示方法呈現,目的是讓操作員可以立即 的從螢幕上得到傳遞的訊息資訊,並做立即的處置;另一種功能為 Data Logging,指的 是通訊模組可以把編成*.sml 副檔名的 SML 檔讀入通訊模組內,操作員可以從使用者介

(from Mainframe) MessageHandle

StreamID : int FunctionID : int whichController : String MessageHandle()

表 4.8 通訊模組 SML 語法參與物件說明表

參與物件 說 明

Frame1 繪出使用者介面,可以在 Frame1 上顯示出訊息物件的 SML 語法

ReadFile

將*.sml 檔案讀取到的資料儲存到 Hashtable 中,讓 Frame1 主程式 類別可以手動選擇要送出的訊息。

SendSMLFormat

將送出的訊息串成訊息字串,然後呼叫 Encoder2ByteVisitor 物件,

將字串編譯成訊息位元組陣列,等待送出訊息。

ShowSMLFormat

用來解譯傳遞或接收到的訊息物件字串,並將訊息的 SML 語法顯示 在使用者介面上。

Encoder_SF_ID 用來解譯 GUI 上送出的訊息是哪種 Stream Function,是否須回傳。

Stack 用堆疊的方式來紀錄 SML 編碼時的層數。

下圖 4.17 所示為通訊模組接收訊息物件後顯示 SML 語法的循序圖,其訊息解譯 步驟為:

1. 當通訊模組在接收到訊息物件後會先經由 HSMS 物件解譯,取出該訊息的 HSMS Header,從 Header 中可以判斷出該物件的 Stream ID 和 Function ID;

2. HSMS 物件呼叫 SECS 物件的 getInstance()方法,等待將建立好的訊息物件放 入 MessageQueue 中;

3. HSMS 呼叫 MessageHandle 物件的 Decoder()方法,由 MessageHandle 物件 建立該訊息的訊息物件;

4. 在 MessageHandle 物件中建立 ShowSMLFormat 的物件並將呼叫訊息物件 Encoder()方法所得到的訊息字串傳入該物件的 showSMLfromDecoder()中;

5. 經由堆疊的方法判斷訊息資料項目的層數,並一層一層的將訊息內容串成一個 文字字串;

6. 將所得到的字串內容傳遞到 Frame1 物件的使用者介面上,顯示出所收到訊息 的 SML 語法。

: HSMS : SECS : MessageHandle

: ShowSMLFormat

: Stack : Frame1

getInstance( )

Decoder(byte[], int)

push(char)

pop(int[]) showSMLfromDecoder(String)

append(String)

圖 4.17 接收訊息後顯示 SML 語法的循序圖

下圖 4.18 所示的是通訊模組在讀取 SML 檔案後傳送訊息時的循序圖,其訊息傳 遞順序為:

1. 由 Frame1 物件建立一 ReadFile 物件,並呼叫該物件的 readSMLfile()方法,

解譯從檔案中所得到的訊息內容;

2. ReadFile 物件建立一 Hashtable 物件並呼叫 pushSFIntoHashtable()方法,將 SML 檔案所得到的訊息內容存到 Hashtable 中;

3. 當按下 Frame1 上的 Send 按鈕後,建立一個 SendSMLFormat 物件並呼叫該 物件的 encode_SML()方法;

4. 經由堆疊的方式判斷訊息資料項目的層數,一層一層的將訊息內容串成一個文

字字串,並透過呼叫 Encoder2ByteVisitor 物件,將字串編譯成訊息位元組陣列;

5. 建立 Encode_SF_ID 物件,將 Frame1 上所點選到的訊息傳遞給該物件,用來 解譯 GUI 上送出訊息 Stream ID 與 Function ID,以及是否須回傳的 W bit;

6. 呼 叫 SECS 物 件 的 SendMessage() 方 法 , 將 所 得 到 的 位 元 組 陣 列 及 Encode_SF_ID 物件傳入方法內,並將訊息送出。

: Frame1

: ReadFile

:Hashtable

: SendSMLFormat

: Stack

: Encode_SF_ID

: SECS SendSMLFormat(String)

encode_SML( )

Encode_SF_ID(String)

push(char)

pop(int[]) ReadFile()

putSFIntoHashtable( ) readSMLfile(java.io.FileReader)

SendMessage(String, byte[], secsii.SML.Encode_SF_ID)

圖 4.18 讀取 SML 檔案傳送訊息時的循序圖

第5章 獨立介面通訊模組控制器軟體設計與實作

獨立介面通訊模組控制器(Independent-Interface SECS Communication Module Controller, i-SECS)的設計目的是希望將通訊模組的功能整合到一獨立的使用者介面 上,並藉由訊息的傳遞達到設備控制與製程監控的目的。為了能夠快速擴充及替換設計 元件,因此在程式設計上採用Framework的觀念,將程式模組化,並應用Design Patterns 來達到程式「可再利用」的目的。在功能擴充時,可以直接新增類別到控制器,避免新 增的功能影響到原來的程式設定;在程式修改時,因為採取模組化方式將程式區分成不 同的功能模組,因此可以直接修改模組或是將模組替換,減少程式重新開發的時程。本 章將說明i-SECS的設計架構並介紹i-SECS控制器程式的使用者介面。