1、 SCL程序可以在CPU314及其以上的S7(包括400)中運行。
2、 SCL程序創建在”S7 Program”-”Sources”下面。
S7-Program
-Blocks(e.g. FB,OB)
-Sources(e.g.SCL source file)
-Symbols
3、 程序結構
FB: FUNCTION_BLOCK fb_name
END_FUNCTION_BLOCK
FC: FUNCTION fc_name:function type
END_FUNCTION
OB: ORGANIZATION_BLOCK ob_name
END_ORGANIZATION_BLOCK
DB: DATA_BLOCK db_name
END_DATA_BLOCK
UDT TYPE udt_name
END_TYPE
4、 屬性定義和程序注釋
例如:
FUNCTION_BLOCK FB10
//This is a block comment.
TITLE = ’Mean_Value’
VERSION : ’2.1’
KNOW_HOW_PROTECT
AUTHOR : AUT_1
5、 變量定義
Data Syntax FB FC OB DB UDT
Constants CONST
declaration list
END_CONST X X X
Labels LABEL
declaration list
END_LABEL X X X
Temporary Variables VAR_TEMP declaration list
END_VAR X X X
X X X
Static variables VAR
declaration list
END_VAR
X X X X X
Input parameters VAR_INPUT
declaration list
END_VAR
X X
Output parameters VAR_OUTPUT
declaration list
END_VAR
X X
In/out parameters VAR_IN_OUT
declaration list
END_VAR
X X
6、FC結構
FUNCTION FC11: REAL//如果不需要返回值,用VOID關鍵字
VAR_INPUT
x1: REAL ;
x2: REAL ;
x3: REAL ;
x4: REAL ;
END_VAR
VAR_OUTPUT
Q2: REAL ;
END_VAR
BEGIN
// Return value from function
FC11:= SQRT( (x2 - x1)**2 + (x4 - x3) **2 ) ;
Q2:= x1 ;
END_FUNCTION
7、自己寫了一個簡單的程序
OB1:
FC1用SCL編寫:
FUNCTION fc1:INT
VAR_INPUT
a:INT;
END_VAR
begin
fc1:=a+10;
end_FUNCTION
運行后:每次m0.0從0變1,就調用FC1一次,mw18里面的數據加10。
問題:SCL如何調用其他SCL以及用LAD等編寫的程序?
寫一個有循環、判斷等基本語句組成的程序。
參數使用問題?(直接使用實際地址?參數傳遞問題)
如何在線調試SCL程序(debug)
1、 在SCL里面調用LAD或者STL寫的塊
先用STL或者LAD創建一個FC2:
定義一個輸入參數:in1(int型);一個輸出參數:out1(int型)
語句表如下:
L #in1
L #in1
+I
T #out1
NOP 0
在下面寫的SCL里面調用FC2:
FUNCTION fc1:INT
VAR_INPUT
a:INT;
END_VAR
VAR_TEMP
b:INT;
end_var
begin
//fc1:=a+10;
fc2(in1:=a,out1:=b);
fc1:=b;
end_FUNCTION
2、在SCL里面調用其他SCL寫的塊
FUNCTION fc1:INT
VAR_INPUT
a:INT;
END_VAR
VAR_TEMP
b:INT;
end_var
BEGIN
fc3(in1:=a,out1:=b);//調用fc3
fc1:=b;
end_FUNCTION
FUNCTION fc3:void//無返回值
VAR_INPUT
in1:INT;
END_VAR
VAR_OUTPUT
out1:INT;
end_var
begin
out1:=in1+10;
end_FUNCTION
3、一個帶有循環、判斷等基本語句的程序
FUNCTION fc4:VOID
VAR_INPUT
in1:BOOL;
in2:INT;
END_VAR
VAR_OUTPUT
out1:BOOL;
out3:BOOL;
out2:INT;
END_VAR
VAR//定義一個靜態變量,用來存儲塊調用之間的數據
temp1:BOOL;
END_VAR
VAR_TEMP
temp2:INT;
END_VAR
BEGIN
IF in1=false AND temp1=true THEN//檢驗下跳沿
out1:=true;
ELSE
out1:=false;
END_IF;
IF in1=true AND temp1=false THEN//檢驗上跳沿
out3:=true;
ELSE
out3:=false;
END_IF;
temp1:=in1;
FOR temp2:=1 TO 10 BY 2 DO//省略了關鍵字by,就默認加1
out2:=in2+out2;
END_FOR;
END_FUNCTION
4、SCL中直接使用絕對地址
FUNCTION fc1:VOID
BEGIN
in1:=in1+10;//in1在符號表里面已經定義為int型,存儲區為mw0
IF m0.0=false then//這里直接引用實際地址
m0.0:=true;
ELSE
m0.0:=false;
END_IF;
end_FUNCTION
5、如何在線調試SCL程序
注:僅400可以設置斷點(breakpoint)以及單步執行
學習基本完畢!已經了解了編寫SCL程序的基本方法!
在數據轉換方面,SCL和LAD有一些區別,SCL的數據轉換有兩種類型:
? Implicit數據轉換,即如果數據類型不匹配,Scl會自動進行默認的數據轉換
Classes Conversion Order
Any_bit Bool>byte>Word>Dword
Any_num INT>DINT>Real
例如兩個數相加,一個是int型,一個是real型,則在編譯的時候int型數據會被系統轉換為real型再進行運算,結果只能存放在real型中。
? Explicit 數據轉換
由用戶程序用相應的功能塊進行數據轉換。
而LAD沒有Implicit數據轉換,參與運算的兩個數必須類型一致。
如果給變量賦值,比如:mw0:=a1;(這里a1是定義好的int型的臨時變量),則編譯會提示出錯“錯誤的數據類型“,這是因為編譯器不認為mw0是一個有效的int型變量,除非在符號表里面定義了一個符號比如f11為mw0,int型,則f11:=a1;可以編譯通過;
另外DB塊的使用與LAD/STL也有所不同,在LAD或者STL里面如果要按照db里面定義的符號名來調用db里面的變量,則必須事先給db定義一個名字,然后寫成"DB1_IN".P1(db1_in是事先定義好的db的符號名,p1則是db1中的dbw0存儲區)。而在scl中,則可以寫成:db1.p1(事先無效定義db的符號名)或者db1_in.p1都可以
DATE_AND_TIME類型的數據不能直接賦值(編譯不會報錯),可以按照數據結構分解賦值:
DATE_AND_TIME是按照下面的結構:
1BYTE YEAR
1BYTE MONTH
1BYTE DAY
1BYTE HOUR
1BYTE MINUTE
1BYTE SECOND
1BYTE MSD(MOST SIGNIFICANT DECADE) OF MS
1BYTE MSD(LEAST SIGNIFICANT DECADE) OF MS
1BYTE WEEKDAY
OB塊的temp變量,Help里面說:“To execute, each OB alwaysrequires 20 bytes of local data for the operating system. You mustdeclare an array for this with an identifier.”
實際上為了編程方便,可以手動定義變量而不用系統模板定義的20byte的array(數組)。因為有些變量不是byte類型的。手動定義變量必須主意必須把所有變量定義完成,否則會因為變量定義的不夠造成temp數據區不夠大,就不能返回任何結果!!!
關于FC和FB的區別
對于需要在運行過程中需要“記住”的中間變量,可采用靜態變量。但是由于FC的每個靜態變量是固定的地址存儲,那么FC每次被調用都是讀寫同一個靜態變量,如果FC在一次循環中被多次調用,則靜態變量在每次循環中被多次讀寫;而FB的靜態變量則是由指定的DB存儲因此每個被調用的FB都有其獨立的存儲空間,則如果FB在一次循環中被多次調用,其靜態變量也只是被讀寫一次。
聯系人:胡經理
手機:13956647042 13956649842
電話:0551-62754989
郵箱:2913049100@qq.163.com
地址:www.chenshihu.com
掃面二維碼關注大遠科技官方微信