6.16.2026

Vibe Code - DptMatrix

Vibe Code - DptMatrix

用 google ai studio 來 vibe 的可將文字或圖形轉換為指定點矩陣顯示的程式 - Github Repo,並可儲存成動態 svg。

Written with StackEdit.

Vibe Code - PLC ST Simulator

Vibe Code - PLC ST Simulator

ai 功能更強後,試著寫一個 plc st 模擬器,寫一寫發現 token 不夠燒 Orz,看之後有機會再完成後續的功能。

To be continued…

Written with StackEdit.

Vibe Code - EPaperDashboard

Vibe Code - EPaperDash(board)

前陣子想瞭解 Esp32 的控制,就買了一個 3 色的電子紙,然後 vibe 一個所見即所得的編輯工具,使用 vue ,可透過 web serial 直接線上燒錄。

Github Repo

Written with StackEdit.

Vibe Code - Adopt Map

Vibe Code - 領養地圖

前陣子想領養貓咪,發現政府的資訊不是很方便檢視,趁著 token 還有剩,就叫 ai 寫了這個

Github Repo

Written with StackEdit.

Vibe Code - Simple Timing Diagram

Vibe Code - Simple Timing Diagram

很久以前工作需要寫了這個程式 - Simple Timing,現在試著用網頁版 vibe 看看,順便瞭解 next.js 的基礎知識。

GitHub Repo

Written with StackEdit.

10.13.2021

SimpleDashboard.md

Simplest Blazor IOT Dashboard

Recently I was learning Blazor, here is the first taste.

Demo :

Step

  1. Create a “Blazor Server Application” project.
  2. Named it “BlazorIOTDemo” or whatever you like.
  3. Add “MyDataDto.cs” in Data folder.
    public class MyDataDto
    {
        public int Id { get; set; }
        public int Value { get; set; }
    }
    
  4. Add “DataService.cs” in Data folder.
    public class DataService
     {
         public DataService()
         {
             this._timer = new Timer(UpdateValues, null, this._updateInterval, this._updateInterval);
         }
    
    
         public event EventHandler<List<MyDataDto>> DataChanged;
    
    
         private Timer _timer;
         private readonly TimeSpan _updateInterval = TimeSpan.FromMilliseconds(1000);
    
    
         private void UpdateValues(object state)
         {
             var myDataDtos = new List<MyDataDto>
             {
                new MyDataDto() { Id = 1, Value = new Random().Next(1, 80) },
                new MyDataDto() { Id = 2, Value = new Random().Next(10, 80) },
                new MyDataDto() { Id = 3, Value = new Random().Next(20, 80) },
                new MyDataDto() { Id = 4, Value = new Random().Next(30, 80) },
                new MyDataDto() { Id = 5, Value = new Random().Next(40, 80) },
                new MyDataDto() { Id = 6, Value = new Random().Next(50, 80) },
                new MyDataDto() { Id = 7, Value = new Random().Next(60, 80) }
             };
    
    
             DataChanged?.Invoke(this, myDataDtos);
         }
     }
    
  5. Configure service in "Startup.cs"

    It’ll be better to use interface.

    services.AddSingleton<DataService>();
    
  6. Alter the content in “Index.razor” to this

Project structure:

9.28.2021

speedupSt.md

Use autohotkey to speedup st programming.

As the poor support for structure text programming in plc world(code snippet), here are some short key for it I used with autohotkey.

It’s good for your healthy, enjoy it.

  • ,s ==> SET(TRUE, );
  • ,r ==> RST(TRUE, );
  • ,t ==> := TRUE;
  • ,f ==> := FALSE;

9.27.2021

UseStWritePLC.md

How to use structure text to write a simple indexing rotary table plc program

What is a indexing rotary table machine

Brief definition:

  1. At least one material input station and one finished product output station
  2. At least one indexing rotary table
  3. The indexing rotary table has a different number of divisions (or workstations) according to the manufacturing process
  4. Each division can place one or more workpieces
  5. Materials can input by man or feeder.

Found on the Internet:

Program Layout

