首頁/ 汽車/ 正文

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

0628 【萬泉河】優雅的PLC程式一定是用EXCEL寫出來的

我有一些認知盲區。

我一直以為,許多能談得上PLC程式設計高手的同行, EXCEL的靈活運用肯定不在話下, 至少不會比辦公室文員的小姑娘們水平差。

所以,以往我寫文章,甚至寫書,到接近EXCEL的時候就點到為止,不再多說了。

怕被人指責內容太水, 沒有技術含量。

當然,同時也怕被其他行業的人看到,笑話咱們搞高大上的自動化程式,竟然連EXCEL的技巧都還掰扯不清。

所以, 我在《PLC標準化程式設計原理與方法》書中, 明確把EXCEL技能列在技能需求第二項, 重要程度8, 難度係數2。

因為EXCEL技能現在相當於通用技能, 而不是侷限於PLC行業之內。 所以要提升技能, 或者獲取答案的方法非常多,即便有解決不了的問題, 網上隨便搜尋一下, 分分鐘可以搞定。

所以,我給標準化學員講課時也從來不會涉及這個方面, 只需要論證出程式的整體結構, 告訴他們一句話, 這部分可以用EXCEL生成, 後面的操練就他們自己搞了。 而其實我給的資料裡面,有時候會夾雜了我做專案時的EXCEL中間檔案,他們或許可以借用我的EXCEL檔案當模板, 自己做專案的時候可以用到。

但單獨的培訓交接, 是絕對不會有的。

所以,預設我會認為,跟我學習的學員一定都具備了EXCEL的基本功。 當然每個人不一樣, 如果他自己知道自己這方面有欠缺,自然會私下去補上。 不需要在我這兒添麻煩。

所以,我做的80工位雙聯開關的例子, 把程式指令碼列在那裡,在我看來,就足夠優雅了,就自個兒去得意洋洋了。

比如SMART200的例子裡面備註了一下:

後面79個工位呼叫用STL編寫

//CALL L31_工位控制, GW01_SIG, LAMP, GW01_SAV

CALL L31_工位控制, GW02_SIG, LAMP, GW02_SAV

CALL L31_工位控制, GW03_SIG, LAMP, GW03_SAV

CALL L31_工位控制, GW04_SIG, LAMP, GW04_SAV

CALL L31_工位控制, GW05_SIG, LAMP, GW05_SAV

CALL L31_工位控制, GW06_SIG, LAMP, GW06_SAV

CALL L31_工位控制, GW07_SIG, LAMP, GW07_SAV

CALL L31_工位控制, GW08_SIG, LAMP, GW08_SAV

CALL L31_工位控制, GW09_SIG, LAMP, GW09_SAV

CALL L31_工位控制, GW10_SIG, LAMP, GW10_SAV

……

而至於怎麼寫出來的, 這麼簡單的有規律的程式指令碼, EXCEL分分鐘可以搞定的呀!

昨天發表了文章《0627 【萬泉河】程式演算法的本質》,其中提到了我3年前寫過的文章《201907 【萬泉河】PLC程式設計中的迴圈語法使用》。

原本想得很好呢, 咱技術進步一步一個腳印,以前一篇文章的結論為基礎, 發展理論到最新的認知。 沒想到,在群裡吵成一團, 一大票人對前一篇文章的觀點壓根不認同。 你不管怎麼表達, 他都一口認定用迴圈總是最省事的,能節省程式設計工作量。

我就奇怪了, 你們只看到迴圈那幾句指令省事了, 可前處理後處理的把IO對映到陣列中的程式怎麼寫的, 怎麼生成的, 那些不是工作量嗎?

糾結了很久,才搞明白,很多人寫程式原來都是從來不使用EXCEL的, 甚至許多EXCEL的技巧壓根不曉得。難怪行業中總有那麼多文章教程和影片在宣講呼叫模擬量迴圈呼叫,當成提高程式設計效率的不二法門, 也難怪有人反而倒打一耙把我反對用迴圈,提倡減少用迴圈的文章當成流毒了。 感情是你們只會用程式軟體的編輯器寫程式, 從來不會用EXCEL寫程式的呀!

好吧, 那我就從最水貨的EXCEL技巧出發, 逐步演示用EXCEL生成PLC程式的方法吧!最終也做個80個模擬量呼叫的示例程式, 會與80工位雙聯開關程式合併到一個系列中。當然, 前提基礎仍然是所有PLC平臺均相容的方法,所以不必在意我文章中演示是用的什麼PLC平臺。

把上述的STL程式生成的第一個例項的程式複製到EXCEL中,然後拖拽單元格右下角的小黑點拖到80行,並選擇填充序列:

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

會發現, 程式中2個數字序列, 但EXCEL只給文字中的最後一個數字生成序列。 這怎麼辦?

方法是文字複製到AB兩列,然後各自刪掉頭和尾,保證數字分到了兩個列。然後這時候對這兩個單元格同時拖拽80行,即生成了80行呼叫程式。

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

直接選中, 複製內容到程式中,直接可用。

當然,其實這樣複製的內容中有表格分隔符,也可以另外生成一個C列, 裡面的公式填入:

=A1&B1,同樣拖拽到80行。 生成了80行結果。 或者在前面兩列已經生成80行的情況下,直接雙擊黑點, 也可以。

