摘  要:本文主要介紹Modbus RTU規約,及在VB6.0編程環境下通過RS-485串口實現主控臺PC機與智能儀表間基與該規約通信的具體實現方法。
   關鍵詞:Modbus RTU;通信協議;RS-485;CRC校驗 
一、引言
    隨著時代">

      技術頻道

      基于Modbus規約的智能儀表與PC機通信技術實現

      摘 要:本文主要介紹Modbus RTU規約,及在VB6.0編程環境下通過RS-485串口實現主控臺PC機與智能儀表間基與該規約通信的具體實現方法。
      關鍵詞:Modbus RTU;通信協議;RS-485;CRC校驗
      一、引言
      隨著時代的進步,越來越多的企業開始向生產和管理自動化轉變。各種智能儀表不斷地應用到生產生活的各個領域。在工業控制方面,RS-485總線由于平衡差分傳輸特性具有的干擾性好、傳輸距離遠 、有較大級連能力等特點,非常適合于組成工業級的多機通信系統。ModBus RTU規約是Modicon公司的注冊商標,是目前國際智能化儀表普遍采用的主流通訊協議之一。在各個工業儀器儀表大量使用的今天,Modbus RTU協議和RS-485總線得到了最為廣泛的應用。本文主要從應用的角度介紹在一個工業控制系統中,實現該技術的具體方案。
      二、Modbus RTU 通訊協議簡介
      1、Modbus RTU協議簡介
      ModBus RTU通訊協議是Modicon公司的注冊商標。采用主從問答方式工作,其規范已在國際互聯網上公布,是目前國際智能化儀表普遍采用的主流通訊協議之一。目前,國內許多生產商已在他們的產品和系統中遵循該協議標準。該協議有兩種傳輸模式即RTU模式和ASCII模式。其中RTU模式信息幀中的8位數據包括兩個4位16進制字符,相對于ASCII模式,RTU模式表達相同的信息需要較少的位數,且在相同通訊速率下具有更大的數據流量。因此通常情況下,一般工業智能儀器儀表都是采用RTU模式的Modbus規約。
      2、Modbus 通信格式
      數據格式: 地址碼 功能碼 數據區 錯誤校檢

       
      數據長度: 1字節 1字節 N字節 16位CRC碼

      當通訊命令由發送設備(上位機)發送至接收設備(下位機)時,符合相應地址碼的下位機就會響應命令,并根據約定的通信協議讀取信息、數據校驗并且執行相應的功能操作。返回的幀結構包含地址碼、功能碼、數據以及CRC校驗碼。
      3、上下位機通信幀約定格式
      其中的儀表地址在使用的電壓表中是為一個字節定義的,所以最多到256個。下位機與上位機的通信波特率一般可自由設定,但必須保證上下機的通信波特率對應匹配。
      三、上位機通信軟件設計方案
      上位機的通信軟件采用VB6.0的開發環境。在VB6.0中對串口進行編程可以使用Mscomm控件加快開發進度。該控件主要是為RS-232的通用串口而設計。所以為了利用PC上現有的RS-232接口,通常是使用RS232/485的轉換器。這些轉換器一般通過邏輯門電路控制RXD、TXD和GND三針信號,從而自動對半雙工或全雙工的485串口進行控制。通過轉換器,我們就可以像開發通用的RS-232串口一樣來快速開發基于RS-485串口的上位機通信軟件。
      1、初始化程序設計
      在初始化程序中,主要是設定好整個幀結構的命令數組、傳輸波特率、以及一些必須的串口初始設定。具體
      操作如下面代碼說明
      Dim Tcommand(7) As Byte ‘開辟命令幀的幀長度數組
      MSComm.CommPort = 1 ‘設定需要使用的串口,當然這里可以用輸入方式靈活設定。暫定為1#口
      MSComm.Settings="2400,n,8,1" ‘設定傳輸的波特率和校驗方式
      MSComm.InBufferSize = 1024 ‘開辟數據緩沖區
      MSComm.InputMode =comInputModeBinary ‘設定為二進制的數據流方式
      MSComm.InputLen = 0 ‘一次全部讀入所需要的數據
      ……

      上面的代碼一般都是串口初始化必須進行設定的幾個部分。根據個人需要可以在VB6.0中做一個初始化界面,對各個參數(如波特率、使用串口等)進行自由設定和更改,以提高初始化設定的靈活性和通用性。
      2、命令字發送
      命令字發送應該嚴格按照Modbus規約所設計的幀格式和上下位機在該規約基礎上所定義的通信協議。參考表1的通信協議順序,編寫如下的VB代碼來實現命令的發送。
      Tcommand (0) = address ‘ address為設定的接受地址輸入的變量
      Tcommand (1) = Val("&h" + "03")
      ……(其他的通信協議,并計算CRC校驗代碼)
      Tcommand (6) = CRC(1)
      Tcommand (7) = CRC(0)
      frmcontrol.MSComm.Output = Tcommand
      ……

      3、上位機接收和數據處理
      根據表2的回送通信協議,上位機解析所接受的數據,并進行必要的處理。一般而言從下位機發送上來的數據都是有一定的幀長度。特別是對于一些固化好的智能儀表。所以最好的方法是按照通信回送的幀長度,在上位機程序中分別開辟兩個同樣長度的數組。一個作為接受數組,用來一次性接收串口緩沖區中的數據;另一個為安全數組,用來復制接收數組中的數據并進行解析。這樣可以提高整個系統的容錯能力。
      LoopUntil frmcontrol.MSComm.InBufferCount = 9
      InByte = frmcontrol.MSComm.Input
      For i = 0 To (count - 1)
      InSafeArray(i) = InByte(i)
      Next i

      其代碼中的inbyte()就是接收數組,而InSafeArray()就是我們再開辟的安全數組。
      4、CRC校驗的實現方法
      按照Modbus規約的校驗方式,RTU模式的校驗方式為CRC校驗方式;而ASCII模式為LRC校驗。一般的智能儀表多采用RTU的CRC校驗方式。根據生成多項式的不同,CRC校驗通常有以下幾種:CRC-12 (傳6bit);CRC-16(美國標準,傳8bit);CRC-CCITT(歐洲標準,傳8bit);CRC-32(point-to-point同步傳輸中使用) 。目前儀表類比較普遍的是CRC-16的校驗碼。其生成多項式為X16+X15+X2+1。在算法實現上,我們可以先預置一個16位的寄存器FFFF(全1),然后把8位的2進制數據(一個字節)與16位的CRC寄存器低8位異或,并把結果放回CRC寄存器同時寄存器內容右移,MSB補0,并檢查移出的LSB。如果LSB為0則繼續右移動,為1則CRC寄存器與多項式異或。重復上面操作到一個8bit字節完成,再繼續對下一個數據進行相同處理,直到所有數據結束。這個時候CRC寄存器中的數據就是我們所要的CRC碼了。實現代碼如下:
      CRC16Lo = &HFF ‘CRC16Lo為CRC寄存器低8位
      CRC16Hi = &HFF ‘CRC16Hi為CRC寄存器高8位
      CL = &H1
      CH = &HA0 ‘A001 H 是CRC-16多項式代碼
      For i = 0 To UBound(Data)
      CRC16Lo = CRC16Lo Xor Data(i) ‘每一個數據與CRC寄存器異或
      For index = 0 To 7
      UseHi = CRC16Hi
      UseLo = CRC16Lo
      CRC16Hi = CRC16Hi \ 2
      CRC16Lo = CRC16Lo \ 2 ‘右移一位
      If ((UseHi And &H1) = &H1) Then ‘如果高位字節最后一位是1的話
      CRC16Lo = CRC16Lo Or &H80 ‘低位字節右移后前面補1
      End If
      If ((UseLo And &H1) = &H1) Then ‘'如果LSB 為1,則與多項式進行異或
      CRC16Hi = CRC16Hi Xor CH
      CRC16Lo = CRC16Lo Xor CL
      End If
      Next index
      Next i

      四、下位機工作系統設計簡介
      下位機一般是使用固化好通信協議及工作指令的單片機。因為測控系統多采用的是單發多收的通信機制,所以在下位機要允許用戶預先設定本機的地址碼,并且保證不能重復。此外,要注意通信波特率必須與上位機的波特率相匹配。在下位機軟件開發中,要遵循Modbus規約的通信幀結構對上位機傳輸的命令進行解析:非呼叫對象應能及時重新恢復等待接受狀態;響應呼叫的下位機要解析命令代碼并進行相應的功能處理,對非法的命令操作要能回送報錯信息。
      在具體的工程開發中,下位機多是采用各個廠家出品的基與Modbus規約的智能儀表。這樣雖然簡化了我們開發的工作量,但是下位機的合理安排與設計能降低系統誤碼率、提高可靠性。因此是每個工業系統設計人員所不應該忽略的重要部分。在工業控制中,因為各種干擾源的存在且一般下位機數量較大,要對RS-485芯片選型有很認真的考慮。條件許可的話盡量選用抗電擊和有較大級連驅動能力的芯片。理論上485芯片的級連能力至少32門,目前很多芯片廠家都能使工業級的級連數達到128以上。在實際應用中應該讓系統具有一定的富余度,一般級連數不能超過該器件滿載的70%。在選配RS232到RS485轉換頭的時候也應該盡量選用有源的轉換器,以提高驅動能力和穩定性。此外,工業現場的降噪、隔離、布線、屏蔽等等措施的合理與否也會對最后系統的穩定產生影響。
      五、結束語
      作者在實際的測控系統項目開發中,通過VB6.0結合SQL數據庫編程,開發了基于該通信協議的上位機的測控管理軟件,并利用RS-485總線實現了對基于該規約的各種下位機的監控和數據處理。在生產活動自動化,通信協議規范化,信息交流國際化的今天,充分利用現有的成熟而規范的通信協議能最大限度地節約開發成本,降低開發風險,提高系統的兼容性和可移植性。Modbus RTU規約作為智能儀器儀表領域大量使用的國際化通信協議,必將得到更加普遍的推廣和應用。

      文章版權歸西部工控xbgk所有,未經許可不得轉載。

      主站蜘蛛池模板: 无码少妇丰满熟妇一区二区| 亚洲综合无码AV一区二区| 国产精品乱码一区二区三区| 无码少妇精品一区二区免费动态| 亚洲一区二区三区写真| 一区二区乱子伦在线播放| 无码精品一区二区三区| 日韩精品一区二区三区大桥未久| 在线视频国产一区| 久久久国产精品无码一区二区三区| 成人区精品一区二区不卡| 国产精品无码一区二区三区免费| 无码日韩精品一区二区三区免费| 国产精品毛片一区二区| 国产一区二区精品在线观看| 精品国产乱子伦一区二区三区| 亚洲一区二区三区自拍公司| www一区二区三区| 精品视频午夜一区二区| 国产成人精品一区二三区熟女| 无码人妻精品一区二区三区99性 | 日韩一区二区三区免费播放| 无码av人妻一区二区三区四区| 久久久精品人妻一区亚美研究所| 波多野结衣高清一区二区三区 | 日本免费一区二区三区| 无码少妇一区二区| 一区二区三区日韩精品| 久久久一区二区三区| 久久亚洲一区二区| 亚洲码一区二区三区| 精品国产一区二区三区麻豆| 亚洲一区二区三区久久久久| 91在线精品亚洲一区二区| 久久4k岛国高清一区二区| 日本一区二区在线播放| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 国产精品久久久久一区二区三区 | 亚洲色偷偷偷网站色偷一区| 亚洲无圣光一区二区| 中文字幕精品一区二区2021年 |