Generally, I’ll layout the plc program as :

  • “Init” : Initialization code
  • “Always” : The normal execution code, including the Instance of Function Block
  • “Auto” : Automatic mode control
  • “Manual” : Manual mode control
  • “Error” : Error status control code
  • “St1”
  • “Stx” : Cycle control code of each station

State Machine

I’d like to centralization the mode control in one state machine, as shown in the figure:

If it is a simpler system, it will be simplified to only manual/automatic switching, or execute according to individual needs.

Of course, the actions of each station are also processed by their own state machine. In automatic mode, the role of the main state machine is only to evoke the status of whether each station needs to perform an action and check completion.

Timing diagram

  • a: The first automatic action is to turn the indexing rotary table, then let each station act
  • b: After the indexing rotary table is arrived, St2Cycle can work
  • c: The indexing rotary table will be rotated again after the St1 and St2 (all stations) operations are completed

The indexing table basically has only two states:

  • Rotating
  • Stopped in place

And each station basically has two types,

  • Can only act after the indexing rotary table is in place
  • You can do act first, and then continue to act after the indexing rotary table is in place

As shown in the figure above, St1 can pre-act while rotating, while St2 can only be acted after it is in place.

Sample file

Sample file

Summarize

In fact, sometimes its more intuitive to use the ladder style, but the advantage of ST is that it is convenient to write automatic code generator, It can shorten a lot of time during development.

Pay attention to when writing ST:

  1. ":=" equivalent “out” command
  1. The “if” instruction will take up more steps

    If there is only one line of instructions, it is recommended to switch to a single command. Although it is less readable, it saves more steps…

ST writing recommendation reference:PLC結構化文本設計模式和算法_rediculous的專欄-CSDN博客_plc結構化文本編程

使用ST寫圓盤類程式.md

如何使用ST寫簡易圓盤類PLC程式

什麼是圓盤類機台

簡要定義:

  1. 至少有一個料件輸入站,一個成品輸出站
  2. 至少有一個圓盤
  3. 圓盤依製程有不同的分割數(或稱工位)
  4. 每個分割可放置一或多個工件
  5. 可用人工或送料機輸入料件

網路上找到的:

程式 Layout

一般我會把plc程式的架構切分如下:

  • “Init” 初始化程式碼
  • “Always” 放置常態執行程式碼,含 Function Block 的 Instance
  • “Auto” 自動模式的控制
  • “Manual” 手動模式控制
  • “Error” 錯誤狀態控制碼
  • “St1”
  • “Stx” 各站的週期控制碼

狀態機

手/自動模式的管理,我習慣由統一的狀態機來執行,如圖:

若是較簡單的系統,就會簡化成只有手動/自動的切換,或依各別需求執行。

當然,各站別的動作也是自己的狀態機處理。自動模式時,主狀態機的作用只在喚起各站是否需要執行動作及判斷完成等狀態。

時序圖

  • a:自動的第一個動作都是轉圓盤,後再讓各站作動
  • b:圓盤到位後,St2Cycle才能作業
  • c:St1、St2作業完成後才會再次轉動圓盤

圓盤基本上只有兩個狀態:

  • 轉動中
  • 到位停止中

而各站別基本上有兩種類型,

  • 圓盤到位後才能作動的
  • 可以先動作,圓盤到位後再接續作動

如上圖,St1屬於轉動中可偷跑的,而St2屬於到位後才能作動的。

Sample file

範例檔案

總結

其實有的寫法用ladder的型式去表現會較直覺,但是ST的好處在於方便寫程式碼自動產生器,在開發時能夠縮短不少時間。

寫ST時要注意:

  1. ":=" 等效 “out” 命令
  1. if 指令會佔用較多的steps空間

    如果只有一行指令時,建議轉為單一的命令,雖然可讀性較差,但更省空間…

ST寫作推薦參考:PLC結構化文本設計模式和算法_rediculous的專欄-CSDN博客_plc結構化文本編程

9.13.2021

Simple Project With Label

Enable label in simple project for better program layout

In general, we use “Ctrl + L” or “Ctrl + G” to track our ladder program, which is great, but it would be better if we use the label feature in simple project.

ps: Label feature will slightly slow down compilation speed.

