1、 巨集指明 第十八章 巨集指明. 2 18.1 Macro編輯器功能使用明 2 18.2 巨集指的結構 11 18.3 巨集指的語法 13 18.3.1 常和變. 13 18.3.1.1 常 13 18.3.1.2 變 13 18.3.2 運算符號 15 18.4 語 18 18.4.1 定義語 18 18.4.2 賦值語 18 18.4.3 輯運算語. 18 18.4.4 多重判斷語. 20 18.4.5 迴圈語 22 18.4.5.1 for-next語 22 18.4.5.2 while-wend語 23 18.4.5.3 其他控制命. 24 18.5 子函 25 18.6 內置函功能.
2、 28 18.6.1 學運算函. 28 18.6.2 資轉換函. 34 18.6.3 資操作函. 39 18.6.4 位元態轉換. 42 18.6.5 通訊有關的函 44 18.6.6 字處函. 60 18.6.7 其他函 84 18.7 怎樣建和執巨集指 91 18.7.1 怎樣建一個巨集指. 91 18.7.2 執巨集指. 96 18.8 使用巨集指時的注意事項 98 18.9 使用自由協定去控制一個設備 99 18.10 編譯錯誤提示資訊 106 18.11 巨集指範程式 113 18.12 Macro TRACE 函 118 18.13 字處函式使用方法. 126 18.14 Macr
3、o 密碼保護 137 1巨集指明 第十八章 巨集指明 巨集指提供應用程式之外所需的附加功能。在MT8000人機界面運時,巨集指可以自動的執這些命。它可以擔負執譬如複雜的運算、字處,和使用者與工程之間的交等功能。本章主要介紹巨集指的語法、如何使用和編輯方法等功能。希望通過本章的明,能夠使各位能夠快速的掌握EB8000軟體提供的強大的巨集指功能。 18.1 Macro編輯器功能使用明 1. Macro編輯器提供下新功能: a. 顯示號 b. 原(Undo) / 重複(Redo) c. 剪下(Cut) / 複製(Copy) / 貼上(Paste) d. 全選(Select All) e. 建/取消書
4、籤(Toggle Bookmark) / 上一個書籤(Previous Bookmark) / 下一個書籤(Next Bookmark) / 清除全部書籤(Clear All Bookmarks) f. 程式碼摺疊(Toggle All Outlining) 以下將詳細描述如何使用各項功能。 2. 打開Macro編輯器,可以看到編輯區左邊將自動顯示號。 2巨集指明 編輯區3. 編輯區中按鼠右鍵,叫出右鍵選單如下圖: 3巨集指明 目前的態無法使用的功能將顯示灰色。如必須在編輯區中選取一段文字才會開啟copy功能,因此未選取任何文字的態下,copy功能暫開啟。 提供快速鍵,如選單內所提示。 4.
5、編輯區上方有工具,提供” 原”、” 重複”、” 剪下”、” 複製”、” 貼上”、” 建/取消書籤”、” 下一個書籤”、” 上一個書籤”、” 清除全部書籤”等按鈕方快速選取。 5. 改變編輯區內容將開啟Undo功能,使用者執Undo後可用Redo原。使用者可從右鍵選單或是用熱鍵(Undo: Ctrl+Z, Redo: Ctrl+Y)執此功能。 Undo Undo 4巨集指明 Redo Redo 6. 在編輯區選取一段文字後可進Cut、Copy,之後可用Paste貼上。 5巨集指明 7. 選擇”Select All”選取編輯區全部內容。 8. 當程式碼很長的時候,為方使用者閱,提供書籤功能。下面明
6、如何使用此功能。 6巨集指明 a. 將游標移至編輯區中想要插入書籤的位置,按右鍵,選擇”Toggle Bookmark”。編輯區左邊將會看到一個代表書籤的色小方塊。 b. 游標所在位置已存在書籤,選擇”Toggle Bookmark”可將其關閉,反之,選擇”Toggle Bookmark”可將其開啟。 c. 右鍵選擇”Next Bookmark”游標將會移至下一個書籤所在位置。選擇”Previous Bookmark” 游標將會移至上一個書籤所在位置。 7巨集指明 Next Bookmark Next Bookmark Next Bookmark d. 選擇”Clear All Bookmar
7、ks”將關閉所有書籤。 9. Macro編輯器提供程式碼折疊功能,方使用者瀏覽程式碼。所謂程式碼摺疊,是指編輯器可將屬於同一區塊的程式碼隱藏起,被隱藏起的程式碼在編輯區會顯示成。編輯區左側會顯示樹圖,使用者可按下隱藏程式區塊,按下展開程式區塊。如下圖所示: 8巨集指明 按下摺疊for-next 按下摺疊if then-end if 10. 右鍵選擇”Toggle All Outlining”可展開所有程式碼區塊。 9巨集指明 11. 有時候程式碼區塊可能會誤判。這種誤判起因於編輯器沒有辦法區分當前輸入的關鍵字是否存在於注釋中。如: 使用者可以從右鍵選單選擇“Update All Outlini
8、ng”正這個錯誤。 12. 包圍在特定關鍵字內的程式碼稱為一程式碼區塊。內定的程式碼區塊如下: a. 子函: sub end sub b. 迴圈語: i. for next ii. while wend c. 輯運算語: i. if end if d. 多重判斷語: select case end select 10巨集指明 18.2 巨集指的結構 巨集指是由各種語組成的。這些語包含常、變和各種運算符號。這些語放置在特定的順序位置以執後達到一個希望的執結果。 巨集指的結構一般為以下格式: 總體變聲明 -可選 Sub Function Block Declarations(子函聲明) - -可選
9、 局部變聲明 End Sub(結束子函) macro_command main() 主函 -必須 局部變聲明 各式語 end macro_command 結束主函 - -必須 一個巨集指必須有一個且只有一個主函,用開始巨集指的執。格式為: macro_command 函名稱() end macro_command 變聲明必須放在巨集指語的前面,否則如果語放置在變聲明的前面,將會造成巨集指無法編譯通過。 局部變一般用在巨集指主函或者自定義的子函中。它的合法性只在指定的函中有效。 總體變一般是定義在所有巨集指函的前面,且它在整個巨集指中均具有有效性。當局部變和總體變被定義為相同的名稱時,只有局部變
10、有效。 下面就是一個簡單的巨集指,其中就包含變聲明和函呼叫。 macro_command main() short pressure = 10 / 局部變聲明 SetData(pressure, “Allen-Bradley DF1“, N7, 0, 1) / 函呼叫 11巨集指明 end macro_command 12巨集指明 18.3 巨集指的語法 18.3.1 常和變 18.3.1.1 常 常是一個可以被各式語直接使用的固定的資。有如下格式: 常型 使用明 舉 十進位整 345, -234, 0, 23456 十進位 必須以 0x開頭 0x3b, 0xffff, 0x237 字元型 字
11、元必須使用單引號 a, data, 函名稱 布型 true, false 下面即為一個簡單的常使用的範。 macro_command main() short A, B / 聲明A和B為短整型變 A = 1234 B = 0x12 / 1234 和 0x12 即為常 end macro_command 18.3.1.2 變 變是一個代表著各種資的名稱。在巨集指中,這些資可以隨著巨集指語執的結果改變而改變。 變的命名規則 1. 必須以英文字母開頭 2. 變名稱長超過32個字元 3. 系統保暫存器名稱能作為變名稱。 下面為8種同的變型,前5種為有號值型態,後3種為無號值型態: 13巨集指明 變型
12、描述 範圍 Bool 布型 1 bit (一個位) 0, 1 Char 字元型 8 bits (一個位元組) 127 Short 短整型 16 bits (一個字元) 32767 Int 雙整型 32 bits (雙字元) 2147418112 Float 浮點型 32 bits (雙字元) Unsigned Char 字元型 8 bits (一個位元組) 0 到 255 Unsigned Short 短整型 16 bits (一個字元) 0到65535 Unsigned Int 雙整型 32 bits (雙字元) 0到4,294,967,295 變聲明 變必須在使用前聲明。所以,在巨集指,所
13、有的變都必須在語使用前都被聲明完成。聲明變時,先定義變的型,後面再跟著變名稱。 如下範: int a short b, switch float pressure unsigned short c 陣聲明 巨集指支援一維陣(下標從0開始)。聲明陣變時,先定義陣變的型,變名稱,接著就是該陣變的個,變個必須放置在“”符號中。陣變的長為14096。一個巨集指中只支援4096個變。 如下範: int a10 short b20, switch30 float pressure15 陣的下標最小為0,最大下標為(陣的長-1) 如下範: char data 100 / 陣變的長是100 所以: 最小的陣為
14、“data0”,最大的陣為“data99”,即100-1=99。 14巨集指明 變和陣初始化 有種方法可以讓變初始化: 1. 使用語中的賦值語(=) 如下範: int a float b3 a = 10 b0 = 1 2. 聲明變時直接賦值 char a = 5, b = 9 陣變的聲明是一個特殊的情況。一個完整的陣被初始化時,可以在陣變聲明時,將資放置在波形括弧“”面,各資使用逗號分開。 如下所示: float data4 = 11, 22, 33, 44 /這樣 data0 = 11, data1 = 22. 18.3.2 運算符號 運算符通常被用指定資是如何被操作的。在任何一個語中,運算
15、符左邊的變結果均依據運算符右邊的條件而獲得。 運算符號 描述 舉 = 賦值運算符號 pressure = 10 學運算符號 描述 舉 + 加 A = B + C - 減 A = B C * 乘 A = B * C / 除 A = B / C % 求餘 (返回剩餘) A = B % 5 15巨集指明 比較運算符號 描述 舉 大於 if A 10 then B = 5 = 大於或者等於 if A = 10 then B = 5 = 等於 if A = 10 then B = 5 10 then B = 5 輯運算符號 描述 舉 And 與 if A 5 then C = 10 Or 或 if A
16、= 10 or B 5 then C = 10 Xor 或 if A xor 256 then B = 5 Not 非 if not A then B = 5 移位元和位元運算符號通常被用操作字元型變、短整型變和雙整型變的位元。在一個語中,這些運算符號的優先權是在從該語的左邊到右邊依此執的。即在語中左邊位置的優先執,依次從左到右執。 移位運算符號 描述 舉 往右移動指定的位 A = B 8 位運算符號 描述 舉 & 位與運算 A = B & 0xf | 位或運算 A = B | C 位或運算 A = B C 位取反運算 A = B 所有運算符號的優先權 上述所有運算符號的優先權從高到低詳細如下
17、所述: 位於圓括號面的運算符號最優先 學運算符號 移位和位元運算符號 比較運算符號 輯運算符號 賦值運算符號 16巨集指明 關鍵字 下面的關鍵字為巨集指保使用。這些均能用作為變名稱、陣名稱或者函名稱等。 +, -, *, /, %, =, , , =, and, or, xor, not, ,=, &, |, , exit, macro_command, for, to, down, step, next, return, bool, short, int, char, float, void, if, then, else, break, continue, set, sub, end, w
18、hile, wend, true, false SQRT, CUBERT, LOG, LOG10, SIN, COS, TAN, COT, SEC, CSC, ASIN, ACOS, ATAN, BIN2BCD, BCD2BIN, DEC2ASCII, FLOAT2ASCII, HEX2ASCII, ASCII2DEC, ASCII2FLOAT, ASCII2HEX, FILL, RAND, DELAY, SWAPB, SWAPW, LOBYTE, HIBYTE, LOWORD, HIWORD, GETBIT, SETBITON, SETBITOFF, INVBIT, ADDSUM, XORS
19、UM, CRC, INPORT, OUTPORT, POW, GetError, GetData, GetDataEx, SetData, SetDataEx, SetRTS, GetCTS, Beep, SYNC_TRIG_MACRO, ASYNC_TRIG_MACRO, TRACE, FindDataSamplingDate, FindDataSamplingIndex, FindEventLogDate, FindEventLogIndex StringGet, StringGetEx, StringSet, StringSetEx, StringCopy, StringMid, Str
20、ingDecAsc2Bin, StringBin2DecAsc, StringDecAsc2Float, StringFloat2DecAsc, StringHexAsc2Bin, StringBin2HexAsc, StringLength, StringCat, StringCompare, StringCompareNoCase, StringFind, StringReverseFind, StringFindOneOf, StringIncluding, StringExcluding, StringToUpper, StringToLower, StringToReverse, S
21、tringTrimLeft, StringTrimRight, StringInsert 17巨集指明 18.4 語 18.4.1 定義語 這個定義語包含變和陣的聲明。正式的格式如下: 型 名稱 當定義一個名稱的型時 舉: int A /定義變A為雙整型格式 型 陣名稱陣長 當定義陣名稱的型時 舉: int B10 定義一維陣變B的長為10,型為雙整型 18.4.2 賦值語 賦值語使用賦值運算符號將賦值運算符號右邊運算式運算的結果放置到運算符號左邊的變中。一個運算式是由變、常和各種運算符號組成,執後產生一個新的資。 變 = 運算式 舉 A = 2 這樣變A就被賦值為2 18.4.3 輯運算語
22、輯運算語是根據輯(布)運算式的結果執相應的動作。它的語如下所示: 單格式 if then Statements else 18巨集指明 Statements end if 舉: if a = = 2 then b = 1 else b = 2 end if 區塊格式 If then Statements else if then Statements else Statements end if 舉: if a = = 2 then b = 1 else if a = = 3 then b = 2 else b = 3 end if 語法描述: if 必須用在該語的開始部分 必要條件。 這是一
23、個控制語。當為0時,即為“FALES”,(條件為假);當為非0時,即為“True”(條件為真)。 then 當執為“TRUE”(真)時,必須放置在需要執的語之前。Statements 在區塊形式中是可選擇的,在單形式中,且沒有else子時,為必要,該語在為真時執。 19巨集指明 else if 可選,一條或多條語,在相對應的為true時執。 可選,解釋同Condition else 可選,在上述Condition和Condition n都為true時執。 end if 必須。在一個if-then語中使用這個結束if-then語。 18.4.4 多重判斷語 Select-case可用處多重判斷的
24、敘述,其功能似if-else語。根據所指定變的值,分別對應到符合該值的case,並執case下面的敘述,直到遇到break敘述時,才跳到結束符號end select處。語法結構如下: 沒有預設case的形式: Select Case variable Case value Statements break end Select 舉: Select Case A Case 1 b=1 break end Select 有預設case的形式: Select Case variable Case value Statements break Case else Statements break en
25、d Select 20巨集指明 舉: Select Case A Case 1 b=1 break Case else b=0 break end Select 多個同case對應到相同區塊: Select Case variable Case value1 Statements Case value2 Statements break end Select 舉: Select Case A Case 1 Case 2 b=2 Case 3 b=3 break end Select 語法描述: Select Case 必須用在該語的開始部分。 variable 必要條件。 此變將會與每一個ca
26、se做比較。 Case else 可選。代表預設case。當 variable的值符合任何一個case時,將會執此敘述下面的區塊。在沒有預設case的情況,當 variable的值符合任何一個case時,將會做任何動作而直接跳出select控制結構。break 可選。跳到某一個case下面執時,將一一執case語下面的21巨集指明 敘述直到遇到break命才結束,並跳到end select敘述。當case敘述下面沒有任何break命時,程將斷往下執,直到遇到end select敘述,才結束並跳出select控制結構。 end Select select-case語的結束標誌。 18.4.5 迴
27、圈語 迴圈語依據迴圈條件反的執一個任務。迴圈語有種表達方式。 18.4.5.1 for-next語 For-next語通常用執次固定的迴圈任務。一個變用作為任務執次的計器和結束迴圈任務執的條件。這個變為固定執的次。語法結構如下: for Counter = to step Statements next Counter 或者 for Counter = down step Statements next Counter 舉: for a = 0 to 10 step 2 b = a next a 語法描述: for 必須用在該語的開始部分。 Counter 必要,迴圈計器的值變,該變的結果用計
28、迴圈的次。 必要,Counter的初值。 to/down 必要。用決定步長是遞增還是遞減。 “to” 以為步長遞增 22巨集指明 “down” 以為步長遞減 必要,Counter的終值、測試點。當大於該值時,巨集指將結束這個迴圈任務。 step 可選,指定的步長,指定為1以外的值。 StepValue 可選,Counter的步長,只能是值,如果沒有指定,則預設為1。 Statements 可選,for和next之間的語區塊,該語區塊將執所指定的次。 next 必須的。 Counter 可選。 18.4.5.2 while-wend語 While-wend語是用執確定次的迴圈任務。設置一個變用判
29、斷結束迴圈的條件。當條件為“True”時,該語將一直迴圈執直到條件變為“False”。語法結構如下: while Statements wend 舉: while a (parameters) Local variable declarations Statements return value end sub 舉: sub int Add(int x, int y) int result result = x +y return result end sub macro_command main() int a = 10, b = 20, sum sum = Add(a, b) end ma
30、cro_command 或: sub int Add() int result, x=10, y=20 result = x +y return result end sub macro_command main() int sum sum = Add() end macro_command 25巨集指明 沒有返回值的子函語法: sub (parameters) Local variable declarations Statements end sub 舉: sub Add(int x, int y) int result result = x +y end sub macro_comman
31、d main() int a = 10, b = 20 Add(a, b) end macro_command 或: sub Add() int result, x=10, y=20 result = x +y end sub macro_command main() Add() end macro_command 語法描述: sub 必須用在該子函的開始部分。 type 可選。用定義子函執後返回的資型。子函也可以回傳任何值。 (parameters) 可選。這些保從主函傳入的值。這些被傳入的必須使用與在變聲明的型一致。 舉: sub int MyFunction(int x, int y).
32、 x 和 y 必須為從主函中傳過的雙整型資格式的資。調用此子函的語格式大致為這樣: ret = MyFunction(456, pressure),其中pressure需為雙整型資格式方符合子函變的聲明。 請注意調用語的部分可以是常也可以是變。當執這個子函26巨集指明 後,一個雙整型資將會返回給變“ret”。 Local variable declaration 除被傳遞的之外,子函中使用的變必須事先聲明。在上面的“舉”中,X和Y就是子函可以使用的變。總體變也可以用在子函中。 Statements 需要執的語。 return value 可選。用將執的結果返回給調用語。這個結果可以是一個常或者
33、變。返回後同時也結束子函的執。子函也可以回傳任何值,但是當type部分有定義時,則必須加上此return敘述。 end sub 必須的。用結束子函。 27巨集指明 18.6 內置函功能 EasyBuilder8000軟體巨集指中本身提供一些內建的函用從PLC獲取資和傳輸資到PLC、資處和學運算等。 18.6.1 學運算函 函名稱 SQRT 語法 SQRT(source, result) 描述 開平方根。資源“source”可以是常或者變,但是存放結果的“result”必須為變。資源必須為一個正。 舉 macro_command main() float source, result SQRT(
34、15, result) source = 9.0 SQRT(source, result)/ 執後result = 3.0 end macro_command 函名稱 CUBERT 語法 CUBERT (source, result) 描述 開三次方根。資源“source”可以是常或者變,但是存放結果的“result”必須為變。資源必須為一個正。 舉 macro_command main() float source, result CUBERT (27, result) / 執後result = 3.0 source = 27.0 CUBERT (source, result)/ 執後res
35、ult = 3.0 28巨集指明 end macro_command 函名稱 POW 語法 POW (source1, source2, result) 描述 計算source1的某次方(source2)。資源“source1”和“source2”可以是常或者變,但是存放結果的“result”必須為變。資源必須為一個正。舉 macro_command main() float y, result y = 0.5 POW (25, y, result) / 執後result = 5 end macro_command 函名稱 SIN 語法 SIN(source, result) 描述 三角函的正
36、弦計算。資源“source”可以是常或者變,但是存放結果的“result”必須為變。 舉 macro_command main() float source, result SIN(90, result)/ result is 1 source = 30 SIN(source, result)/ result is 0.5 end macro_command 函名稱 COS 語法 COS(source, result) 描述 三角函的餘弦計算。資源“source”可以是常或者變,但是存放結果的“result”必須為變。 舉 macro_command main() float source,
37、result COS(90, result)/ result is 0 29巨集指明 source = 60 GetData(source, “Local HMI“, LW, 0, 1) COS(source, result)/ result is 0.5 end macro_command 語法名稱 TAN 語法 TAN(source, result) 描述 三角函的正計算。資源“source”可以是常或者變,但是存放結果的“result”必須為變。 舉 macro_command main() float source, result TAN(45, result)/ result is 1 source = 60 TAN(source, result)/ result is 1.732 end macro_command 函名稱 COT 語法 COT(source, result) 描述 三角函的餘計算。資源“source”可以是常或者變,但是存放結果的“result”必須為變。 舉 macro_command main() float source, result COT(45, result)/ result is 1 source = 60 COT(source, result)/ result is 0.5774 end macro_command 30