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