Works2 no label

Works2 with label

Works2 with label, seperated program, even better

2.27.2021

Mode

(Google譯)Mode

一種非常常見的梯形圖邏輯編程模式是Mode模式。大多數機器都有模式選擇機制,最常見的模式是自動(自動)和手動:

模式:自動/手動
模式:自動/手動

上面的“自動/手動模式”模式具有兩個有用的屬性:

  • 在程序啟動時,由於“自動模式”線圈將默認設置為“關”,因此“手動模式”將打開
  • 系統永遠不能同時處於自動模式和手動模式

第一個屬性很重要,因為我們永遠不希望系統在“自動模式”下啟動。在手動模式下啟動並讓操作員請求自動模式總是更安全。第二個屬性是我們所有模式系統都想要的屬性:一次只能激活一個模式。

有些機器具有兩種以上的模式。這裡最明顯的例子是機械壓力機,它具有英寸,單張和連續等模式,有時還具有其他幾種特殊模式。有時我們會在其中添加一個關閉模式,這意味著未選擇任何活動模式。即使在多模式機器的情況下,我們也希望邏輯具有相同的兩個屬性:安全的默認狀態和模式的排他性。

這是帶有附加關閉模式的三模式機器:
模式:三種模式並關閉
Mode:三種模式及關閉模式

您可能已經註意到,“Mode”模式只是“啟動/停止電路”模式的擴展,只是帶有更多的“啟動”按鈕。沒錯,我們只是強制一次只能“啟動”一個模式。

請注意,關閉模式是打開任何其他模式的先決條件。這樣可以確保在切換模式時至少有一個PLC掃描,其中沒有一個模式處於活動狀態(“關”除外)。一些工程師認為這是可取的(儘管我不認為這是一個非常重要的方面)。也許您可能希望在模式之間執行一些邏輯,並且檢查“關”線圈是實現此目的的一種好方法。請注意,這本身並不能增強排他性。也就是說,如果我們從“關閉”模式開始,並且模式按鈕是物理按鈕,而我同時按下了其中兩個按鈕,則機器可能會一次出現兩種模式。從所有其他按鈕插入常閉觸點在每個模式行中,結合“關閉”模式處於活動狀態的先決條件,是強制執行排他性的原因。如果按住兩個按鈕,則所有梯級都無法觸發,並且機器將保持在“關閉”模式。

儘管大多數現代機器通過HMI使用模式選擇,而有些機器具有物理模式按鈕,但是許多較舊的機器都使用選擇器開關。在那種情況下,一個位置通常不接線(通常為“關”),而其他選擇器開關位置均接線到一個輸入中。在那種情況下,您不需要在每種模式下都用分支電路進行自保持(因為開關本身“記住”了它的選擇),但是您應該執行類似的操作來增強排他性(如果發生線路短路):

模式:三模式加關閉選擇開關
Mode:三模式加關閉選擇開關

請注意,在這種情況下,四個線圈之一將始終處於打開狀態,並且如果發生接線短路(兩個模式輸入處於打開狀態),則機器將默認為關閉模式(不必處於關閉狀態)。關閉模式,但應為“安全”模式,如“手動”)。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Mission

(譯)Mission

Mission Ladder Logic編程模式用於在機器中進行更高級別的決策。儘管許多機器非常簡單,以至於它們在“自動模式”下只有一個步驟序列,但有些機器卻更為複雜。

這種複雜機器的一個很好的例子是自動存儲和檢索系統或AS / RS。這種類型的機器可以執行多種任務,例如將進來的物料箱存儲在存儲架中,或者從存儲庫中拾取物料箱並將其帶到輸出站。通常將這類問題分解為較小的任務,例如:

  • 從入料站取工件
  • 將工件放在儲位X
  • 從儲位X取得工件
  • 將工件放至出料站

在Mission模式中,這些較高級別的Mission中的每一個都稱為“任務”。該邏輯負責選擇適當的任務以執行下一個任務,並監視該任務的完成情況,或者在適當情況下中止該任務。以下是一些典型的任務模式邏輯:

任務
Mission

