新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Modbus協議的智能壓力傳感器研發

        基于Modbus協議的智能壓力傳感器研發

        作者: 時間:2016-12-20 來源:網絡 收藏


          (3)modbus協議規定,當設備使用rtu模式通信時,整個報文幀必須以連續的字符流發送。報文幀由時長至少為3.5個字符時間的空閑間隔區分。如果兩個字符之間的空閑間隔大于1.5個字符時間,則報文幀被認為不完整應該被接收節點丟棄。而在實際通信過程中由于每幀消息不定長,所以程序中最主要的問題是如何找到modbus消息幀的開始和結束時間點,并且要滿足兩個字符之間的空閑間隔和兩個報文幀之間的空閑間隔。程序的解決方法:接收采用中斷方式并采用了可重復觸發的可編程單穩方式進行處理,在利用modbus協議通信時保證了實時性接收。

          (4)對于報文發錯問題(即不符合要發送的報文),已用crc校驗程序對其處理。對于發送不符合要求的傳感器地址、功能代碼、數據、從機設備故障、從機設備忙碌、超時等問題,通過發送不正常響應信息來進行處理。而且上位機也編寫了相應的程序代碼。

          (5) 對于零漂、溫漂的補償以及線性化的問題,通過軟件進行補償處理的。實驗證明,系統精度可以控制在千分之五之內。

          4.2上位機通信程序的編寫

        圖2 modbus串口協議通信界面

          上位機串口通信是采用 visual basic語言編寫,visual basic提供了面向對象的可視化編程工具。開發人員只需按設計要求在屏幕上“畫”出所需的用戶界面來,并設置這些對象的屬性,不必為用戶界面設計而編寫大量的程序代碼[7]。相對于傳統編程語言,visual basic最突出的特點是事件驅動編程機制。每個事件都能驅動一段程序的運行。程序員只需編寫響應用戶動作的代碼,各個動作之間不一定有聯系,這樣的程序一般較短,且易于編寫和維護。在visual basic中為了完成串行通信,使用了mscomm控件,它可實現對串口的數據發送和接收。為了實現自動發送功能,還用到了timer控件。這兩個控件在程序運行時都是不可見的[8][9],在設計時把它們放在窗體的右上角即可。圖3為modbus串口協議通信界面。此串口通信主要完成的功能:

          (1)搜索傳感器配置信息:當用戶在用此傳感器時,可能不清楚掛接傳感器地址位置以及串口所使用的波特率,為此編寫了相應的程序方便用戶查詢。

          (2)讀傳感器配置信息,包括地址、量程、增益、波特率、程序代碼、修正系數、功能代碼等。此部分根據modbus功能碼03編寫,嚴格按照rtu幀格式編寫。

          (3)寫傳感器配置信息。用戶可以根據自己的要求,更改地址、量程、增益、波特率、程序代碼、修正系數、功能代碼等。此部分是根據根據modbus功能碼06或16編寫。

          (4) 采集傳感器工作狀態。包括傳感器壓力、供電電壓、環境溫度、零漂、故障信息等。

          modbus串口協議通信界面如圖2所示。

          部分程序如下:

        private sub timer1_timer()
        if star_find = true then `如果有啟動搜索命令標志
        area_num = area_num + 1
        mscomm1.outbuffercount = 0
        if area_num >= 248 then `如果現波特率下超出下位機地址范圍,則地址清零,重新換波特率搜索
        area_num = 0
        timer1.enabled = false
        ll= msgbox("該波特率下無法搜索到下位機地址,請改變波特率!", vbok, "提示")
        end if
        call start_find `開端口,將搜索命令發給下位機,并確定mscomm1.rthreshold屬性
        end if
        if star_read = true then `如果有啟動讀命令標志
        call start_read `開端口,將讀命令發給下位機,并確定mscomm1.rthreshold屬性
        end if
        if star_write = true then `如果有啟動寫命令標志
        call start_write
        `開端口,將配置信息強置給下位機,并確定mscomm1.sthreshold屬性
        end if
        if star_acq = true then `如果有啟動采集命令標志
        if acq_end = true then `如果有結束采集命令標志
        timer1.enabled = false `關閉時鐘
        acq_end = false `清除結束采集命令標志
        end if
        call start_read `開端口,將讀命令發給下位機,并確定mscomm1.rthreshold屬性
        end if
        end sub

          4.3 編程時應注意以下幾個問題

          (1) 下位機從應答到發送數據并返回回應消息有一定的時間間隔,程序已根據不同波特率對其進行設定。保證對下位機的信息正確讀取。

          (2) 在搜索傳感器配置信息時,若搜索不到,要有提示通信出錯信息,不能無限時間搜索。

          (3) 每一次的傳輸是0-255之間的數據,必須把inputmode屬性設置為1(默認為0),表示以二進制格式取回數據。否則當設置為0時,超過128的部分會被當成雙字節文字處理,結果出現錯誤。

          5 結束語

          利用上述的軟硬件設計方法,通過 vb6.0的mscomm控件可以做到基于modbus通信協議的上位機與下位機的相互通信。該方法編程簡單、實用,運行穩定可靠,操作簡便易行,通用性強,同時降低了開發成本,很好的滿足了工業現場的要求。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 浦北县| 泸定县| 灵石县| 科技| 河池市| 宜章县| 迁西县| 灯塔市| 林周县| 视频| 禄劝| 兴城市| 河曲县| 遵化市| 商河县| 瓦房店市| 兴国县| 保定市| 汉源县| 鄢陵县| 通化县| 马关县| 龙游县| 涡阳县| 普兰县| 德化县| 独山县| 临西县| 紫金县| 白河县| 奉化市| 项城市| 久治县| 汾阳市| 许昌市| 潼南县| 甘谷县| 库尔勒市| 同江市| 启东市| 海林市|