楊繼志
(北京航天試驗(yàn)技術(shù)研究所, 北京 100074)
西門子PLC 之間的通信有兩種最為常用的方式,一種是雙邊通信,通信雙方都需要編寫通信程序,還有一種是通過PUT/GET 機(jī)制實(shí)現(xiàn)的單邊通信,這種通信方式只需要通信一方編程,因此應(yīng)用也是非常普遍的。 本文簡(jiǎn)要介紹兩種機(jī)制在實(shí)際工程中的應(yīng)用方式,但是本文并不準(zhǔn)備討論西門子PLC 之間的各種通信方式的實(shí)現(xiàn)細(xì)節(jié)以及區(qū)別,而是在討論兩種最常用的西門子PLC 之間的通信方式基礎(chǔ)上,討論為“事務(wù)型”數(shù)據(jù)的通信提供一個(gè)更高層的協(xié)議的原因、 如何構(gòu)造一個(gè)這種協(xié)議,以及協(xié)議通過SCL 程序的實(shí)現(xiàn)方法。 為什么需要一種更高層的協(xié)議,主要在于PLC 之間的通信機(jī)制的設(shè)計(jì)思想主要是為設(shè)備的控制,傳統(tǒng)上一臺(tái)PLC 與其他的PLC 之間的通信主要目的是控制或獲得對(duì)方的IO 點(diǎn)狀態(tài)或信息,但是隨著PLC 處理能力的提高,一些工藝、整線上的信息有些也在PLC 中進(jìn)行處理,這樣就出現(xiàn)了一些“事務(wù)型”數(shù)據(jù)通信交換的需求,而這種針對(duì)控制設(shè)計(jì)的通信對(duì)于“事務(wù)型”數(shù)據(jù)的通信支持存在一些問題,因此需要一個(gè)高層協(xié)議解決這些問題。
西門子PLC 之間的通信常用的有兩種方式, 一種是在通信雙方的CPU 中調(diào)用通信函數(shù)(TSEND_C,TR CV_C);還有一種通信方式采用PUT/GET 機(jī)制,通信雙方只需要一方進(jìn)行編程, 這在設(shè)備控制通信中非常方便,相當(dāng)多的SCADA 系統(tǒng)與西門子PLC 之間的通信也是采用這種方式,優(yōu)點(diǎn)是PLC 側(cè)不需要額外的編程,只需要將接口(DB 全局?jǐn)?shù)據(jù)塊)屬性設(shè)置為允許PUT/GET 并且關(guān)閉塊的優(yōu)化存貯即可,這種通信不但適用于西門子最新的1200、1500 系列PLC 而且還適用于其較早一些型號(hào)的PLC,包括SMART200 等,因此應(yīng)用較廣。 無論哪種通信方式一般的通信編程結(jié)構(gòu)如下:把通信雙方叫做A、B,以采用PUT/GET 通信方式為例,其中PUT/GET 指令編程在A 中實(shí)現(xiàn),控制功能是A、B 雙方控制一整套工藝設(shè)備,其中A 控制的工藝設(shè)備需要與B 控制的工藝設(shè)備進(jìn)行通信, 在A 中生成兩個(gè)全局?jǐn)?shù)據(jù)局塊如DB1_PUT,DB2_GET,用于向B 發(fā)送數(shù)據(jù)和接收B 的數(shù)據(jù), 同樣,B 中生成兩個(gè)結(jié)構(gòu)相同的全局?jǐn)?shù)據(jù)塊,如DB1,DB2,其中DB1 與A 中的DB1_PUT 鏈接,DB2與A 中的DB2_GET 鏈接,通信過程見圖1。

