西門子mb是什么數據類型(西門子mb0指的是什么)
第一:S7-SCL簡介
S7-SCL(Structured Control Language 結構化控制語言) 具有以下特點:
是一種類似于PASCAL的高級編程語言,符合國際標準IEC 61131-3PLCopen基礎級認證適用于 SIMATIC S7-300 (推薦用于CPU314以上CPU), S7-400, C7 and WinACS7-SCL 為 PLC 做了優化處理,它不僅僅具有 PLC 典型的元素(例如 輸入/輸出,定時器,計數器,符號表),而且具有高級語言的特性, 例如:循環、選擇、分支、數組、高級函數
S7-SCL 其非常適合于如下任務:
復雜運算功能
復雜數學函數
數據管理
過程優化
第二:S7-SCL 與 STL
S7-SCL 可以編譯成 STL, 雖然其代碼量相對于 STL 編程有所增加,但我們更關心的是程序結構和程序的總體效率。類似于計算機行業的發展,匯編語言已經被舍棄,取而代之的是 C/C++等高級語言。S7-SCL 對工程設計人員要求較高,需要其具有一定的計算機高級語言的知識和編程技巧。
第三:S7-SCL 的安裝與使用:
STEP7 標準版并不包括 S7-SCL 軟件包及授權,需單獨購買,STEP7 Professional 版包括了S7-SCL 的軟件包及授權,安裝即可。在 S7 程序中,S7-SCL 塊可以與其它 STEP7 編程語言生成的塊互相調用。S7-SCL 生成的塊也可以作為庫文件被其它語言引用。由于 S7-SCL 程序由 ASCII 文本構成,所以它非常容易被導入或導出。
第四:S7-SCL 軟件兼容性
不同 S7-SCL 軟件版本與 STEP7 及操作系統之間的兼容性:圖中的 X 表示兼容,- 表示不兼容
僅僅 S7-SCL V5.1+SP1或以后版本支持
僅僅 S7-SCL V5.1+SP1或以后版本支持
僅僅 S7-SCL V5.1+SP1或以后版本支持
第五:S7-SCL 簡單示例
在下面的例子中,編寫一個完成軟件濾波程序的 FB1, 程序每調用一次 FB1, 其采集一個新的過程變量,存儲在 FIFO 堆棧中,共 10 個周期的采樣值,超過 10 個周期的采樣值將被舍棄。程序將此 10 個采樣值中的最大最小值找出,并計算出除去最大值及最小值之后的平均值。
平均值(濾波輸出)=(10 個采樣值之和-最大值-最小值)/8 平均值(非濾波輸出)=轉換后的實時采樣值
新建項目,插入 SCL Source
雙擊,SCLSource 打開 SCL 環境,并使用 FB 模板
更改 FB編號
使用參數模板
編輯 FB參數
使用調用功能塊向導
調用 FC105
由于在 SCL中調用了 FC105, 還需在 SIMATIC Manager 將 FC105 添加到項目中
FC105 復制到當前項目中
FB1 參數定義
FC105調用
下面的程序中使用了判斷條件,在此使用 IF 模板
使用 IF, FOR-NEXT等高級語言的方式,很容易就可編寫出濾波程序
在菜單 Option-Customize中選擇生成調試信息
在菜單的 File-Compile編譯沒有錯誤后,就可以生成 FB1 了,在 OB35 中可以調用 FB1,下載整個項目后監控 OB35:
輸出參數 SCALED_VAL 為實時的采樣值
輸出參數 SCALED_FILTED 為濾波后的采樣值
假設OB35的執行周期為T, 如果某時刻采樣值發生變化,那么此數值將不同于以前的多個采樣值,此數值可能被認定為最大值或最小值,而最大值或最小值將被忽略,這樣就實現了濾波的效果。當采樣值發生變化,并維持了大于等于2T的時間,此時的輸入值的兩次采樣值會被濾掉一個采樣值,而另一個采樣值將參與平均值的運算。
可以在高級語言界面下監控 FB1
至此,一個簡單的 S7-SCL 程序示例就結束了,本文中僅是對其非常簡單的作了介紹。任何編程語言都有其復雜性,并非一朝一夕就可掌握。
第六:S7-SCL 常見問題
問題:S7-SCL 支持哪些 STEP7 塊,與其它語言有什么關系?
解答:S7-SCL 支持如下 STEP7 的塊:OB,FC,FB,DB,UDT。在 S7 程序中,S7-SCL 塊可以與其它STEP7 編程語言生成的塊互相調用。S7-SCL 可以被編譯成 STL, S7-SCL 生成的塊也可以作為庫文件被其它語言引用。由于 S7-SCL 程序由 ASCII 文本構成,所以它非常容易被導入或導出。
問題:如何規范地的開發一個 S7-SCL 程序?
解答:開發一個 S7-SCL 程序,應當遵循如下流程:
規劃需要的塊類型,即程序的整體結構。如:是否僅僅一個 FC就可滿足要求,還是需要生成其它 OB, FB 等
規劃子任務(FB,FC等等)
定義各個子任務的之間輸入/輸出接口
定義各個子任務在原文件中的順序及調用關系
定義符號表
編譯檢查
下載調試
問題:如何加密我的 S7-SCL 程序?
解答:S7-SCL 程序加密與 STL 程序加密方法幾乎一樣,用戶可以在程序中加入關鍵字:
KNOW_HOW_PROTECT,再進行編譯即可,下圖中的 FC1 在編譯后,即出現了加鎖保護的圖標 。注意:提供給最終用戶的項目中應當刪除 S7-SCL 源代碼,否則用戶在雙擊加密的塊后(例如下圖中的 FC1),依然可以關聯打開 S7-SCL 源代碼。
問題:為什么雙擊打開 S7-SCL 類型的程序后,顯示的格式卻是 STL 格式?
解答:S7-SCL 程序編譯后生成的執行代碼實際上為 STL 格式,如下圖中的 FC1, 雖然其標示為 SCL格式,但如果用戶將 Source 目錄中的 FC1 的源文件刪除后,再雙擊打開 FC1 后,顯示的將為 STL 格式。
注意:提供給最終用戶的項目中如果刪除 S7-SCL 源代碼,用戶將只能看到 STL 格式的程序,稍微復雜些的 S7-SCL 程序在 STL 格式下幾乎是無法閱讀的。此方法類似于加密的效果。
問題:什么是 OK Flag?
解答:在 S7-SCL 程序中,OK 是一個布爾類型的特殊本地變量。它用來顯示塊執行是否正確。
OK 標志的使用與 STL 編程中對于 FC/FB 的 ENO 處理(STL 是用狀態字的 BR 位來保存狀態)非常相似。在程序的開始,可以將 OK 標志賦值為 TURE,如果程序執行有錯誤(例如 0 作為除數),則當程序退出時,用戶通過程序將 OK 標志改寫為 FALSE,此數值將被存儲在輸出參數 ENO 當中。OK 標志是一個系統變量,不需要定義,如果用戶希望在程序中使用此標志,可以在 S7-SCL 編程菜單 Options>Customize>Compiler 中,應當選擇 Set OK flag.項。否則 ENO 將無法被評估。
OK 標志使用的例子:
OK:= TRUE;
Division:= 1 / IN;
IF OK THEN // 除法操作正常
;// 此處可以添加在除法操作正常情況下,其它的用戶程序
ELSE //除法操作不正常;// : END_IF;
問題:在 STL 中可以讀取一個組織塊的信息 (例如 OB1 中的循環時間),在 S7-SCL 中是否存在同樣的可能?
解答:STEP7 中的任意 OB 塊在生成之后,其內部都自動生成一些特有的臨時變量,例如 OB1 中的變量 OB1_PREV_CYCLE 即為 CPU 上個掃描周期所用的時間。在 S7-SCL 編輯器中,通過“Insert > Block Template > OB”創建一個 OB 模板。在缺省情況下,此模板的臨時變量區域將創建一個 ARRAY OF BYTE 類型的臨時變量。此區域與 OB 塊的臨時變量區域是相對應的,但由于沒有變量名稱標識,并且數據類型也不相同,所以用戶使用起來非常不方便。如果用戶想要使用S7-SCL 格式的 OB 塊內的特有變量,請按下列步驟進行:
1.在路徑STEP7 的安裝路徑 \Step7\S7DATA\S7wiz 下,包含所有 OB 塊的 STL 格式模板, 可以使用寫字板打開這些模板 (例如 awl), 并復制相應變量定義。
2.創建一個新的 S7-SCL源文件并插入剛才復制的變量定義。
3.調整 S7-SCL源文件中的語法結構
4.在這個程序的開始部分,可以設置 "Title" 和"Version" , 例如 Title=" " 和 Version= '0.1'
5.在 BEGIN語句后面插入一個分號,至此,即完成格式修改。
另外,也可以打開本文中的 S7-SCL 例子目錄中的 OB_Templ 項目,其中包括了 44 個 S7-SCL 源文件格式的組織塊。
問題:如何理解 FC/SFC 的輸出參數 RET_VAL(返回值)?
解答:對于此問題,如果讀者對 PASCAL 語言或者高級編程語言非常熟悉,可能此問題就非常容易解釋。許多 SFC (系統功能) 都有輸出參數 RET_VAL (返回值) ,它提供一個可供評估的錯誤代碼。STEP 7 在線幫助中提供有更多關于系統功能和輸出參數 RET_VAL 的信息。通過在 SIMATIC 管理器中選中 SFC 然后按“F1”鍵可以獲取相關的在線幫助信息。
同樣,一個 FC 也可以返回一個結果,下面給出了一些例子,說明了如何在 S7-SCL 中調用帶有返回值 (RET_VAL) 的功能 (FC 或 SFC)。
定義 FC1, 函數類型為 INT (返回值)
調用一個系統功能 (SFC24):當調用系統功能 SFC 24“TEST_DB”(測試數據塊) 時,得到關于 CPU主內存中一個數據塊的信息。SFC24 確定指定 DB 的數據字節數,并檢查該 DB 是否受到寫保護。
選定 DB 所包含的數據字節數通過參數“DB_LENGTH”輸出,參數“WRITE_PROT”包含關于選定 DB 的寫保護 ID 的信息 (FALSE 表示沒有寫保護)。
問題:在 S7-SCL 程序中,PLC 中的地址標識與 STL/LAD 中的地址標識有何區別,使用中有何注意事項?
解答:在 S7-SCL 程序中,PLC 中的地址標識與 STL/LAD 中的地址標識基本相同,方便了編程人員快速掌握 S7-SCL 語言。下圖為 PLC 中的 S7-SCL 程序地址標識格式:
圖中一些格式有些特殊,實際上,下面的格式在 S7-SCL 中都是正確的。
DB1.D0.0:=DB1.DBX0.1;
DB1.DB1:=DB1.DBB1;
DB1.DW2:=DB1.DBW2;
DB1.DD4:=DB1.DBD4;
QX0.0:=Q0.0;
IX0.0:=I0.0;
MX0.0:=M0.0;
所以說,在一般情況下,編程人員依舊可以 STL 的標識方式用于 S7-SCL。
注意:如果數據塊編號及地址都使用了間接尋址方式,則必須使用 S7-SCL 特定的標識方式,例如
如下語句:
STATUS_1:=WORD_TO_BLOCK (INDEX).DW [COUNTER]; (此格式正確)
STATUS_1:=WORD_TO_BLOCK (INDEX).DBW [COUNTER]; (此格式錯誤)
S7-SCL 中的 PLC 地址格式
x 可以為 0 至 65535 之間的數字(絕對地址)
y 可以為 0 至 7 之間的數字(位地址)
對于其它 FB,OB,DB, T,C 等等的標識格式,S7-SCL 格式基本與 STL 格式相同,此處不做說明。
問題:為什么用戶人工輸入的程序在編譯時經常提示語法錯誤?
解答:S7-SCL 程序和所有的高級語言一樣,有著自己特定的語法,而很多編程人員容易在人工輸入程序時忽視語法格式,這樣就造成編譯錯誤。因此強烈建議編程人員使用 S7-SCL 的模板向導。
在菜單 Insert 中,提供了 Block Call, Block Template, Control Structure, 三個向導,用戶可以通過使用此向導,提高輸入效率。例如在下圖中指出了兩個常見錯誤,用戶如果使用向導,就不容易出錯誤:
S7-SCL 常見的錄入格式錯誤
問題:如何對 S7-SCL 程序中的數據塊及靜態變量初始化?
解答:S7-SCL 程序中對數據塊及靜態變量初始化和 STL 語言格式類似,下面的程序列出了正確格式:
DAT1 : REAL := 100.5; A1 : INT := 10 ;
A2 : STRING[6] := 'FACTOR';
A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0;
問題:什么是“AT”指令,如何使用?
解答: AT 指令是 S7-SCL 中特有的一個指令,初學者可能會忽略此指令,或者對其理解不夠深刻。AT 指令在 S7-SCL 中有著非常重要的地位,很多應用程序都必須使用此指令。下面將對此指令進行詳細講解。
AT 指令可以使用戶能夠以不同的數據類型來訪問一個已經聲明的變量。此指令類似于高
級編程語言中的“繼承”概念。此指令有如下特點:
特點一:定義僅在塊內有效,在接口參數中不出現
特點二:在塊中可以使用其它數據類型的視圖
特點三:它只是讓另外一些變量繼承了某個變量的特性,僅僅數據類型是新的,其它特性相同。
下面將通過具體程序對以上三個特點進行說明,首先定義 UDT100,UDT200,大小都為 12 個字節, 但結構不同。UDT100 包括一個 DATE_AND_TIME 數據類型(8 個字節),還包括一個實數(4 個字節);UDT200 包括 6 個字(12 個字節);在 FC2 定義輸入參數 Buffer, Frame1,Frame2:
特點一:定義僅在塊內有效,在接口參數中不出現。塊內定以的輸入參數有 3 個,但僅在塊內有效,在接口參數僅出現 Buffer 輸入參數
AT 指令特點說明(a)
AT 指 令 特 點 說 明 (b)
AT 指令應用例子 1:在 STL 中,用戶如果希望取得 MB0 的某一位的數值是非常容易的,例如第 3 位,直接尋址 M0.2 就可以了。而在 S7-SCL 中,由于其具備高級語言的特點,所以定義的變量的絕對地址一般是不顯現的。因此在 STL 中簡單的操作,在 S7-SCL 中卻復雜起來。但是通過使用AT 指令即可解決這個問題。下圖中的例子中,當輸入的某個字節,其輸出依次為此字節的 8 個位。
AT 指令應用例子 2:在 S7-SCL 中,ANY 數據類型的使用,經常會伴隨著 AT 指令的使用,下面的例子演示了如何拆分改寫 ANY 數據類型中的內容。程序執行結果相當于:
CALL "BLKMOV"
SRCBLK :=P#DB1.DBX 0.0 BYTE 10 RET_VAL:=MW0
DSTBLK :=P#DB1.DBX 0.0 BYTE 10
AT 指令在使用當中,還有如意事項:
AT指令用于對某個變量進行其它數據類型的聲明時,必須放在此變量的聲明語句后面
AT指令生成的變量不可以初始化
AT指令用于對某個變量其它數據類型的聲明時,占用內存大小要小于等于此變量的長度
AT指令用于對某個變量其它數據類型的聲明時,如下的組合是允許的
AT 指令使用限制
AT 指令用于 ANY 類型在 VAR_OUT 中是不允許的
Elementary (基本數據類型包括) :BOOL, BYTE, WORD, DWORD, INT, DINT, DATE, TIME, S5TIME, CHAR
Complex (復雜數據類型包括) :ARRAY, STRUCT, DATE_AND_TIME, STRING
問題:S7-SCL 程序中如何使用多重背景?
解答:S7-SCL 程序中可以使用多重背景,下面的程序列出了正確格式,聲明完成后,在程序中即可調用:
Supply1 : FB10; //將 Supply1 定義為 FB10 類型
Supply2,Supply3,Supply4 : FB100; //將 Supply2,Supply3,Supply4 定義為 FB100 類型
問題:如何在 S7-SCL 程序中實現數據塊間接尋址?
解答:S7-SCL 程序中對數據塊間接尋址提供了良好的支持,編程也很簡單。下面的程序列出了正確格式:
STATUS_1:= DB11.DW[COUNTER]; //字節間接尋址
STATUS_2:= DB12.DX[WNO, BITNO]; //位間接尋址,用戶改變 WNO,BITNO 數值即可STATUS_1:= Database1.DW[COUNTER]; // Database1 為 DB 類型的本地變量STATUS_2:= Database2.DX[WNO, BITNO];
STATUS_1:= WORD_TO_BLOCK_DB(INDEX).DW[COUNTER];
//INDEX 被定義為 BLOCK_DB 數據類型,COUNTER 為整數數據類型,這樣可以實現/數據塊編號, 字節地址同時間接尋址,此功能是一種功能很強間接尋址方式。
//以下是數據塊直接尋址方式格式,僅供參考。
STATUSBYTE :=DB101.DB10; //字節直接尋址格式
STATUS_3 :=DB30.D1.1; //位直接尋址格式
MEASVAL :=DB25.DW20; //字直接尋址格式STATUSBYTE :=Status_data.DB10;
STATUS_3 :="New data".D1.1;
MEASVAL :=Measdata.DW20;
STATUS_1 :=WORD_TO_BLOCK_DB (INDEX).DW10;
問題:在 S7-SCL 程序中調用 FC/FB 與在 STL/LAD 中調用 FB/FC 有何區別?
解答:在 STL/LAD 程序中調用 FB 可以不把參數填寫完整,但在 S7-SCL 程序中調用 FB 時,必須把FB 參數填寫完整;對于FC 的調用S7-SCL 與STL/LAD 區別不大。強烈建議編程人員使用S7-SCL 的模板向導調用 FB。下圖的程序說明了兩者的區別:
問題:為了將 S7-SCL 中的位數據類型(BYTE, WORD 或 DWORD)轉換到“REAL”數據類型時, 需要使用哪種數據類型轉換程序?
解答:為了將 S7-SCL 中的位數據類型(BYTE, WORD 或 DWORD)轉換到數字數據類型“REAL”時,需要使用以下指令:
從 BYTE 到REAL:“DINT_TO_REAL(DWORD_TO_DINT(BYTE_TO_DWORD(value))”
從 WORD到 REAL:
“DINT_TO_REAL(DWORD_TO_DINT(WORD_TO_DWORD(value))”
從 DWORD到 REAL:
“DINT_TO_REAL(DWORD_TO_DINT(value))”
注意事項:用戶在將 BYTE, WORD 或 DWORD 數據類型轉換到 “REAL” 數據類型時,S7-SCL 中常見的錯誤可以參考下例:
從 WORD 到 REAL:“DWORD_TO_REAL(WORD_TO_DWORD(value))”(錯誤程序)。
如果執行了這一轉換,會得到錯誤的結果。
原因:DINT_TO_REAL 函數將把源數據轉換并按照 IEEE REAL 的格式存儲到目的變量,而
DWORD_TO_REAL 僅僅是從源數據拷貝位串至目的變量。
因此,為了獲得正確的“ REAL ”數,必須總是通過中間步驟“ DWORD_TO_DINT ”和“DINT_TO_REAL”實現。
問題:在 S7-SCL 中如何區分某個變量名是本地變量,還是符號名?
解答:S7-SCL 中本地變量與符號名的引用有如下區別:
如果引用中只有變量名,則此變量為本地變量,如:Motor_Status:=Motor_1
如果引用中變量名稱上包括“”,則此變量為符號名,如:Motor_Status:=“Motor_1”
問題:如何訪問一個字符串中的單個字符?
解答:對于字符串中的單個字符,使用如下的訪問格式,是錯誤的:
MB10 := str[5] 這樣的表達式無法實現將字符串的第 5 個字符送至 MB10 中。方法:可以使用 IEC 函數 MID 來得到字符串的某個部分,例子如下:
VAR
str : STRING[20];
END_VAR
MB10:=CHAR_TO_BYTE(STRING_TO_CHAR(MID(IN:=str,L:=1,P:=5)));
問題:如何在訪問結構時優化運行時間?
解答:如果需要多次訪問一個結構,可在 S7-SCL 代碼中也創建一個同樣類型的臨時變量來優化運行時間。用戶可在臨時變量聲明中生成此變量,并在程序中多次使用它。假設用戶希望完成如下操作:
DB4.Field.Value:= DB4.Field.Value1*DB4.Field.Value2*DB4.Field.Value3;
可見以上操作數都存在于 DB 的結構當中,在不進行優化的情況下,這段程序在運行時,將多次打開數據塊,進行多次讀取操作,程序運行所需時間較多。
定義數據塊
解決方法:在 FC4 中聲明一個與 DB4 中“field”變量結構相同的臨時變量(例如“Temp”)。然后使用如下語句從 DB4 中將數據拷貝到臨時存儲區內:
Temp:=field;
對以上所描述的語句,可將 DB 變量“DB4.Field”替代為臨時變量“Temp”:
field.Value:=Temp.Value1*Temp.Value2*Temp.Value3;
此時數據塊中的數值被復制到 CPU 的 L 堆棧當中,在后續程序中,可以使用這些 L 堆棧中的臨時變量替代原來數據塊中的變量,由于 CPU 對 L 堆棧的訪問速度遠快于對數據塊的訪問速度,這樣就實現了數據訪問的優化。
e
優化數據塊訪問
注意事項:變量聲明“VAR_TEMP”存儲在 CPU 的堆棧中。這可能會在小型 CPU 模塊中導致堆棧溢出。因此使用臨時變量要慎重。
問題:如何用布爾型變量優化 IF 語句來縮短循環時間?
解答:在優化 IF 語句后,S7-SCL 代碼將變得更為緊湊,這樣代碼序列的處理就更快。程序計算的布爾類型數據相同,優化后事件僅分配給一個變量。相對于簡化格式,IF 語句完整格式編程時需要加載另一個跳轉和一個常量 (TRUE 或 FALSE) 。
示例 1:
當一個模擬量值(REAL 變量)超過限定(此處是 100)時設置一個比特位。
函數“IF_Test”包含了查詢限定值的 IF 語句。整個 IF 語句可用以下語句代替:
IF_Test:= (100 < value) 。
IF 語句不同格式(a)
示例 2:
查詢在一個 WORD 變量中指定比特位 X 是否置位。
這里函數 BitX 的 IF 語句由以下語句代替:BitX:= status = 16#0004。
IF 語句不同格式(b)
注意事項:緊湊的 IF 語句加快了程序處理速度,但是優化處理可能使得程序變得不夠清晰和難于理解。
問題:為什么我的 S7-SCL 程序在自己的計算機上編譯正常,在別人的計算機上卻打不開或無法編譯?
解答:應當確認其它計算機是否安裝了 S7-SCL 環境,而且要檢查 S7-SCL 環境版本,例如:S7-SCL V5.3 SP1 提供了新的函數(SEL,MAX,MIN,LIMIT,MUX,BYTE_TO_INT,INT_TO_BYTE 等等),舊
版本無法識別這些函數。如果用戶程序中使用了這些函數,在舊版本的 S7-SCL 環境下無法通過編譯。
問題:為什么我的程序與別人的程序完全一致,卻通不過編譯?
解答:除了前面問題所需注意的事項外,符號表是初學者經常忽略的因素,這里額外單獨強調一下。用戶在編寫 S7-SCL 程序源代碼時,對符號進行良好的定義,可以使編程清晰易懂。而初學者經常僅僅復制其他人的源代碼,卻忘記復制符號表,以至于在 S7-SCL 程序中經常出現不清楚的名稱定義,從而導致編譯錯誤。
問題:為什么包含比較類型為 WORD/DWORD 的變量的 IF 語句不能被編譯通過?
解答:當在 IF 指令內比較操作數時,如果變量聲明為 WORD 和 DWORD 類型,S7-SCL 僅允許比較操作“=”和“<>”,而不允許比較操作“>”和“<”。作為一種補救措施,建議將變量類型聲 明為 DINT。如果變量的類型不能聲明為 DINT,在此比較之前則必須首先進行類型轉換。
問題:當給一個雙字類型變量分配了一個實型數值時,出現非法數據類型錯誤
解答:當給一個雙字類型變量分配了一個實型數值時,出現"Invalid data type"消息,是由于數據類型不匹配造成的。注意僅當數據類型為 BOOL, BYTE, WORD 和 DWORD 時,允許對 DB 塊的絕對地址訪問。下圖舉例說明何時數據類型必須轉換.
問題:在輸出窗口中的錯誤消息與程序行數字不符
解答:當 S7-SCL 程序行數超過 65535, S7-SCL 編譯器把行計數器重新從 1 開始計數。例如,在 S7-SCL 源程序中,一個編程錯誤出現在第 65537 行, 以下行數字將被輸出:"F: L 00001 error xyz”, 而不是 "F: L 65537 error xyz"
解決方法:雙擊 S7-SCL 編譯器輸出窗口中的錯誤消息,光標將跳至不正確的行。如果編程錯誤不在所指示的行,你可以使用菜單命令"Edit > Go To > Line..."然后輸入" 65536 + 顯示錯誤數字"跳至有錯誤語句的行。
問題:"The FB is not available or the instance declaration is missing"
解答:此消息出現在當一個 FC/FB/SFB/SFC 塊在程序中被調用時,該塊卻不包含在塊文件夾下。
解決方法 1:手動復制相關的程序塊到 BLOCK 文件夾中然后重新編譯 S7-SCL。
解決方法 2:調用 FC/FB/SFB/SFC 時,使用 S7-SCL 菜單中的 Insert>Block Call 向導,S7-SCL 將會自動將此 FC/FB/SFB/SFC 復制到當前的 BLOCK 目錄中,從而避免以上情況出現。
問題:"Character strings have different lengths"
解答:示例中包含 FC1 和 FC2 帶有字符串變量"name_1" 與"name_2", 當 FC1 被編譯時,得到警告"Character strings have different lengths"。在運行期間,在賦值的右側("name_1")可能是一個比左側所允許的 STRING 變量("name_2")具有更長長度的 STRING 字符串。
解決方法:我們建議予左側的變量"name_2"聲明一個長度為 254 字符的 STRING 字符串。如果你編譯具有這種聲明的功能 FC2,上述警告將不會出現。
注意:如果你聲明長達 254 字符的 STRING 字符串,將會需要更大的本地裝載存儲空間
問題:CPU 消息"STOP due to unknown OP code"
解答:當你在 S7-SCL 中使用轉換功能"WORD_TO_BLOCK_DB(...)",并且編輯以下語句時該消息會被發出:
Display: = WORD_TO_INT (BYTE_TO_WORD (WORD_TO_BLOCK_DB (DBNo).DB [DBIndex]));
解決方法:我們建議以以下給出的兩行語句來替代上面的語句:
tmp := WORD_TO_BLOCK_DB (DBNo).DB[DBIndex];
Display := WORD_TO_INT (BYTE_TO_WORD (tmp));
問題:在編譯 UDT 時出現"Syntax error with UNLINKED"
解答:如果一個 UDT 在用"UNLINKED"聲明之前已標識,該 UDT 不會被編譯通過。"UNLINKED"屬性不可用于 UDT。編譯將會以錯誤消息"Syntax error with UNLINKED"結束。該規則也應用于 STL 源程序聲明。UDT 通常不裝載到 S7 CPU 中,而總是存儲于"離線"的 S7 用戶程序。
相關知識:對于"UNLINKED"數據塊屬性,意味著 DB 塊有以下特性:
僅僅存儲于裝載存儲器中
不占據任何 RAM空間。
"UNLINKED"屬性聲明在數據塊的頭部
與程序沒有關聯關系
數據塊的 UNLINKIF 屬性
問題:在編譯 DB 時出現"Syntax error with 2#1100_1100"
解答:如果你賦一個二進制數字作為初始值給一個數據塊中 BYTE 類型的變量,編譯 S7-SCL 源程序時將出現錯誤消息"Syntax error with 2#..."
例如:Var1: BYTE:= b#2#1100_1100;
在 S7-SCL, 數據塊由 AWL 編譯器生成。如果你在數據塊準備部分和賦值部分同時初始化變量,你必須使用 AWL 專用符號。因此在示例中的 BYTE 類型的變量,僅允許指定十六進制數字作為初始值。S7-SCL 符號 (例如 B#2#1100_1100) 只可用在代碼區,因為 S7-SCL 編譯器只在代碼區被使用。解決方法:將二進制數字改為十六進制數字作為初始值,
例如:Var1: BYTE: = b#16#cc;
問題:為什么我的程序編譯通過,但無法運行?
解答:當使用 S7-SCL 語言時,建議使用的 CPU 類型 最低為 CPU314。即便如此,用戶也應當注意系統資源的限制。例如:當定義臨時變量的時候,不要超過所用 CPU 技術參數中的本地數據大小的限制。否則可能導致程序無法運行。
問題:為什么我的程序無法被監控?
解答:為了程序可以被監控,在編譯 S7-SCL 程序時,在菜單 Options>Customize>Compiler 中, 應當選擇 Create debug info 項。注意:Create object code 項也應當被選擇,否則程序編譯時僅僅作語法檢查,而不生成可執行程序。Optimize object code 項也應當被選擇,此選項將優化程序代碼。
問題:在 S7-SCL 哪些變量在監控時無法被顯示?解答:在監控時,如下變量無法被顯示:
復雜數據類型不被顯示,但復雜數據類型中的基本數據類型可以被顯示(例如字節數組中的某個字節)
DATE_AND_TIME、STRING、BLOCK_FB、BLOCK_FC、BLOCK_DB、BLOCK_SDB、TIMER、
COUNTER 不被顯示
以符號格式訪問的數據塊不被顯示,例如:"myDB".DW0, "myDB" 為某個數據塊的符號名注意:有時候監控變量的數據超出了 CPU 能夠提供的資源數量,也將出現部分無法顯示的情況。