合肥市巢湖水源廠低壓配電房安裝了7臺型號為CD194E-2S4型電力儀表,通過RS485口,用雙屏蔽通訊線將它們與上位機連接起來,上位機選用的是研華工控機。上位機的通信軟件采用VB6.0的開發環境。一般用VB開發串行通信程序有兩種方法:一是利用Windows的通信API函數;另一種是采用VB標準控件Mscomm來實現。利用API編寫串口通信程序較為復雜,需要掌握大量通信知識,其優點是可實現的功能更豐富、應用面更廣泛,更適合于編寫較為復雜的低層次通信程序。VB通信控件Mscomm提供了功能完善的串口數據的發送和接收功能,Mscomm控件具有兩種處理方式:
1、事件驅動方式:由Mscomm控件的OnComm事件捕獲并處理通信錯誤及事件;
2、查詢方式:通過檢查CommEvent屬性的值來判斷事件和錯誤。Mscomm控件的通信功能實現,實際上是調用了API函數,而API函數是由Comm.drv解釋并傳給設備驅動程序執行的,對于VB程序開發者只需知道Mscomm控件的屬性和事件的用法即可以實現串口的操作。不論采用哪種方法編寫的串行端口通信程序,一般都可分為以下幾個過程:
一、初始化串行端口
在初始化程序中,需要設定好整個幀結構的命令數組、傳輸波特率、奇偶校驗、停止位,開辟數據緩沖區,完成一些必須的串口初始化設定。
二、數據傳輸
讀寫串行端口可分四種方式:查詢方式、同步I/O、異步(后臺)I/O和事件驅動I/O。命令字的發送應該嚴格按照Modbus規約所設計的幀格式和上下位機在該規約基礎上所定義的通信協議來編程。
三、超時控制
為了防止意外情況使串口讀寫無休止地等待,必須在程序中設置超時控制。
四、CRC校驗的實現
目前儀表類比較普遍采用的是CRC16校驗碼。其生成多項式為X16+X15+X2+1。在算法實現上,可以先預置一個16位的寄存器FFFF(全1),然后把8位的2進制數據(一個字節)與16位的CRC寄存器低8位異或,并把結果放回CRC寄存器同時寄存器內容右移,MSB補0,并檢查移出的LSB。如果LSB為0則繼續右移動,為1則CRC寄存器與多項式異或。重復上面操作到一個8bit字節完成,再繼續對下一個數據進行相同處理,直到所有數據結束。這個時候CRC寄存器中的數據就是我們所要的CRC碼了。
下位機一般是使用固化好通信協議及工作指令的單片機。因為測控系統多采用的是單發多收的通信機制[4],所以在下位機要允許用戶預先設定本機的地址碼,并且保證不能重復。此外,要注意通信波特率必須與上位機的波特率相匹配。在下位機軟件開發中,要遵循Modbus規約的通信幀結構對上位機傳輸的命令進行解析:非呼叫對象應能及時重新恢復等待接受狀態;響應呼叫的下位機要解析命令代碼并進行相應的功能處理,對非法的命令操作要能回送報錯信息。在具體的工程開發中,下位機多是采用各個廠家出產的基于Modbus規約的智能儀表。這樣雖然簡化了我們開發的工作量,但是下位機的合理安排與設計能降低系統誤碼率、提高可靠性。因此是每個工業系統設計人員所不應該忽略的重要部分。在工業控制中,因為各種干擾源的存在且一般下位機數量較大,要對RS-485芯片選型有很認真的考慮。條件許可的話盡量選用抗電擊和有較大級連驅動能力的芯片。理論上485芯片的級連能力至少32門,目前很多芯片廠家都能使工業級的級連數達到128以上。在實際應用中應該讓系統具有一定的富余度,一般級連數不能超過該器件滿載的70%。在選配RS232到RS485轉換頭的時候也應該盡量選用有源的轉換器,以提高驅動能力和穩定性。此外,工業現場的降噪、隔離、布線、屏蔽等等措施的合理<