這是一個只有兩個任務的系統,但是如您所見,它可以擴展到更多任務。一項重要功能是邏輯必須確保互斥,任務永遠不會同時進行。在大多數情況下,這意味著一次僅執行一個任務,但是在某些系統中,如果兩個不同的任務都不需要訪問相同的資源,則它們可以重疊。

Mission模式通常與Step模式一起使用。具體而言,任務1線圈成為任務1序列的序列開始條件。同樣,序列。在上述邏輯中,從“步進”模式完成的線圈變為“任務1完成”條件。

在組織Ladder邏輯時,請考慮將任務邏輯放在單個程式或Ladder文件中。然後將每個單獨任務的順序邏輯放在自己的程式中。最後,將處理每個物理設備控制的低階邏輯放在為該設備命名的程式中。例如,一個用於氣缸推出和縮回的程式,另一個用於啟動和停止電動機的程式,以及一個用於加熱器的溫度控制邏輯的第三個程式。這是使邏輯更加“模塊化”的好方法,它將幫助閱讀程序的人找到與他們感興趣的設備相關的邏輯。因此,梯形邏輯程式可能類似於:

  1. 選擇任務
  2. 任務1序列
  3. 任務2序列
  4. 氣缸動作
  5. 液壓泵動作
  6. 油箱溫度控制

梯形圖邏輯程序的更多模式

Written with StackEdit.

Input Map

(譯)輸入映射

輸入映射模式是一種未充分使用且有價值的梯形圖邏輯編程模式。邏輯本身很簡單:
輸入圖
輸入映射

在大多數傳統的PLC中,您通過輸入在I / O結構中的物理位置來引用輸入。例如,在Allen-Bradley SLC500處理器中,I:4/0表示輸入插槽4的位0。建議您為此位創建描述性註釋,以便您可以輕鬆查看與該輸入連接的內容。

引入ControlLogix / CompactLogix控制器系列後,發生了兩件事。首先,實際的輸入名稱更長了:Local:4:I.Data.0的含義與SLC500中的I:4/0相同。其次,輸入現在與程序掃描非同步更新。讓我告訴你那是什麼意思:

非同步輸入
非同步輸入

在這兩行Ladder中,我們使用一個輸入的常開(NO)觸點為線圈A通電,使用同一輸入的一個常閉(NC)觸點為線圈B通電。您可以假設線圈A在同一程序掃描期間,線圈B永遠不會同時打開,但是如果PLC具有非同步輸入,那將是錯誤的。由於輸入掃描是與程序掃描非同步進行的,因此輸入實際上可以在求解第一個梯級和求解第二個梯級之間的時間之間更改狀態。這是一個非常隱蔽的問題,因為它很少會發生,但是有可能發生。這使得它成為除錯時潛在的非常困難的問題。

ControlLogix / CompactLogix PLC的這些功能使“輸入映射”模式相當普遍。許多PLC程序在開始時就有一個範例,稱為“映射輸入”,該例程將原始物理輸入作為觸點,並使用它來驅動內部繼電器線圈。然後,內部繼電器線圈將在程序的其他任何地方使用,而輸入本身在該位置僅使用一次。

除了將輸入同步到程序掃描之外,“輸入映射”模式還具有其他一些優點。例如,PLC輸入有時會且確實會失敗。大多數機器都具有備用輸入,因此技術人員通常只會將電線移到另一個輸入上,而不是更換輸入卡(這很昂貴,如果您需要立即對其進行修復,則不可能)。這意味著他們必須更改邏輯,以便在程序中使用的所有地方都使用新輸入。一些輸入僅使用一次或兩次,但是某些輸入可能使用數十次甚至數百次(例如,想像一個故障復位按鈕)。如果使用“輸入映射”模式,則只需要在一個位置更改程序即可。

同樣,您可以將“輸入映射”模式與“除彈跳”模式結合使用。如果發現輸入上的觸點彈跳或電氣噪聲有問題,那麼已經準備好了輸入映射模式,這意味著您現在可以在一個單獨的位置添加除彈跳邏輯,而不會影響程序的其餘部分。

