<object id="ayu7o"></object>

      <object id="ayu7o"></object>

    1. <menuitem id="ayu7o"></menuitem>
      <object id="ayu7o"></object>
      加入收藏 在線留言 聯系我們
      關注微信
      手機掃一掃 立刻聯系商家
      全國服務熱線18475208684
      公司新聞
      如何用LAD和SCL實現S7-1200的間接尋址功能
      發布時間: 2024-04-28 23:21 更新時間: 2024-12-02 08:00

      在S7-1200PLC中,若需要根據數組下標值來對數組中元素的訪問有兩種方式可以實現,一是通過大家熟悉的梯形圖來編寫程序實現,二是可以通過SCL的編程方式來編寫這樣的程序實現。

      一、舉例說明梯形圖和SCL如何實現程序編寫

      這里通過一個簡單的例子為例,分別通過這兩種方式如何實現通過索引數組的下標值來實現對數組中元素的訪問。

      例子說明:

      假設需要從一組數據中找出一個Zui大值,并記錄這個Zui大值是這組數據中的第幾個數據。

      先以大家相對來講比較熟悉的梯形圖的方式來實現此功能。這里我們需要用到通過讀取域或寫入域的指令,該指令根據索引的下標值來讀取數值中相對應元素的值或寫入數到數組中相對應的元素里。此例子中只需要用到讀指令,指令位于移動操作指令中的“原有”文件加中。

      讀取數組中元素值的指令格式如下:

      圖片

      圖片

      舉例:

      圖片

      表示把數據中的data這個數組中的data[5]這個元素的值讀取出來放入到MW100這個變量中。

      寫入數組中元素值的指令格式如下:

      圖片

      圖片

      舉例:

      圖片

      表示把數據20寫入到數據塊1中的變量名為data的數組中的data[3]元素的存儲器中。

      在本例中,我們只需要用到第一個指令,接下來設計一個如例題中所要求的梯形圖程序。


      程序編寫思路:

      本例題要去找出Zui大值,并把Zui大值所處的位置記錄下來,編程思路:假設變量MAX_DATA作為Zui大值的存儲器,然后根據下標值(INDEX)的多少去讀取相應數值中對用的元素的值放于TEMP_DATA變量中,然后與MAX_DATA做比較,若MAX_DATA的值要小,則進行交換,同時記錄INDEX值。然后INDEX加1,可以指向數組中的下一個元素

      圖片

      注:流程圖不太標準,但希望對大家理解這個編程思路有所幫助,接下來主要對程序的編寫進行介紹。

      二、用梯形圖編寫一個取Zui大值的程序

      前面介紹了讀取和寫入數組中元素值的指令Field Read和Field Write兩條指令,同時給大家簡單的分析了程序的設計思路。接下來就使用Field Read來實現本功能,在程序的設計過程中可能還需要用到循環跳轉指令。

      例子說明:

      假設需要從一組數據中找出一個Zui大值,并記錄這個Zui大值是這組數據中的第幾個數據。

      第一步:

      添加一個全局DB塊,并在DB塊中建立一個變量名為data_1#,數據類型為數組的變量,用于存儲需要找出Zui大的數據,同時建立一些相應的變量,如下圖所示。

      圖片

      第二步:

      初始化相應的存儲器并把存儲Zui大值的存儲器的值設置為Zui小值。程序如下所示:

      圖片

      第三步:

      編寫判斷數據的挨個比較是否完成,當執行的次數與設定的次數相等時,則表示完成,可以跳出Zui大值查找的程序,讓程序跳轉到Zui后執行。程序如下所示:

      圖片


      第四步:

      編寫讀取數組中元素的值,然后與存儲Zui大值的存儲器中的值做比較,用于判斷數據存儲器存儲的值是否是Zui大值,若不是Zui大值進行數據交換,同時記錄位置,然后INDEX的值加1,同時記錄執行次數并與設定次數做比較,如未達到設定次數,則跳轉換前面繼續通過Field Read指令讀取數據出來繼續做比較。

      圖片


      圖片


      三、使用SCL如何實現程序編寫

      在前面介紹了使用梯形圖的方式來編寫一個取Zui大值的程序,但在S7-1200PLC中,還支持SCL的編程,使用SCL的編程對一些復雜的數據處理會帶來很大的方便,下面還是以前面的例子為例說明使用SCL如何編寫程序實現。

      例子說明:

      假設需要從一組數據中找出一個Zui大值,并記錄這個Zui大值是這組數據中的第幾個數據。

      使用SCL編程來完成這個例子,這里我們需要用到兩個語句

      (1) 用于條件判斷的語句

      IF (條件) THEN (執行語句)

      END_IF;

      解析:如果條件滿足,則執行THEN后面的語句。


      舉例:IF “DATA_A”<100 HEN

      “DATA_A”:= “DATA_A”+1;

      END_IF;

      如果DATA_A的值小于100,則DATA_A的值等于自身加1.

      (2) 用于循環執行的語句

      FOR (執行變量):= (起始值) TO (結束值)BY(自增量)DO (后面需要執行的語句);

      END_FOR;

      解析:從“起始值”開始循環到執行,每循環一次,“執行變量”的值會根據“自增量”的多少進行變化,直到執行到“結束值”時,停止循環執行。


      舉例:FOR “count”: = 0 TO 4 BY 1 DO

      “Data[count]”=10;

      END_FOR;

      把數值10填入到數值Data中的Data[0]到Data[4]的五個元素中,第一次循環時把10填入到Data[0],第二次循環時把10填入到Data[1],依次下去。

      了解這兩條語句后,接下來我們可以設計一個程序,這里我們可以把他建立為一個功能塊(FB),方便以后使用。

      第一步:

      添加一個全局DB塊,在全局DB塊中建立一個變量名為Data的數組,元素個數可以視情況進行設置。如下圖所示,元素個數設置為5個。

      圖片

      第二步:

      添加一個FB塊,同時把編程語言選擇為SCL的編程語言。然后在FB的接口去中分別去定義相應的變量,如下圖所示:

      圖片

      第三步:

      用SCL語言編寫功能塊程序,如下所示

      圖片

      第四步:

      在OB1中調用該功能塊,由于使用的是FB,因此在調用時需要分配相應的背景DB,如下圖所示:

      圖片


      聯系方式

      • 電  話:13922889745
      • 經理:向小姐
      • 手  機:18475208684
      • 微  信:18475208684