<u id="00wy6"></u>
<td id="00wy6"><kbd id="00wy6"></kbd></td>
  • <table id="00wy6"><source id="00wy6"></source></table>
  • <noscript id="00wy6"><kbd id="00wy6"></kbd></noscript>

    行業新聞

    西門子SCL語言編程學習心得

    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在一次循環中被多次調用,其靜態變量也只是被讀寫一次。

    關閉
    <u id="00wy6"></u>
    <td id="00wy6"><kbd id="00wy6"></kbd></td>
  • <table id="00wy6"><source id="00wy6"></source></table>
  • <noscript id="00wy6"><kbd id="00wy6"></kbd></noscript>
    免费高清视频