圖1 常用的通信模式
通過這種通信方式,設(shè)備A 中的各控制點(diǎn)的狀態(tài)就實(shí)時(shí)傳遞到了PLC_B 中了,同樣地,設(shè)備B 中的各控制點(diǎn)的狀態(tài)也時(shí)時(shí)傳遞到PLC_A中。 PLC_A 控制設(shè)備B 中的控制點(diǎn)或獲得設(shè)備B 中的控制點(diǎn)狀態(tài)就如同控制本PLC 下的控制點(diǎn)一樣簡(jiǎn)單和容易。
圖1 表達(dá)的這種通信方式工藝數(shù)據(jù)是存貯在接口中的, 而且一方的通信接口持續(xù)不斷接收另外一方的數(shù)據(jù),造成本PLC 內(nèi)的程序也不可以對(duì)接口中的工藝數(shù)據(jù)進(jìn)行修改了,可以將這種現(xiàn)象叫做數(shù)據(jù)的“鎖死”。鎖死式通信是設(shè)備控制所必須的一種機(jī)制,所以對(duì)于單純的設(shè)備控制任務(wù)這種通信模式不存在任何問題,而且是必須的,但是對(duì)于讀寫整線唯一信息這類非實(shí)時(shí)數(shù)據(jù)就存在問題,包括不同通信方并發(fā)改寫問題,而且由于編程水平的不同,如果是不同單位分別負(fù)責(zé)整線某段設(shè)備控制,當(dāng)一方程序存在瑕疵,則這種鎖死式通信會(huì)造成問題長(zhǎng)期得不到解決,控制總體希望即使某些工藝段程序存在瑕疵, 問題也僅僅存在整線的一部分,不會(huì)對(duì)整線的數(shù)據(jù)和通信造成較大的影響,這些需求在“鎖死”式通信的情況下無法解決。
圖1 表達(dá)的這種通信方式對(duì)于IO 控制是最為方便的,可以看到這種模式數(shù)據(jù)和接口是耦合在一起的,接口即是通信雙方的界面,也是工藝數(shù)據(jù)存貯的位置。在邏輯和工程實(shí)踐中均需要接口和數(shù)據(jù)解耦, 一方面在接口變化時(shí)不至于對(duì)數(shù)據(jù)存貯造成影響, 另外一方面保證數(shù)據(jù)的統(tǒng)一性。 這種數(shù)據(jù)與接口耦合情況可見圖2。

圖2 “事務(wù)型”信息接口和數(shù)據(jù)耦合
在通信雙方的全局?jǐn)?shù)據(jù)塊接口中均有“事務(wù)型”信息,接口中的數(shù)據(jù)通過PLC_A 內(nèi)部的處理后會(huì)將更新狀態(tài)放置在與PLC_B 通信的DB 塊位置處。同樣PLC_B 也可能根據(jù)本PLC中的設(shè)備運(yùn)行狀態(tài)和工藝狀態(tài)對(duì)這個(gè)信息進(jìn)行處理,之后再傳遞給PLC_A。 并不是所有的“事務(wù)型”信息的傳遞都采用如上的方式, 有些具體的項(xiàng)目的信息傳遞可能只有該過程的一部分, 但是完整的邏輯鏈條與上圖基本是一致的。
如圖2 所示,直接采用單邊、雙邊通信機(jī)制傳遞事務(wù)型數(shù)據(jù), 接口中的數(shù)據(jù)既是要存儲(chǔ)數(shù)據(jù)也要與多方進(jìn)行“鎖死”通信,這樣存在的問題就是,多方均可對(duì)該數(shù)據(jù)進(jìn)行直接的操作, 唯一數(shù)據(jù)管理方對(duì)該數(shù)據(jù)的管理能力削弱,根本原因是接口與數(shù)據(jù)存貯耦合,而一般在設(shè)計(jì)上希望的是進(jìn)行一定的判斷之后才進(jìn)行存貯數(shù)據(jù)的修改等操作,總控PLC 有相應(yīng)的接受與拒絕修改工藝數(shù)據(jù)的能力,在這種接口與存貯耦合的狀態(tài)下就難以實(shí)現(xiàn)。 接口與存貯解耦、分離是解決“事務(wù)型”數(shù)據(jù)通信的一個(gè)核心思想,可以參考面向?qū)ο蟮乃枷虢鉀Q這個(gè)問題, 接口中只存在一些實(shí)現(xiàn)(函數(shù)),數(shù)據(jù)只有通過接口中的實(shí)現(xiàn)才能獲得。
一般來說對(duì)接口能力的要求除能夠傳遞數(shù)據(jù)外,有時(shí)還需要能夠申請(qǐng)一些過程的運(yùn)行,也就是由PLC_B 通過接口可以啟動(dòng)PLC_A 中的某些過程,這也是接口與存貯解耦后的一個(gè)自然要求。 接口需要得到存貯在其他位置的數(shù)據(jù)顯然是需要通過某些過程實(shí)現(xiàn)的。 也就是接口除能夠傳遞數(shù)據(jù)還能夠傳遞某些函數(shù)的“指針”。通過PLC_A 中自己的函數(shù)對(duì)數(shù)據(jù)進(jìn)行修改,同樣獲得這些數(shù)據(jù)也需要通過接口進(jìn)行而不是直接獲得或修改,這樣便于將此類數(shù)據(jù)進(jìn)行封裝。 而圖1、2 表達(dá)的通信過程接口僅能夠傳遞數(shù)據(jù)。
接口不可能一次性全部設(shè)計(jì)完成, 在項(xiàng)目進(jìn)行過程中接口中的數(shù)據(jù)變得越來越復(fù)雜。 希望的接口一方面在項(xiàng)目實(shí)施過程中有一定柔性, 在項(xiàng)目的進(jìn)化過程中接口的含義可以發(fā)生變化, 而這種變化卻不會(huì)帶來太多的編程結(jié)構(gòu)方面的變化是最好的。 顯然這種模式要么在雙方通信前全部定義完成接口的含義, 并在后續(xù)的過程中接口完全保持不變,如果在項(xiàng)目進(jìn)展過程中接口發(fā)生變化,則雙方的程序變化量較大, 特別是增加了協(xié)作雙方的溝通成本。 最好的方式是,在接口的大體形式確定后,在后續(xù)的項(xiàng)目演化過程中即使通信的需求發(fā)生了變化但是雙方的接口可以保持不變或基本不變, 而且通信一方若不對(duì)通信方面的編程進(jìn)行修改也不會(huì)影響到這個(gè)項(xiàng)目的通信,這是一種自然的需求。 而這種鎖死的、接口和數(shù)據(jù)完全耦合在一起的通信方式是無法實(shí)現(xiàn)這個(gè)需求的。
接口和數(shù)據(jù)分離是“事務(wù)型”數(shù)據(jù)通信的自然需求,能夠保證數(shù)據(jù)的唯一性和統(tǒng)一性, 但是需要接口和數(shù)據(jù)之間有一些函數(shù)關(guān)系, 比如通過確定的函數(shù)將數(shù)據(jù)放入存貯位置,或提取最新的數(shù)據(jù)并放入接口,因此需要在接口中描述這些動(dòng)作以及動(dòng)作需要的參數(shù), 另一方面需要在全局?jǐn)?shù)據(jù)塊開辟一個(gè)專門的DB 用于存貯數(shù)據(jù),見圖3。