此外,在支持標籤名稱而不是直接存儲器地址的PLC上,您可以將輸入映射到比連接輸入的物理位置更具描述性的標籤名稱。您還可以將輸入映射到較短的緊湊標籤名稱(例如I04.0),這比在Local:4:I.Data.0上更容易安裝在電線的標籤上。

此模式的使用特定於PLC。例如,Beckoff的TwinCAT PLC軟件已經包含I / O映射功能,因此您可以使用其係統管理器將MyMachine.MotorRunning之類的內部變數映射為物理輸入。他們的I / O掃描也與程序掃描同步,因此與Beckhoff TwinCAT系統一起使用輸入映射模式的優勢較少。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Debounce

我就是文章中所述會在每個輸入點都加上除彈跳的工程師…

(譯)除彈跳

由於越來越多地使用諸如近接開關之類的固態傳感器,因此您不太可能看到這種梯形邏輯編程模式,但是“除彈跳”模式在許多項目中仍然派上用場:
除彈跳
除彈跳

當您處理可能易於“彈跳”的“幹接點”輸入時,“除彈跳”模式很有用。在電路閉合時,觸點可能會彈跳,這可能會導致輸入暫時在導通和關斷狀態之間振盪。當觸點由於電弧而斷開時,輸入也會振盪。附近高電流導體產生的電噪聲實際上會在低壓輸入中感應出電脈衝,這可能使您的邏輯誤以為輸入在很短的時間內處於相反狀態。

除彈跳模式是狀態線圈模式的一種變體。在這種情況下,我們使用計時器上的延遲作為線圈的觸發。在更改內存線圈的狀態之前,此計時器“確保”輸入確實打開。然後,線圈將自身自保持。在允許破壞線圈的電路自保之前,使用延遲關閉計時器來確保輸入確實關閉。

可以修改計時器的設定時間以適應這種情況。如果使用除彈跳模式來抑制電噪聲,則可以將計時器縮短到幾毫秒,但是如果問題是機械接觸的彈唬,則可能需要50或100毫秒(甚至更長)。

除彈跳模式有一些缺點:首先,它會對輸入做出反應時延遲機器的響應時間。我們希望大多數機器盡可能快地運行,並且希望避免不必要的延遲。其次,它消耗了計時器,這對於資源有限的舊式PLC來說更值得關注。第三,它使邏輯複雜化。

一些工程師甚至還為機器上的每個輸入添加了一個除彈跳功能。由於我剛剛列出的缺點,我會認為盲目添加Debounce邏輯是一種反模式。我建議您僅在知道自己需要此模式時,或者根據以往的經驗很可能需要使用此模式時,才使用此模式。

在大多數情況下,可以通過一些簡單的選擇來避免除彈跳邏輯。首先,在可能的地方使用固態和/或高質量的傳感器和開關,這些傳感器和開關彈跳的可能性較小。其次,在機器上佈線大電流導線時,應使其不與小電流控制導線並聯。第三,檢查輸入卡是否具有可以打開或調節的過濾器功能。該濾波器可用於從雜散電噪聲中濾除高頻(短持續時間)脈衝。

“除彈跳”模式通常與“輸入映射”模式結合使用。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Step

(譯)步進

步進模式是梯形圖邏輯編程模式,它是機器自動模式的基本組成部分。每個步驟的邏輯很簡單:

步
步進

您可以組合任意數量的步驟以形成一個序列。這些步驟將順序執行。當“進行中的線圈”打開時,這應該是在程序中其他位置啟動機械裝置的信號。例如,如果步驟是“推出氣缸”,則可以使用來自“進行中”線圈的觸點來打開電磁閥以讓氣缸推出。步驟保持活動狀態(即,“進行中的線圈”保持打開狀態),直到“步驟完成”條件為真。在氣缸推出的範例中,“完成步驟”條件可以是“氣缸推出”輸入。

考慮到您可能需要幾個步驟來推出氣缸。如果您需要在第3步和第8步中都推出氣缸,那麼您的“推出氣缸”邏輯可以同時包含“正在進行的第3步”和“正在進行的第8步”中的觸點。

這是一個兩步序列的示例。步驟1是“推出氣缸”,而步驟2是“縮回氣缸”:

