如何提高自動(dòng)抄表系統(tǒng)上位機(jī)軟件可靠性解析方案
本文針對(duì)自動(dòng)抄表系統(tǒng)結(jié)構(gòu),通過(guò)一系列方法來(lái)提高上位機(jī)軟件的可靠性,從而協(xié)調(diào)和下位機(jī)(硬件)數(shù)據(jù)及命令的交互。上位機(jī)采用Visual Basic 6.0編程工具,采用MSComm控件實(shí)現(xiàn)與通訊控制器的通訊。
本文引用地址:http://www.ex-cimer.com/article/190270.htm1幀格式的設(shè)計(jì)
要保證數(shù)據(jù)的正確性和可靠性,必須設(shè)計(jì)一種盡可能避免錯(cuò)誤出現(xiàn)的幀格式,我們以01H作為幀起始碼(SOH),以04H作為幀結(jié)束碼(EOT)。在幀內(nèi)的數(shù)據(jù)中也有可能出現(xiàn)01H和04H,必須加以替換以區(qū)別幀頭和幀尾。文中以DLE+‘x’來(lái)代替SOH(01H),以DLE+‘y’來(lái)代替EOT(04H)。此時(shí)會(huì)出現(xiàn)一個(gè)問(wèn)題,即如何區(qū)分?jǐn)?shù)據(jù)區(qū)中的DLE與替換后出現(xiàn)的DL E;這就必須對(duì)數(shù)據(jù)DLE(10H)再進(jìn)行替換,以DEL+‘z’來(lái)替換DLE,此時(shí)所有情況的替換結(jié)束。這既能很容易識(shí)別出一幀數(shù)據(jù),又避免了因數(shù)據(jù)區(qū)中出現(xiàn)特殊字符而導(dǎo)致錯(cuò)誤數(shù)據(jù)的出現(xiàn),再結(jié)合奇偶校驗(yàn),從而進(jìn)一步保證了傳輸數(shù)據(jù)的可靠性。
對(duì)上位機(jī)發(fā)送的數(shù)據(jù),要先替換后校驗(yàn);而對(duì)于下位機(jī)傳上來(lái)的數(shù)據(jù),要先校驗(yàn)再反替換,這是為了保證上位機(jī)和下位機(jī)在通訊線路中都不出現(xiàn)特殊字符SOH、EOT和DLE而設(shè)計(jì)的規(guī)定。反替換流程相當(dāng)于替換流程的逆,在此就不再累述了。
2串口問(wèn)題
因?yàn)楸鞠到y(tǒng)的上位機(jī)是通過(guò)RS232轉(zhuǎn)RS485與下位機(jī)進(jìn)行通訊的。所以,串口通訊的可靠性直接關(guān)系到整個(gè)系統(tǒng)的可靠性。而串口的使用借助于Visual Basic 6.0中的MSComm控件。MSComm控件是通過(guò)OnComm事件來(lái)觸發(fā)的,觸發(fā)的時(shí)機(jī)由CommEvent的屬性Rthreshold決定。當(dāng)設(shè)定Rthreshold=1時(shí),即緩沖區(qū)每接受到1個(gè)字符就引發(fā)一次OnComm事件;當(dāng)設(shè)定Rthreshold=10時(shí),即緩沖區(qū)每接收到10個(gè)字符就引發(fā)一次OnComm事件。因考慮到前面的替換問(wèn)題,每一幀的長(zhǎng)度是無(wú)法預(yù)測(cè)的,但根據(jù)通訊規(guī)程可以知道最短幀的長(zhǎng)度。我們采用最少數(shù)據(jù)長(zhǎng)度(沒(méi)有任何替換)作為Rthreshold的值。這雖然可以保證對(duì)上傳數(shù)據(jù)的及時(shí)響應(yīng)但無(wú)法保證獲得一個(gè)完整的幀。當(dāng)使用此語(yǔ)句讀串口時(shí)若接收的數(shù)據(jù)沒(méi)經(jīng)過(guò)任何替換則可接收到完整一幀,否則數(shù)據(jù)幀不全。解決的方法是在讀串口前加延時(shí)以保證讀入數(shù)據(jù)完全,至于延時(shí)的處理不建議用循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn),這將增加調(diào)試的難度,最好的方法是調(diào)用API函數(shù)Sleep:
Sleep()中時(shí)間以毫秒作為最小時(shí)間單位,a值的選取必須通過(guò)多次調(diào)試才能獲得最佳效果。另外,為了防止MSComm控件串行通訊問(wèn)題,在發(fā)送讀串口命令時(shí)通過(guò)啟用定時(shí)器處理程序來(lái)捕獲串口通訊異常。這些方法可以最大程度的減少因通訊方面的問(wèn)題而引發(fā)的錯(cuò)誤。
3整體抄表問(wèn)題
自動(dòng)抄表系統(tǒng)的優(yōu)點(diǎn)在于它既可以對(duì)單一用戶又可以對(duì)所有用戶的水、電、氣三表進(jìn)行讀數(shù)而不需人工干預(yù)。單一抄表比較簡(jiǎn)單;但在整體抄表過(guò)程中會(huì)出現(xiàn)因連續(xù)、快速的讀數(shù)導(dǎo)致硬件的采集速度與上位機(jī)的讀數(shù)速度不匹配,或因串口事件處理函數(shù)未結(jié)束而又有事件觸發(fā),或線路干擾等一系列問(wèn)題,這些因素都會(huì)影響到整體抄表的穩(wěn)定性和正確率。由于整體讀數(shù)的復(fù)雜性,僅通過(guò)增加錯(cuò)誤處理程序往往無(wú)法達(dá)到預(yù)期效果。對(duì)于本系統(tǒng),筆者通過(guò)不斷實(shí)踐發(fā)現(xiàn),在整體讀數(shù)程序中引入第二個(gè)延時(shí)和重復(fù)讀數(shù)功能可以大大提高整體讀數(shù)的正確率。
在發(fā)出讀數(shù)命令并正確讀到數(shù)據(jù)后,必須進(jìn)行短暫的延時(shí),然后再讀下一戶,再延時(shí),以此類推直到全部讀完。當(dāng)對(duì)一戶讀數(shù)出錯(cuò)時(shí),要重復(fù)對(duì)其讀數(shù)幾次,若正確再讀下一戶,否則先調(diào)錯(cuò)誤處理函數(shù),再讀下一戶。注意:錯(cuò)誤數(shù)據(jù)不能寫入數(shù)據(jù)庫(kù),以防結(jié)算時(shí)產(chǎn)生問(wèn)題。延時(shí)的引入盡管會(huì)對(duì)整體抄表的速度造成一定影響,但考慮到系統(tǒng)的整體性能,以損失一定速度來(lái)?yè)Q取準(zhǔn)確性這在絕大多數(shù)自動(dòng)抄表系統(tǒng)中是可以接受的。在整體抄表過(guò)程中,“延時(shí)”具有關(guān)鍵的作用,它不但協(xié)調(diào)了軟件和硬件之間的問(wèn)題,也協(xié)調(diào)了軟件自身的問(wèn)題。
通過(guò)上述方法,使得整個(gè)系統(tǒng)從細(xì)節(jié)到整體上都加強(qiáng)了抄表系統(tǒng)的可靠性和對(duì) 大多數(shù)錯(cuò)誤情況的避免和處理,從而保證了自動(dòng)抄表系統(tǒng)高性能和高可靠性的要求,這種方 法在實(shí)際應(yīng)用中收到了良好的效果。
評(píng)論