<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 基于Modbus協(xié)議實(shí)現單片機與PLC之間的通訊

基于Modbus協(xié)議實(shí)現單片機與PLC之間的通訊

——
作者: 時(shí)間:2007-08-16 來(lái)源:嵌入式在線(xiàn) 收藏
1 引言

  (人機界面)以其體積小,高性能,強實(shí)時(shí)等特點(diǎn),越來(lái)越多的應用于工業(yè)自動(dòng)化系統和設備中。它有字母、漢字、圖形和圖片等不同的顯示,界面簡(jiǎn)單友好。配有長(cháng)壽命的薄膜按鈕鍵盤(pán),操作簡(jiǎn)單。它一般采用具有集成度高、速度快、高可靠且價(jià)格低等優(yōu)點(diǎn)的單片機[1]作為其核心控制器,以實(shí)現實(shí)時(shí)快速處理。 和單片機結合不僅可以提 的數據處理能力,還可以給用戶(hù)帶來(lái)友好簡(jiǎn)潔的界面。本文以 協(xié)議為例,詳細討論了一個(gè)人機系統中,如何用C51實(shí)現單片機和之間的實(shí)例。

  2 協(xié)議[4]

  協(xié)議是應用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由和其它設備之間可以。

  Modbus協(xié)議提供了主—從原則,即僅一設備(主設備)能初始化傳輸(查詢(xún))。其它設備(從設備)根據主設備查詢(xún)提供的數據作出相應反應。主設備查詢(xún)的格式:設備地址(或廣播,此時(shí)不需要回應)、功能代碼、所有要發(fā)送的數據、和一錯誤檢測域。從設備回應消息包括確認地址、功能碼、任何要返回的數據、和一錯誤檢測域。如果在消息接收過(guò)程中發(fā)生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤消息并把它作為回應發(fā)送出去。

  控制器能設置為兩種傳輸模式:ASCII和 RTU,在同樣的波特率下,RTU可比ASCII方式傳送更多的數據,所以采用KTU模式。

  (1) 典型的RTU消息幀

  典型的RTU消息幀如表1所示。

典型的RTU消息幀

  RTU消息幀的地址域包含8bit??赡艿膹脑O備地址是0...127(十進(jìn)制)。其中地址0是用作廣播地址,以使所有的從設備都能認識。主設備通過(guò)將要聯(lián)絡(luò )的從設備的地址放入消息中的地址域來(lái)選通從設備。當從設備發(fā)送回應消息時(shí),它把自己的地址放入回應的地址域中,以便主設備知道是哪一個(gè)設備作出回應。

  RTU消息幀中的功能代碼域包含了8bits,當消息從主設備發(fā)往從設備時(shí),功能代碼域將告之從設備需要執行哪些行為;當從設備回應時(shí),它使用功能代碼域來(lái)指示是正?;貞?無(wú)誤)還是有某種錯誤發(fā)生(稱(chēng)作異議回應,一般是將功能碼的最高位由0改為1)。

  從主設備發(fā)給從設備消息的數據域包含附加的信息:從設備必須用于進(jìn)行執行由功能代碼所定義的行為。這包括了像不連續的寄存器地址,要處理項的數目,域中實(shí)際數據字節數。如果沒(méi)有錯誤發(fā)生,從從設備返回的數據域包含請求的數據。如果有錯誤發(fā)生,此域包含一異議代碼,主設備應用程序可以用來(lái)判斷采取下一步行動(dòng)。

  當選用RTU模式作字符幀時(shí),錯誤檢測域包含一16Bits值(用兩個(gè)8位的字符來(lái)實(shí)現)。錯誤檢測域的內容是通過(guò)對消息內容進(jìn)行循環(huán)冗長(cháng)檢測(CRC)方法得出的。CRC域附加在消息的最后,添加時(shí)先是低字節然后是高字節。

  (2) 所有的Modbus功能碼

  Modbus的功能碼定義如表2所示。