兩步
兩個步進

序列開始條件是啟動序列的條件。這應該類似於“機器處於自動模式,正在運行自動循環,存在部件,並且尚未處理部件”。當序列完成時,則Seq.Complete線圈打開。可以與“設置/重置”模式結合使用,以鎖存一個存儲位,以指示該零件已被處理。大概這會導致另一個序列開始,例如“卸載零件”序列。或者,我們可能只等操作員卸下零件。

步進模式經常與任務模式一起使用。在這種情況下,“Sequence Start”將是“任務”(進行中)線圈和“序列”。完整的線圈將發出任務結束的信號。

請注意,如果在序列過程中退出“Sequence Start”條件,則整個序列將重置(所有“完成”線圈將關閉,“Seq. Complete”線圈也將關閉)。

還要注意,如果序列開始並且氣缸已經打出,那麼“進行中的步驟1”線圈將永遠不會打開。它將直接跳到步驟2。在這種情況下,這可能就是您想要的。如果不是,您可以考慮將條件“汽缸未推出”置於“序列開始”條件中。另一種選擇是在進入下一步之前,強制“進行中”線圈至少打開一次掃描。這是相對簡單的:

步驟:變體
步進:變體

通過在第一個rung中在“Step Complete”條件之前添加“Step In Progress”的觸點,我們確保在完成該步驟之前,“Step In Progress”線圈必須打開至少一個掃描。您甚至可以採用這種形式的模式並刪除“Step Complete”條件:

步驟:一桿
步進:一次觸發

在此模式的變體中,“進行中”線圈將打開一次以進行精確的一次掃描。這使其成為“一次性步驟”。單步操作對於零件跟踪和數據記錄非常有用,因為這些操作通常只需要單次掃描(例如設置位,進行測量或將值記錄到零件歷史記錄中)。

梯形圖邏輯程序的更多模式

Written with StackEdit.

State Coil

(譯)狀態線圈/錯誤線圈

梯形邏輯編程模式的最常見範例之一是狀態線圈(有時稱為記憶線圈)。該模式是“自保迴路”模式的擴展。該模式包括一個觸發條件,一個線圈,線圈中的觸點圍繞觸發條件分支,以“自保持”,然後通過其他條件“破壞自保”:
狀態線圈
狀態線圈

自保迴路一樣,如果PLC斷電或程序重置,則狀態線圈將始終恢復為斷電狀態。但是,與“自保持迴路”不同,狀態線圈在程序正常運行期間會打開和關閉。該模式的目的是記住一個代表機器內部狀態的真/假條件。這是一個範例時序圖:

狀態線圈時序圖

您通常會看到State Coil模式代表“錯誤”狀態。假設您的機器出現“錯誤”(即必須讓機器停止運行且向操作員報告情況,並且他們須要予以確認)。在此範例中,“錯誤條件”是上面邏輯中的“觸發器”觸點。例如,它可能是馬達上的過熱傳感器。當過熱傳感器指示錯誤時,它將為錯誤(狀態線圈)通電,並且錯誤將繼續通電。錯誤線圈的觸點通常用於使機器(或至少是馬達)停止運轉,以防止損壞機器。該線圈的另一個觸點可能用於驅動警報燈,或在屏幕上顯示一條消息以通知操作員該問題。

狀態線圈-過熱錯誤

過熱錯誤

最後請注意,如果錯誤狀況仍然“處於活動狀態”(即,過熱開關仍指示過熱狀況),則錯誤將維持自保持狀態。這就是當有人說“必須清除錯誤才能將其重置”的意思。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Start Stop Circuit

(譯)啟動/停止電路

啟動/停止電路是一個非常有用的梯形邏輯編程模式。此模式是“自保迴路”模式的擴展,類似於“狀態線圈”。但是,在狀態線圈為“觸發主導”(即觸發條件優先於“中斷條件”)的情況下,啟動/停止電路為“停止主導”:

啟動/停止電路

啟動/停止電路

與自保迴路一樣,如果PLC處於關閉狀態或梯形邏輯程序被重置,則運行線圈將始終恢復為斷電(關閉)狀態。這是一個有用的屬性,因為在啟動機器時,我們可能希望馬達等處於關閉狀態,直到邏輯決定啟動它們為止。