圖3 接口和數(shù)據(jù)分離
實(shí)現(xiàn)方式是設(shè)計(jì)一個(gè)全局?jǐn)?shù)據(jù)塊,這個(gè)數(shù)據(jù)塊中包含一些信息,利用這些信息可以運(yùn)行PLC 中的一些函數(shù),顯然這樣的數(shù)據(jù)塊至少需要包含需要啟動(dòng)的函數(shù)的函數(shù)名稱(當(dāng)然并不一定是字符串型的數(shù)據(jù)類型,可以是整數(shù)型的數(shù)據(jù)類型,其實(shí)這種數(shù)據(jù)類型在后續(xù)的處理時(shí)更為方便) 和函數(shù)的參數(shù)。通過這個(gè)函數(shù)實(shí)現(xiàn)接口和數(shù)據(jù)存貯分離,即使是通信對(duì)象不遵守該協(xié)議的情況下也不會(huì)影響其他遵守協(xié)議的通信方。
通過一個(gè)全局?jǐn)?shù)據(jù)塊實(shí)現(xiàn)驅(qū)動(dòng)函數(shù)運(yùn)行, 而且是函數(shù)名變量發(fā)生變化時(shí)運(yùn)行一次, 避免了多個(gè)通信方得通信鎖死問題,而且實(shí)現(xiàn)了利用接口數(shù)據(jù)啟動(dòng)PLC 內(nèi)過程。利用這種機(jī)制建立一層協(xié)議,避免任何一方直接“鎖死”通信信息,雖然同一個(gè)信息也可能出現(xiàn)在不同的位置,但是這些位置只有一個(gè)是臨時(shí)的存貯位置, 而且任何一個(gè)通信方都不可能對(duì)其進(jìn)行“鎖死”式的通信,避免由于某個(gè)通信方程序瑕疵造成影響。 協(xié)議的自動(dòng)機(jī)描述見圖4。

圖4 協(xié)議狀態(tài)機(jī)描述
協(xié)議的狀態(tài)機(jī)描述:接口中函數(shù)名稱是否發(fā)生變化,如果未發(fā)生變化則繼續(xù)監(jiān)控接口,如果發(fā)生變化,則在函數(shù)驅(qū)動(dòng)表中檢索響應(yīng)的函數(shù)并執(zhí)行一次, 之后回到繼續(xù)監(jiān)控接口表中函數(shù)名是否發(fā)生變化。
接口中本質(zhì)上是存貯函數(shù)的 “指針”,PLC 中只需要在一個(gè)永遠(yuǎn)保持運(yùn)行的監(jiān)控函數(shù)中一個(gè)CASE 語句維護(hù)實(shí)現(xiàn)函數(shù)映射表即可。 本文介紹這種編程思想時(shí)采用整形數(shù)作為“指針”,采用CASE 語句進(jìn)行函數(shù)表映射管理。接口中的函數(shù)參數(shù)表是所有可能運(yùn)行函數(shù)的參數(shù)并集,在具體編程和操作過程中,這個(gè)表也可能需要變化,當(dāng)然如果采用DB_ANY 類型的數(shù)據(jù)可以保證這個(gè)接口的不變性,但是增加了處理函數(shù)的復(fù)雜性,增加了通信的復(fù)雜性,在實(shí)際的項(xiàng)目開發(fā)中也許是不適當(dāng)?shù)模虼俗鲞@種折中的考慮是實(shí)際項(xiàng)目開發(fā)可以接受的。接口中的函數(shù)一般是只需要運(yùn)行一次即可,但是接口中的數(shù)據(jù)一般情況下都是全時(shí)間保持的,所以需要檢測(cè)函數(shù)名發(fā)生變化時(shí)運(yùn)行函數(shù)一次。 如下一個(gè)DB 數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊可以起名稱為“INTERFACE”,見圖5。