Modbus的功能碼定義

  3 常用功能通訊程序的設計[5]

  本文介紹了幾個(gè)Modbus常用功能程序的設計。筆者采用單片機作為主機,在單片機上編寫(xiě)程序實(shí)現單片機與PLC之間的通訊。由單片機向PLC發(fā)出命令信息,PLC自動(dòng)作出回應。PLC通過(guò)單片機的串行通訊口通訊,程序用C51實(shí)現。程序的子函數及其功能:

  (1) 串口初始化

  void ProtocolInit(void)

  函數功能:串口設置為異步通訊方式1(起始位1位,數據位8位,停止位1位);定時(shí)/計數器1設置為波特率發(fā)生器,通訊速率 9600bps;開(kāi)串行中斷,并把串行中斷設置為高優(yōu)先級。

  (2) CRC簡(jiǎn)單函數

  unsigned char Crc16(unsigned char *puchMsg, unsigned char usDataLen)

  函數功能:先調入一值是全“1”的16位寄存器,然后調用一過(guò)程將消息中連續的8位字節各當前寄存器中的值進(jìn)行處理。每個(gè)8位字符都單獨和寄存器內容相或 (OR),結果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進(jìn)行。整個(gè)過(guò)程要重復8次。在最后一位(第8位)完成后,下一個(gè)8位字節又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的字節都執行之后的 CRC值。

  (3) 初始化變量

  void Initvar(void)

  函數功能:初始化所有過(guò)程變量。

    (4) 串行中斷服務(wù)程序

  void ProtocolSerialProcess(void) interrupt 4 using 2

  函數功能:發(fā)送中斷發(fā)送主機形成的命令數組,發(fā)送完后置標志位;接收中斷接收PLC返回的響應數組,存入接收數組,并置標志位,且假設響應正確,留待主機處理。

  (5) 讀N個(gè)位變量(線(xiàn)圈)

  void ProtocolRead_bit(unsigned char DeviceAddr/* PLC局號*/, unsigned char RegType/*寄存器類(lèi)型*/, unsigned int BitAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int BitNum/*位數*/)

  函數功能:根據函數參數,形成讀N個(gè)位變量的命令數組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數組:正確,保存讀取的數據;錯誤,重新發(fā)送。

  (6) 寫(xiě)一個(gè)位變量

  void ProtocolSetBit(unsigned char DeviceAddr/* PLC局號*/, unsigned char RegType/*寄存器類(lèi)型*/, unsigned int BitAddr/*地址*/, unsigned char SubAddr/*子地址*/, unsigned i

nt ClrSet/*寫(xiě)值“1”或“0”*/)

  函數功能:根據函數參數,形成置某位變量為“1”或“0”的命令數組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數組:正確,返回;錯誤,重新發(fā)送。

  (7) 讀N個(gè)字節變量

  void ProtocolReadByte(unsigned char DeviceAddr/* PLC局號*/, unsigned char RegType/*寄存器類(lèi)型*/, unsigned int RegAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int RegNum/*個(gè)數*/)

  函數功能:根據函數參數,形成讀N個(gè)字節變量的命令數組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數組:正確,保存讀取的數據;錯誤,重新發(fā)送。

  (8) 寫(xiě)N個(gè)字節變量

  void ProtocolSetByte(unsigned char DeviceAddr/* PLC局號*/, unsigned char RegType/*寄存器類(lèi)型*/, unsigned int RegAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int RegNum/*個(gè)數*/)

  函數功能:根據函數參數,形成寫(xiě)N個(gè)字變量的命令數組(要寫(xiě)的數從某參數數組中讀取),啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數組:正確,返回;錯誤,重新發(fā)送。

  4 結束語(yǔ)

  以上的程序已經(jīng)通過(guò)實(shí)驗,并應用于實(shí)際的人機系統中。依照類(lèi)似的方法,可以編寫(xiě)其他不同功能的程序,實(shí)現對PLC的不同控制和操作。利用單片機和PLC進(jìn)行優(yōu)勢互補,可以組成化、智能化的系統。另外整個(gè)單片機系統程序用C51語(yǔ)言編程,程序簡(jiǎn)潔,便于閱讀與調試。單片機和人機界面結合可以實(shí)時(shí)的顯示PLC的工作狀況,實(shí)時(shí)的控制、設置、調整PLC工作情況,提高的自動(dòng)化程度和實(shí)時(shí)性。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>