基于Modbus協(xié)議的智能壓力傳感器研發(fā)
(3)modbus協(xié)議規(guī)定,當設備使用rtu模式通信時,整個報文幀必須以連續(xù)的字符流發(fā)送。報文幀由時長至少為3.5個字符時間的空閑間隔區(qū)分。如果兩個字符之間的空閑間隔大于1.5個字符時間,則報文幀被認為不完整應該被接收節(jié)點丟棄。而在實際通信過程中由于每幀消息不定長,所以程序中最主要的問題是如何找到modbus消息幀的開始和結束時間點,并且要滿足兩個字符之間的空閑間隔和兩個報文幀之間的空閑間隔。程序的解決方法:接收采用中斷方式并采用了可重復觸發(fā)的可編程單穩(wěn)方式進行處理,在利用modbus協(xié)議通信時保證了實時性接收。
(4)對于報文發(fā)錯問題(即不符合要發(fā)送的報文),已用crc校驗程序對其處理。對于發(fā)送不符合要求的傳感器地址、功能代碼、數(shù)據(jù)、從機設備故障、從機設備忙碌、超時等問題,通過發(fā)送不正常響應信息來進行處理。而且上位機也編寫了相應的程序代碼。
(5) 對于零漂、溫漂的補償以及線性化的問題,通過軟件進行補償處理的。實驗證明,系統(tǒng)精度可以控制在千分之五之內。
4.2上位機通信程序的編寫
圖2 modbus串口協(xié)議通信界面
上位機串口通信是采用 visual basic語言編寫,visual basic提供了面向對象的可視化編程工具。開發(fā)人員只需按設計要求在屏幕上“畫”出所需的用戶界面來,并設置這些對象的屬性,不必為用戶界面設計而編寫大量的程序代碼[7]。相對于傳統(tǒng)編程語言,visual basic最突出的特點是事件驅動編程機制。每個事件都能驅動一段程序的運行。程序員只需編寫響應用戶動作的代碼,各個動作之間不一定有聯(lián)系,這樣的程序一般較短,且易于編寫和維護。在visual basic中為了完成串行通信,使用了mscomm控件,它可實現(xiàn)對串口的數(shù)據(jù)發(fā)送和接收。為了實現(xiàn)自動發(fā)送功能,還用到了timer控件。這兩個控件在程序運行時都是不可見的[8][9],在設計時把它們放在窗體的右上角即可。圖3為modbus串口協(xié)議通信界面。此串口通信主要完成的功能:
(1)搜索傳感器配置信息:當用戶在用此傳感器時,可能不清楚掛接傳感器地址位置以及串口所使用的波特率,為此編寫了相應的程序方便用戶查詢。
(2)讀傳感器配置信息,包括地址、量程、增益、波特率、程序代碼、修正系數(shù)、功能代碼等。此部分根據(jù)modbus功能碼03編寫,嚴格按照rtu幀格式編寫。
(3)寫傳感器配置信息。用戶可以根據(jù)自己的要求,更改地址、量程、增益、波特率、程序代碼、修正系數(shù)、功能代碼等。此部分是根據(jù)根據(jù)modbus功能碼06或16編寫。
(4) 采集傳感器工作狀態(tài)。包括傳感器壓力、供電電壓、環(huán)境溫度、零漂、故障信息等。
modbus串口協(xié)議通信界面如圖2所示。
部分程序如下:
private sub timer1_timer()
if star_find = true then `如果有啟動搜索命令標志
area_num = area_num + 1
mscomm1.outbuffercount = 0
if area_num >= 248 then `如果現(xiàn)波特率下超出下位機地址范圍,則地址清零,重新?lián)Q波特率搜索
area_num = 0
timer1.enabled = false
ll= msgbox("該波特率下無法搜索到下位機地址,請改變波特率!", vbok, "提示")
end if
call start_find `開端口,將搜索命令發(fā)給下位機,并確定mscomm1.rthreshold屬性
end if
if star_read = true then `如果有啟動讀命令標志
call start_read `開端口,將讀命令發(fā)給下位機,并確定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 `開端口,將讀命令發(fā)給下位機,并確定mscomm1.rthreshold屬性
end if
end sub
4.3 編程時應注意以下幾個問題
(1) 下位機從應答到發(fā)送數(shù)據(jù)并返回回應消息有一定的時間間隔,程序已根據(jù)不同波特率對其進行設定。保證對下位機的信息正確讀取。
(2) 在搜索傳感器配置信息時,若搜索不到,要有提示通信出錯信息,不能無限時間搜索。
(3) 每一次的傳輸是0-255之間的數(shù)據(jù),必須把inputmode屬性設置為1(默認為0),表示以二進制格式取回數(shù)據(jù)。否則當設置為0時,超過128的部分會被當成雙字節(jié)文字處理,結果出現(xiàn)錯誤。
5 結束語
利用上述的軟硬件設計方法,通過 vb6.0的mscomm控件可以做到基于modbus通信協(xié)議的上位機與下位機的相互通信。該方法編程簡單、實用,運行穩(wěn)定可靠,操作簡便易行,通用性強,同時降低了開發(fā)成本,很好的滿足了工業(yè)現(xiàn)場的要求。
評論