該電路的輸入為“啟動”和“停止”條件。您可以想像這兩個按鈕都是操作員屏幕上的瞬時按鈕,而操作員實際按下按鈕時這些按鈕都處於打開狀態。如果操作員按“啟動”按鈕,則運行線圈將打開,並自保持,直到操作員按“停止”按鈕。該模式是“停止主導”模式的原因是,我們希望在兩個信號都處於活動狀態的情況下,“停止”條件比“開始”條件具有更高的優先級別。想像一下由於某種原因啟動條件被卡住的情況。至少操作員可以通過按住“停止”按鈕來停止馬達等,直到他們可以通過主開關關閉機器。這是一個示例時序圖:

啟動停止電路時序圖
如果您想像“開始”和“停止”是連接到PLC輸入的物理按鈕,則這更有意義。在這種情況下,我們通常會使用“常開”觸點連接“開始”按鈕(因此,按下“開始”按鈕可打開輸入),而我們將使用“常閉”觸點為“停止”按鈕連接(因此,按下“停止”按鈕可將輸入關閉)。常開觸點可以在“ON”位置連接,並且使“停止”按鈕優先於“開始”按鈕更有意義。在這種情況下,邏輯看起來略有不同:

帶NC停止按鈕的啟動/停止電路

帶NC停止按鈕的啟動/停止電路

按鈕以這種方式進行接線的原因是,如果斷開了與“停止”按鈕的連接,或者失去了“停止”按鈕的電源,則機器將像按下了“停止”按鈕一樣,馬達等的動作會停止。與允許馬達繼續運行而無法使其停止運行相比,這可能是一種更安全的條件。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Set Reset

雖然這篇文章中不建議對同一個位元多次使用設置/重置模式,但不幸的是,個人的ST程式較徧好這種寫法…

(譯)設置/重置

您將永遠不會看到那麼重要卻更經常被濫用的梯形圖邏輯編程模式了。設置/重置模式,也稱為鎖存/解鎖模式,或簡稱為“鎖存位”,用於記住必須在斷電後保持的機器的某些開/關狀態:

設置/重置

設置/重置

請注意,在Allen-Bradley PLC中,您將看到使用的“鎖存(L)”和“解鎖(U)”一詞,而不是“設置和重置”。

在上面顯示的邏輯中,這是此模式“重置優先”狀態。這是因為如果同時激活“設置”和“重置”條件,則記憶位元將被重置。當然,您可以通過簡單地逆轉邏輯來使此轉為“設置優先”:

設置/重置-設置主導

設置/重置-設置主導

在您真正理解此模式之前,您需要了解一些梯形邏輯的來源。PLC的發明之前(和許多年_之後_)的機器邏輯與實際的物理編程繼電器。當PLC掉電時,PLC中的正常“線圈”(例如,在“啟動/停止電路”模式中可見)將恢復為斷電狀態(“關”)的原因是其目的是模仿繼電器的行為。如果關閉機器的主電源開關,則所有繼電器線圈都會斷電,因此它們都將恢復為斷電狀態。

當然,即使在那些日子裡,即使機器斷電,有時您還是希望機器“記住”某些情況。為此,您可以購買一種特殊的設備,稱為兩線圈閉鎖繼電器。該繼電器中有兩個線圈:置位線圈和復位線圈。當給Set線圈通電時,它會將內部機構移至“ on”位置,但該位置在彈簧力的作用下得以機械保持。給復位線圈通電會使內部機構移至“關閉”位置。如果兩個線圈均未通電,則繼電器將保持在其最後位置,因此為什麼將其稱為“閉鎖繼電器”。

當發明PLC時,他們想模仿這種兩線圈繼電器邏輯,這就是為什麼他們將“設置/重置”功能分成兩個線圈:“ S”和“ R”(或“ L”和“ U”)的原因。Ladder工程師必須負責任地使用它們,但不幸的是,許多工程師沒有這樣做。不幸的是,沒有什麼可以阻止您在程式中散佈相同 bit 的多個重置線圈。這使得邏輯變得更加難以理解和排除故障。在同一存儲位上多次使用置位或複位線圈被認為是反模式。我強烈敦促您構造梯形邏輯,以使用上面顯示的形式之一,以便每個存儲位都具有一個置位線圈和一個復位線圈。不僅如此,還請把它們放在相鄰的Ladder上。

