天天看點

我的Modbus Slave/Client開發曆程(Rtu/AscII/Tcp)

其實很早就想寫寫關于Modbus的開發曆程,但牽扯項目較多,不同語言版本較多,頭緒繁雜,一時不知從何寫起。最近的醫療項目的通信部分,重新調整為Modbus協定,并且内容幾乎涵蓋了Modbus的方方面面(Rtu/Tcp,Slave/Client相關開發),是以更堅定了寫Modbus信心,今天忙裡偷閑,以時間為序,以項目為綱,把Modbus相關開發經曆一一道來。

一、焦爐四大車通信系統(2002~2005)

硬體平台:西門子PLC200

作業系統:Win2000/XP

1、  主PLC與PC機的通信

最早主PLC與PC機通信,采用自定義的協定,主PLC中做了一個類似木馬的程式來響應PC機下發的讀寫V變量區的指令。這樣就完成了PLC的讀寫操作。

後來西門子PLC的開發軟體進行了更新,提供了Modbus Rtu Slave庫,這樣隻要上位機實作Modbus Rtu Client就可以直接讀寫PLC變量區了,之後用VB開發了Modbus相應的元件,這樣很長一段内,該系統PC與主PLC就采用了Modbus的通信。

前兩年開發組态軟體,是以西門子PPI協定順禮成章也就知道了,當然PC與西門子采用PPI協定是最棒的,因為PLC中不需要寫一行代碼,也無需占用程式和變量空間。是以之後Modbus被放棄了,轉而采用了PPI通信協定。

2、  主PLC與從PLC的通信(無線電台通信)

剛開始主PLC與從PLC采用自定義協定,最早在首鋼做實驗的時候,隻有四個從站,并且個數是唯一确定的,是以自定義協定用的很好,效率也很高;但是項目推廣後,在其它現場有7個從站的,也有8個,9個的,不确定,并且從站要分組,此外通信傳遞内容也更多了,不光位置資訊、推焦電流、推焦、平煤信号、連鎖信号都要傳遞,最後選擇了Modbus協定。

但是使用Modbus有幾個問題,第一西門子提供的Modbus Slave不支援廣播指令,第二隻提供了Modbus Slave程式,從PLC沒有什麼問題,但是主PLC卻沒有Modbus Client程式。

對第一個問題,沒有辦法,不支援就算了,隻要一個個來寫。(注:後來的某一天,西門子MicroWIN開發環境突然出bug了,竟然看到了部分的西門子Modbus Slave源碼,我在此基礎上實作了可支援廣播的Modbus Slave代碼)。

對第二個問題,隻好老老實實的用西門子 PLC 語句表指令開發Modbus Client,隻要實作3号和16号指令就可以了,還好,Modbus Client本身協定不難,難在PLC的運作機制和PC程式不同,PLC是大循環掃描的,等待資料傳回時,不能直接等待,否則運作看門狗會逾時,總之克服重重困難,終于開發出穩定可靠的Modbus Client程式,直到現在,現場的PLC通信仍采用該方式。

附記:有人會問,為什麼沒有采用PPI協定,PLC本身就支援主和從協定啊?但太讓人遺憾的是,PPI協定通信節奏太快,目前還沒有無線電台(普通工業用)可以正常實作PPI協定通信。

該焦爐四大機車相關介紹,可以參見我以前寫的文章:

<a href="http://www.gongkong.com/tech/example/detail_1.asp?id=4055">http://www.gongkong.com/tech/example/detail_1.asp?id=4055</a>

相關專利

<a href="http://www.cpsfu.com/C10B/2003/1456635.shtml">http://www.cpsfu.com/C10B/2003/1456635.shtml</a>

我開發的Modbus控件介紹

<a href="http://blog.csdn.net/yefanqiu/archive/2005/11/20/533315.aspx">http://blog.csdn.net/yefanqiu/archive/2005/11/20/533315.aspx</a>

我開發的PPI控件介紹

<a href="http://blog.csdn.net/yefanqiu/archive/2005/11/18/532256.aspx">http://blog.csdn.net/yefanqiu/archive/2005/11/18/532256.aspx</a>

二、AB PLC擴充子產品ProSoft MVI56通信子產品(2005年11月)

在做濟鋼四車項目的時候,由于PLC采用的是AB RsLogix5000系列的PLC,上面的端口不支援自由口程式設計,無法讀取我們定位标尺的資料,是以購買了與其合作的ProSoft公司專門生産第三方子產品。ProSoft生産的子產品有很多種,由于沒有經驗,很不幸,我們選擇的是MVI56的子產品,而這個子產品卻是全部自由程式設計,不含有任何預設協定。

該子產品典型的就是一個嵌入式系統,相當一個帶三個序列槽的386的電腦,作業系統為小型的DOS系統(TINY DOS),用C++為其開發程式。

在開發完我們的紅外定位标尺的讀取程式後,順便也開發一個Modbus Rtu Client的程式,這樣AB的PLC可以直接和Modbus 的裝置進行通信了。

相關文章,請參見我以前寫的文章:

