<object id="ir2le"></object>
  • 加入收藏 在線留言 聯系我們
    關注微信
    手機掃一掃 立刻聯系商家
    全國服務熱線15267534595
    公司新聞
    Modbus協議實現單片機與PLC之間通訊
    發布時間: 2023-11-05 20:34 更新時間: 2024-12-27 09:10
    HMI(人機界面)以其體積小,高性能,強實時等特點,越來越多的應用于工業自動化系統和設備中。它有字母、漢字、圖形和圖片等不同的顯示,界面簡單友好。配有長壽命的薄膜按鈕鍵盤,操作簡單。它一般采用具有集成度高、速度快、高可靠且價格低等優點的單片機[1]作為其核心控制器,以實現實時快速處理。PLC和單片機結合不僅可以提PLC的數據處理能力,還可以給用戶帶來友好簡潔的界面。本文以Modbus通訊協議為例,詳細討論了一個人機系統中,如何用C51實現單片機和PLC之間通訊的實例。

    圖片

    2、Modbus通訊協議

    Modbus協議是應用于電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網絡和其它設備之間可以通信。

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

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

    (1)典型的RTU消息幀

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

    圖片

       

    TU消息幀的地址域包含8bit。可能的從設備地址是0...127(十進制)。其中地址0是用作廣播地址,以使所有的從設備都能認識。主設備通過將要聯絡的從設備的地址放入消息中的地址域來選通從設備。當從設備發送回應消息時,它把自己的地址放入回應的地址域中,以便主設備知道是哪一個設備作出回應。   

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

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

    當選用RTU模式作字符幀時,錯誤檢測域包含一16Bits值(用兩個8位的字符來實現)。錯誤檢測域的內容是通過對消息內容進行循環冗長檢測(CRC)方法得出的。CRC域附加在消息的Zui后,添加時先是低字節然后是高字節。

    (2)所有的Modbus功能碼

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

    圖片

    3、常用功能通訊程序的設計

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

    (1)串口初始化

    voidProtocolInit(void)

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

    unsignedcharCrc16(unsignedchar*puchMsg,unsignedcharusDataLen)

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

    (3)初始化變量

    voidInitvar(void)

    函數功能:初始化所有過程變量。

    (4)串行中斷服務程序

    voidProtocolSerialProcess(void)interrupt4using2

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

    (5)讀N個位變量(線圈)

    voidProtocolRead_bit(unsignedcharDeviceAddr/*PLC局號*/,unsignedcharRegType/*寄存器類型*/,unsignedintBitAddr/*起始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintBitNum/*位數*/)

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

    (6)寫一個位變量

    voidProtocolSetBit(unsignedcharDeviceAddr/*PLC局號*/,unsignedcharRegType/*寄存器類型*/,unsignedintBitAddr/*地址*/,unsignedcharSubAddr/*子地址*/,unsignedi

    ntClrSet/*寫值“1”或“0”*/)

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

    (7)讀N個字節變量

    voidProtocolReadByte(unsignedcharDeviceAddr/*PLC局號*/,unsignedcharRegType/*寄存器類型*/,unsignedintRegAddr/*起始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintRegNum/*個數*/)

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

    (8)寫N個字節變量

    voidProtocolSetByte(unsignedcharDeviceAddr/*PLC局號*/,unsignedcharRegType/*寄存器類型*/,unsignedintRegAddr/*起始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintRegNum/*個數*/)

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


    聯系方式

    • 電  話:18126392341
    • 聯系人:梁濤
    • 手  機:15267534595
    • 微  信:15267534595