由此得到了完整的80行程式呼叫。

然而, 這裡80個工位編號完整整齊的從01遞增到80, 是我為了例子生成便捷,刻意安排的。 而實際的工程專案中, 位號通常不連續。比如:GW1001 GW1002 GW1003 GW1004 GW1005 GW1006 GW1007 GW1008 GW1009 GW1010 GW2001 GW2002 GW2003 GW2004 GW2005 GW2006 GW3001 GW3002 GW3003 GW3004 GW3005 GW3006……總計80個。

首先把上述的位號資料複製到A列,這裡是一行資料,可以先複製到一個行中,然後選擇性貼上,轉置,把行排列的資料轉置成了列。

程式呼叫的位號部分修改到AAAA,即:

CALL L31_工位控制, AAAA_SIG, LAMP, AAAA_SAV

複製到B列所有行。

C2中填入公式:

=SUBSTITUTE(B2,“AAAA”,A2)

意思為把B列中的AAAA字元的部分替換為A2單元格的內容。

即得到了目標的程式, 拖拽到底, 則生成了所有程式:

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

然後模擬量轉換程式的呼叫。

模擬量程式的特點是,輸入的引數很多, 每一個模擬量的標定資料上下限,物理單位等都不一樣,來自工藝統計的位號表,如:

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

工藝表中還必然另外存在一些資料資訊列,我們不關心的,只需要隱藏即可,留下的內容都需要生成到程式中。 包括字元型別的註釋和單位部分,我們也不願意親自手工二次錄入,在PLC支援的情況下,可以直接做到FB的管腳上,最終不僅僅程式中直觀可見, 字元資料還可以傳到上位機中, 上位組態時也不必再包含這部分錄入的工作量了。

那麼, 程式模板會是:

“//#AAAA(IN_INT:=”“AAAA”“,

HI_LIM:=CCCC,LO_LIM:=BBBB,

INSTANCE:=‘DDDD’,unit:=‘EEEE’);”

其中除了訊號名稱AAAA需要替換之外,後面的BBBB,CCCC,DDDD,EEEE也分別替換為表格內的內容。

把模板所在的單元格起名字定義為AI_1500, 替換語法設定為:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(AI_1500,“AAAA”,B2),“BBBB”,G2),“CCCC”,H2),“DDDD”,I2),“EEEE”,F2),CHAR(10),“ ”)

最終生成了程式:

“AI_V019”(IN_INT:=“AI_V019”, HI_LIM:=100,LO_LIM:=0, INSTANCE:=‘DPT-R5’,unit:=‘pa’, QOUT=>“HMI”。AI。AI_V019);

“AI_V020”(IN_INT:=“AI_V020”, HI_LIM:=500,LO_LIM:=0, INSTANCE:=‘DPT-F5’,unit:=‘pa’, QOUT=>“HMI”。AI。AI_V020);

“AI_V021”(IN_INT:=“AI_V021”, HI_LIM:=55,LO_LIM:=-5, INSTANCE:=‘THT-R6-T’,unit:=‘°C’, QOUT=>“HMI”。AI。AI_V021);

“AI_V022”(IN_INT:=“AI_V022”, HI_LIM:=100,LO_LIM:=0, INSTANCE:=‘THT-R6-RH’,unit:=‘%’, QOUT=>“HMI”。AI。AI_V022);

“AI_V023”(IN_INT:=“AI_V023”, HI_LIM:=100,LO_LIM:=0, INSTANCE:=‘DPT-R6’,unit:=‘pa’, QOUT=>“HMI”。AI。AI_V023);

把程式直接複製到PLC軟體中,即可。

0628 「萬泉河」優雅的PLC程式一定是用EXCEL寫出來的

這裡篇幅有限, 只複製了其中的前幾行。 而實際專案中別說80個模擬量了,就是800個, 8000個, 只要工藝來的資料表格規範完整, 這些工作量都是秒成的。

比如如果有8000個的天量資料, 專案所控制的PLC CPU至少也幾十個。那麼只需要在資料表中標明CPU的標識, 程式生成後按標識複製到相應的CPU中即可。 啥迴圈都不需要做。

所有的宣傳用迴圈語法處理模擬量的文章或者影片, 只在意了呼叫部分, 而引數的輸入部分的工作量都忽略不計了。然而那才是工作量最大的, 最令人厭煩的。

模組引數的給定, 物理通道的給定等等,最方便的方式恰恰是透過FB呼叫的例項化時給定,因為可以在一行程式語句裡面一次性完成。如果只為了迴圈呼叫的爽一下,留給資料整理部分的工作量反而增加了,而且分散到整個程式的多個角落去了。查錯,維護都成了問題。

所有堅持使用迴圈語法呼叫模擬量程式的網友們,不妨嘗試把我的程式改進到你們的模式,看看效率能不能再提高些。

本文中提及的資料表格,以及生成的例子程式,我會統一打包在一起, 方便下載和借用。

也會歸檔上傳到“80工位雙聯開關”的群檔案中。

當然這種程式方法也完全可以照貓畫虎遷移到其它品牌平臺,有興趣者歡迎鑽研一下, 完成後署名上傳, 業界同行會記住你的名字你的貢獻的。

相關文章

頂部