http://blog.csdn.net/yefanqiu/archive/2005/11/20/533440.aspx

三、隧道廣告影像系統(2004~2006)

隧道廣告影像系統的通信系統,采用12個通信子站(NetBoxII),剛開始并沒有任何Modbus協定,直到有一天,客戶提出要控制節目播放的次序、次數和播放時間,最後決定在地鐵隧道裡,添加一個西門子PLC200系統,由于裝置早已安裝完成,不可能為PLC布一個五六百米的通信線路,隻好利用原通信線路,而最上層的通信為TCP,NetBoxII下一層才是485總線,是以NetBoxII當仁不讓的成了通信橋的裝置。

但是,問題來了,上位機PC如何通過TCP與基于485的PLC進行通信?

最後,決定西門子PLC中安裝Modbus Rtu Slave程式,實作一個标準Modbus裝置,NetBoxII實作 Modbus Tcp到Modbus Rtu的協定轉換。也就是說,在NetBoxII中實作Modbus Tcp Slave和Modbus Rtu Client代碼。

這樣用BC3.0,DOS平台下實作了Modbus Tcp/Rtu協定轉換功能,實作了上位機PC與PLC的通信的要求。

隧道廣告的相關介紹,可以參見我以前寫的文章:

<a href="http://blog.csdn.net/yefanqiu/archive/2006/08/16/1074382.aspx">http://blog.csdn.net/yefanqiu/archive/2006/08/16/1074382.aspx</a>

四、嵌入式組态系統(2006年1月~至今)

開發組态系統,自然而然的要實作各種通信協定的驅動,是以Modbus 協定的開發不在話下。

分别用EVC和VC實作了Modbus Rtu/AscII/Tcp的Client通信協定驅動。

嵌入式組态系統的相關介紹,可以參見我以前寫的文章:

<a href="http://blog.csdn.net/yefanqiu/archive/2006/11/29/1419479.aspx">http://blog.csdn.net/yefanqiu/archive/2006/11/29/1419479.aspx</a>

<a href="http://blog.csdn.net/yefanqiu/archive/2006/11/19/1396827.aspx">http://blog.csdn.net/yefanqiu/archive/2006/11/19/1396827.aspx</a>

<a href="http://blog.csdn.net/yefanqiu/archive/2006/10/24/1348840.aspx">http://blog.csdn.net/yefanqiu/archive/2006/10/24/1348840.aspx</a>

五、LED影像系統(2006年12月~至今)

目前關于通信這塊代碼還沒有做,不過已決定用C#開發Modbus Rtu Client程式和單片機開發的硬體裝置進行通信(單片機中實作Modbus Rtu Slave,這部分有專門的硬體工程師實作),通過Modbus的通信實作LED大屏各種參數的配置。

LED系統相關介紹

<a href="http://blog.csdn.net/yefanqiu/archive/2007/05/28/1627782.aspx">http://blog.csdn.net/yefanqiu/archive/2007/05/28/1627782.aspx</a>

六、醫療系統(2007年6月~至今)

目前這部分正在做,除紅外通信闆的Modbus Rtu Slave用彙編實作外,其它的都用C#語言實作。

七、Modbus Rtu 通信協定(3,16号指令)

1、 讀取保持寄存器(單個和多個,以字為最小機關)

發送指令幀:

裝置位址

功能碼

位址H

位址L

資料量H

資料量L

CRC H

CRC L

Addr0

3 H

HoldStart

DataNum

CRC高位

CRC低位

幀 長 度:8個位元組

裝置位址:1~247

功 能 碼:3H

資料位址:0~65535   具體範圍與相關裝置有關         

數    量:1~65535   具體範圍與相關裝置有關

校 驗 碼:CRC16校驗

傳回指令幀:

資料量

資料1

資料N

Addr1

傳回資料的位元組數N

Data (1~N)

幀 長 度:5+N 個位元組

數 據 量:實際的讀取資料數量         

數    據:傳回資料的意義

a=HoldStart

n= DataNum-1

VW a (VB a)

VWa(VB a+1)

VW a+n(VB a+n)

VWa+n(VB a+n+1)

Data(1)

Data(2)

Data(N-1)

Data(N)

指令有誤:

1)        沒有任何傳回

2)        傳回異議幀

錯誤資訊

83 H

一個位元組的錯誤資訊

2、 設定保持寄存器(多個,以字為最小機關)

資料位元組數

具體

資料

10 H

bytN

1~bytN

幀 長 度:9+bytN 個位元組

功 能 碼:10H

資料位址:0~65535   具體範圍與相關裝置有關       

數    量:1~122     具體範圍與相關裝置有關

字 節 數:設定的位元組個數 bytN= DataNum×2

數    據:具體的位元組資料

幀 長 度:8 個位元組

資料位址:0~65535   具體範圍與相關裝置有關    

1)    沒有任何傳回

2)      傳回異議幀

位址

90 H

八、一點總結

編寫通信相關的程式,其實協定和開發語言并不重要,重要的是對通信雙方的通信裝置的特點,性能要有充分了解,這樣才能開發出可靠,高效的通信程式。

繼續閱讀