<object id="ir2le"></object>
  • 加入收藏 在線留言 聯系我們
    關注微信
    手機掃一掃 立刻聯系商家
    全國服務熱線15267534595
    公司新聞
    使用S7-200 SMART 編寫一個自己的指令-1
    發布時間: 2023-08-26 10:24 更新時間: 2024-12-26 09:10

    經常有人問,這個PLC有沒有某某指令,或者,有沒有指令可以實現這樣那樣的功能?

    產生這樣的疑問,部分原因是不熟悉這款PLC的指令。部分原因是為了選型,想找到一種PLC能夠內置一些功能,使得自己的編程得到簡化。甚至有一些人認為,PLC沒有這個指令就是沒有這個功能,不能完成某個任務。如果指令能自己做,那就沒有這個問題了。那我們就試著自己做自己需要的指令。

    本系列文章圍繞S7-200 SMART PLC為中心,講解如何編寫自己需要的指令,編程語言主要以梯形圖的方式為主。

    第一篇 預備知識

    一, 掃描

    梯形圖的所有指令一般遵循掃描原則進行執行。執行一個完整的程序,過程中由于掃描有先后次序,所以必然在一個瞬間只能執行一個指令。那么當掃描到程序中間的時候,程序前部分的程序先獲得掃描并執行過,執行的結果將已經產生影響。后面部分的程序未曾執行,將來的執行當中所有條件將以Zui新的形態執行。

    首先來看一個例子。如圖1所示。

     圖片

    圖1程序

    從I0.0 = False(0)之后的某個掃描周期開始看看掃描的過程。此時,所有變量都沒有接通。

    當有一個掃描周期I0.0 = True(1)的時候,并且方框處的程序剛剛處理完的時刻,第一段的Q0.0顯然跟以前的掃描一樣,不接通。而此時此刻的M0.0已經接通,它將開始影響以后程序的執行。然后在這個掃描周期結束的時候Q0.1將接通了,但是Q0.0卻沒有接通。

    下一個周期開始,掃描第一個M0.0觸點的時候,此時的M0.0才開始影響第一行程序。

    所以,掃描到并執行出的結果是影響往后的所有掃描的。并沒有掃描周期之分。所有執行都基于掃描。

    二, 能流

    一行程序Zui左邊粗實線是能流的源,這里永遠是True(1)。通過各種觸點的True(1)與False(0)組合,能流能到達右側的線圈指令的話,就可以使線圈置位(1)。能流不能到達右側線圈的話線圈就復位(0)。能掃描到的指令,基本能按照這種意愿執行。

    要正確理解能流True(1)與False(0)兩種狀態對程序的影響,如圖2所示。

     圖片

    圖2程序

    當I0.0 = True(1)的時候,兩個指令都得到了能流。計時器指令按照自己的屬性進行計時。傳送指令把源地址數據傳送到目的地址,無論目的地址原來有什么值都執行傳送更新目的地址。

    當I0.0 = False(0)的時候,兩個指令都沒有了能流。計時器在沒有能流的時候把當前值寫成0,把計時器位寫成False(0)。值得注意的是,這個指令在False(0)的時候不是什么都不做的,而是在做False(0)時應該做的事情。有這樣特點的指令還有輸出線圈指令等。傳送指令在沒有能流的時候不再傳送,不再理會目的地址。大量位于能流Zui右側的指令都有這個特點。

    三, 雙線圈

    不追究這個詞的歷史背景了。反正大家都知道在一個程序里面對同一個線圈出現過兩次輸出線圈就是雙線圈。

    雙線圈不會當作是一種錯誤程序。它完全可以按照程序的行為作出解釋。也就是說它沒有語法錯誤,但是可能會導致邏輯執行錯誤。

    如圖3所示的例子,可能作者希望自動動作時的三個步驟Q0.0得電。而且切換到點動的時候又可以控制Q0.0。結果,由于出現了雙線圈,影響了期望的動作。這是雙線圈Zui顯著的錯誤使用。

     圖片

    圖3程序

    對于輸出點Q,總是按照一個周期中Zui后一個輸出指令刷新輸出到物理點的。

    下面舉一個案例,看看怎么處理比較好?

    有一個輸出點,根據工藝已經做好了程序并且調試成功。程序片段如圖4所示。

     

     圖片 

    圖4程序

    突然甲方來了一個要求,要求Q0.0在原來的基礎上并聯一個現場按鈕,無論Q0.0是否動作,現場按鈕按下時,Q0.0都要為True(1)。現場按鈕松開時,不影響原來的程序作用。同時要求,Q0.1不受現場按鈕影響。于是如圖5所示做了如下修改。

     圖片

    圖5程序

    Ok。程序沒有問題。要是改成如圖6所示的程序,結果會怎樣?同樣,這個程序也可以完成上述任務。

     圖片

    圖6程序

    這是一個雙線圈的程序。第二個輸出線圈由于帶有第一個線圈的執行結果,觸點先繼承了前面所有的邏輯,在此邏輯下增加了一個現場按鈕。解決了Q0.0的需求,但是又沒有對Q0.1有任何的影響。程序卻非常簡單。

    再看一個雙線圈使用的例子。如圖7所示。

     圖片

    圖7程序

    先看網絡1 2 3。“報警”和“運行中”兩個信號由于有公共相似的邏輯,所以用一個線圈把公共部分記錄下來,再在下面的程序多次使用這樣的公共部分。為了使程序簡單一點,不用在報警和運行的線圈前都把相同的公共部分重復寫一次。然而,網絡4才是Q輸出點Zui終要達成的控制邏輯目的。Q只是在前面的工作中臨時客串,義務送了一個人情。

    臨時變量的影子也悄悄地在這個例子中流露出來。

    四, 多重賦值

    多重賦值是說明一個地址,在程序多個地方都有出現對其寫入的操作。雙線圈是一種典型的多重賦值。執行寫入的主動操作者可以是用戶程序,可以是系統行為,可以是來自通訊端口改寫。還可以是其他。

    在早先一些PLC還不允許出現雙線圈的時代,要繞過雙線圈的規則,有這樣的一種方法。程序開頭對線圈復位。后面的自動程序需要什么步驟輸出線圈,就用置位指令代替線圈指令。Zui終掃描結束輸出物理信號的時候取決于是否對線圈置位,如圖8所示,程序在“步1”、“步2”、“步7”,這三個步驟時輸出。

     圖片

    圖8程序

    如圖8這樣的程序結構,在多個地方都出現對Q0.0寫入值。當然這樣各種的值都是不同的,相同的話就不必多重了。我們應該小心處理邏輯關系,避免出現不希望的值。

    再看一個例子,如圖9所示。

     圖片

    圖9程序

    程序中把輸入量傳給輸出量。但是當發現輸出量是負數的時候,把0傳給輸出量。也就是說限制輸出量Zui小值是0,不可以再小了。

    雙線圈和多重賦值都是自定義庫程序范圍中一個非常重要的思想。不能很好理解這兩個概念,將會對制作庫程序產生很大的障礙。

    五, 間接尋址

    在操作數引腳(實參)上直接使用常數、juedui地址、符號這三種方式是編程中使用Zui多寫法。另外,還有符號定義的常量和間接尋址兩種方式相對比較少去使用。如圖10所示。

     圖片

    圖10 程序

    間接尋址包括制作指針和使用指針。

    指針是指向目的區域目的地址的標記。目前,CPU除了AC、HC、L區不能作為目的區域其他區域都可以間接尋址。

    在后面的文章中,都只將V區作為間接尋址的目的地址做說明或者做例子。這并不表示不能尋址到其余區域。

    例子中的 ”T40” 的設定值填寫的是一個間接尋址。意思就是說這個位置雖然不是一個具體的設定時間,但是,具體的值位于這個指針所指的地方。而這個地方當時是什么值,那么計時器的設定值就是什么值。

    簡單講就是“你要的東西用紙(址)包著”和“你要的東西用紙(址)寫著”。

    現在就圍繞這句話,聊一聊間接尋址。

    首先說說這張包東西的紙(址),不是什么地方都可以做的。什么材料可以做這張紙?材料可以是全部V區、全部L區、AC區的AC1 AC2 AC3可以裝載指針。并且只能用連續的4個字節組成的雙字裝載指針。起始地址不介意是奇數還是偶數。

    要用紙包著東西,必須把東西放進去紙里面。MOVW 100 VW0 這里 ”100” 就是東西, ”VW0” 就是一張紙。小的東西就用一張紙包(一個字節),很大的東西就用四張紙拼成一張大紙包(一個雙字)。用這件東西的人只要找到這張紙直接就得到里面的東西。

    你要的東西用紙寫著,那就是說事前必然有人在紙上已經寫了字,后面才能有人看見。MOVD &VB400 VD4 。這里 ”VB400” 就是寫在上面的字,”&” 符號是說明寫著這幾個字是一個地址,不是普普通通的字。”VD4” 就是一張大紙。這就是制作指針。

    手里拿著這張紙后,自然要根據這張紙的指引做一些事。如圖10程序Zui后一行指令。執行一個計時器指令時使用了” *VD2” 這張紙 ……,如果只寫 ”VD2”,那么就好像是使用 ”VD2” 的值作為計時器設定值,但是事實并非如此。這里 ”VD2” 前面帶*號。星號表示 ”VD2” 里面的值是指引真正包含設定值的地址。由于 ”VD2” 里面先前一個指令寫入了 ”&VB0” ,所以這張紙其實是指引計時器到 ”VW0” 找尋設定值。這就是使用指針。當然這是因為是在定時器的時間設置用到指針,而這個設置變量的類型是字。而如果在MOVB輸入用到相同指針 ”VD2”,那么輸入的就是 ”VB0” 而不是 ”VW0” 了,因為MOVB指令需要的輸入變量的是字節,也就是指針保存的是起始地址,具體使用的變量取決于指令需要。

    使用間接尋址的好處在于通過計算改變指針的值,可以尋址到附近的任何地址。當指針指向VB10的時候,把指針增加10,那么指針就會指向VB20。尋址就改變到VB20。指針再減少3,那么尋址就會找到VB17。對于一片連續的V空間只要知道第一個地址,就可以尋址到連續的第n個地址。

    在以后的子程序使用中將會非常多地用到間接尋址的。

    后面的內容更精彩——帶參數子程序的制作。


    聯系方式

    • 電  話:18126392341
    • 聯系人:梁濤
    • 手  機:15267534595
    • 微  信:15267534595