當我編寫自己的梯形圖編輯器時,我堅信該語言應防止新手犯此錯誤,因此它僅具有組合的Set / Reset指令:

設置/重置-SoapBox捕捉

設置/重置– SoapBox(譯注:這是原作者自己實作的Plc軟體)

該語言根本不允許您為同一存儲位使用兩個置位或兩個復位線圈。

設置/重置模式通常用於機器中的零件跟踪。假設您有一台機器,其中機器人將零件放置到夾具中,然後對該零件執行一些製造操作(例如磨削或銑削操作),然後另一個機器人將零件從夾具中移除,然後將其移至下一個零件車站。理想情況下,固定裝置中將有一個傳感器,以指示是否存在零件。您將需要某種方式來“記住”在該零件上執行的製造操作的狀態。首先,您將需要進行“設置/重置”以記住製造操作已經開始,其次,您將需要另一次“設置/重置”以記住製造操作已經完成。萬一停電,機器也可以恢復:如果兩個內存均未打開,那麼您仍然需要在零件上執行製造操作,如果兩者都啟用,則只需要從固定裝置上卸下零件即可。如果“啟動”內存已打開,但“完成”內存已關閉,則您可能需要報廢零件,或者您可以繼續操作。

額外的功勞:PLC旨在模仿繼電器邏輯。但是,數字邏輯(以微芯片和晶體管的形式)具有數字鎖存器的概念,也稱為“觸發器”或“設置/重置鎖存器”。重要的是要注意,這樣的數字電路不會在停電時保持其狀態。有趣的是,PLC的Allen-Bradley系列使用電池支持的SRAM(實際上只是大量的觸發器陣列)來存儲程序狀態。當PLC斷電時,內部電池將閂鎖保持在閂鎖狀態。請注意,此電池不會永遠持續使用,如果您讓Allen-Bradley PLC長時間不通電,則會丟失其內存。其他PLC依靠將其內部狀態寫入“永久性存儲”介質(例如內置Flash或硬碟)中,並且它們被設計為在電容中儲存足夠的電力以在斷電後仍可記憶。

梯形圖邏輯程序的更多模式

Written with StackEdit.

Ladder的設計模式

PLC的設計模式

寫了一陣子的plc程式,雖然我都是用ST來寫,但主要的寫法觀念還是來自於Ladder的順序邏輯,之前也好奇除了基本的互鎖之類的方式,有沒有其它的寫法,那時候就有看過這一系列的文章,現在有一點時間,就簡單的做了一下翻譯(當然9成以上是 google翻的,僅讓句子變得更通順),推薦給大家。

(譯)階梯圖邏輯程式的模式

如果您熟悉Java或C#等語言的PC編程,那麼您可能會了解《Design Patterns: Elements of Reusable Object-Oriented SoftwarePatterns of Enterprise Application Architecture。這些書是關於軟體設計模式的。

作為一個寫了很久的Ladder的工程師,我認為與較新進的工程師分享經驗的一種方法是組織一系列用於Ladder編程的常用模式。Ladder編程模式列表有兩個目的:首先,每個模式都是使用Ladder解決常見問題的工具,並且在您的工具箱中包含這些模式將使您能夠更快地編程,可花費更多時間專注於您程式中更高層次的結構;其次,由於這些是常見的模式,因此您將開始發現更容易閱讀別人的Ladder,而其他有經驗的工程師也會發現更容易遵循您的邏輯。

  1. Sealed in Coil (自保持)模式
  2. State Coil/Fault Coil 模式
  3. Start/Stop Circuit 模式
  4. Set/Reset 模式
  5. Flasher 模式
  6. Debounce 模式
  7. Input Map 模式
  8. Step 模式
  9. Mission 模式
  10. Five Rung 模式
  11. Mode 模式

Written with StackEdit.