圖5 函數(shù)驅(qū)動(dòng)接口數(shù)據(jù)塊
通過函數(shù)Fun1、Fun2……就可以執(zhí)行品牌號(hào)改寫、獲取品牌號(hào)等函數(shù)操作,也就是將品牌號(hào)碼的讀寫添加到一個(gè)函數(shù)接口,而不是直接鎖死,這樣能夠保證改寫的一致性和并發(fā)改寫,“事務(wù)型” 數(shù)據(jù)是存貯在一個(gè)位置,其他位置僅僅可能會(huì)出現(xiàn)暫存數(shù)據(jù)。 函數(shù)映射表管理見圖6。

圖6 函數(shù)映射表
在OB1 中運(yùn)行一個(gè)函數(shù)時(shí)時(shí)監(jiān)控DB1 數(shù)據(jù)塊中的Fun_name 是否發(fā)生變化,如果發(fā)生變化,則以Par1、Par2等函數(shù)參數(shù)運(yùn)行相關(guān)的函數(shù)一次。
(1)靈活的接口數(shù)據(jù)定義。 從以上通信“協(xié)議”的描述可以看到,由于數(shù)據(jù)是通過函數(shù)的參數(shù)傳遞的,因此接口中的數(shù)據(jù)含義取決于當(dāng)時(shí)運(yùn)行的函數(shù), 運(yùn)行不同的接口函數(shù),在同一個(gè)位置可以得到不同含義的數(shù)據(jù),因此接口更靈活,且數(shù)據(jù)的獲得均是通過函數(shù)獲得,函數(shù)可以進(jìn)行相關(guān)的判斷處理,避免鎖死通信的問題。
(2)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)。通過接口中的數(shù)據(jù)實(shí)際上實(shí)現(xiàn)了驅(qū)動(dòng)PLC 中的過程, 啟動(dòng)和停止, 實(shí)現(xiàn)了通過接口驅(qū)動(dòng)PLC 過程的目的。 接口不僅僅是數(shù)據(jù)的交換,而且可以運(yùn)行對(duì)應(yīng)PLC 上不同的函數(shù)過程。在項(xiàng)目演化過程中,雖然不可能保證接口的永遠(yuǎn)不變, 主要是無法確定未來的函數(shù)的參數(shù)類型和數(shù)量, 如果對(duì)函數(shù)類型和數(shù)量進(jìn)行一定的限制顯然是可以部分解決這個(gè)問題的, 但是顯然接口形式的變化比數(shù)據(jù)型接口變化的要小的多。 因?yàn)樗举|(zhì)上是實(shí)現(xiàn)了接口函數(shù)參數(shù)的“復(fù)用”。
目前西門子PLC 之間的通信都是為了設(shè)備控制而開發(fā)的, 因此通過各種通信方法控制其他PLC 上的設(shè)備就像是直接在本PLC 下的設(shè)備控制一樣方便, 但是這種通信方式對(duì)于“事務(wù)型”數(shù)據(jù)的通信就存在一些問題,主要表現(xiàn)在接口與數(shù)據(jù)耦合、“鎖死”式通信等。本文提出在該通信協(xié)議的基礎(chǔ)上開發(fā)一種高層協(xié)議, 解決接口與數(shù)據(jù)耦合問題、PLC 中數(shù)據(jù)對(duì)象的封裝等問題,并且使得通信除了具備數(shù)據(jù)交換的功能外還可以啟動(dòng)對(duì)應(yīng)PLC 中的某些過程,拓展了接口的功能和能力。本文中的“事務(wù)”型信息指的是不同于設(shè)備的控制信號(hào)和狀態(tài)信號(hào), 比如生產(chǎn)線中的線上正在生產(chǎn)的產(chǎn)品的牌號(hào)和批次信息, 這些類型的信息一般在不同的PLC 和設(shè)備中均需要處理和存貯,但是整條線的該信息最好是存在一個(gè)共同的位置,通信有的時(shí)候并不是僅僅傳遞一些信息, 還希望通信方按照已經(jīng)商定的協(xié)議作出某種復(fù)雜的動(dòng)作, 本文提供了一種解決如上問題的改進(jìn)通信機(jī)制。