鄒劍峰
摘 要:介紹了S7-200PLC通過Modbus RTU協議作為從站與PC主站通訊的方法,通過S7-200PLC對S7-300PLC的信號中轉,用VB6.0編寫的料斗秤計量軟件實現了對S7-200PLC及S7-300PLC的信號交換,開發了船舶大宗原料料斗秤檢斤計量系統并得到有效應用。
關鍵詞:S7-200PLC;料斗秤;Modbus RTU協議
引言
目前,鋼鐵企業船舶運輸的大宗原材料都是采用檢尺的方式進行計量,但由于種種原因,經常導致檢尺計量數據偏差大,買賣雙方矛盾重重。為了解決上述問題,采用將原料通過卸料皮帶運至陸域后采用靜態料斗計量,實現檢斤計量,準確計量后,通過皮帶轉運至原料堆場。計量數據及時傳給公司計量管理系統,為公司原料管理部門提供實時、準確、完整的船運原料計量數據。
1 系統功能
船運大宗原料通過201膠帶機、202膠帶機、203膠帶機、204膠帶機、205膠帶機、206-1膠帶機、206-2膠帶機、布料器將原料轉運進計量料倉A,當倉A達到預設稱量條件,系統驅動布料器移動到B計量倉上裝料,此時,A計量倉計量,A倉計量完畢,打開液壓閘門,原料通過206-3膠帶機、206-4膠帶機、207膠帶機轉運至后方堆場,A計量倉卸料完畢,關閉液壓閘門;當倉B達到預設稱量條件,系統驅動布料器移動到A計量倉裝料,此時,B計量倉計量,B倉計量完畢,打開液壓閘門放料,原料通過206-3膠帶機、206-4膠帶機、207膠帶機轉運至后方堆場,B計量倉卸料完畢,關閉液壓閘門。如此循環,實現船運大宗原料的檢斤計量,同時保證碼頭船運大宗原料的有序卸載。計量工藝流程如圖1所示。
圖1 碼頭船運原料卸載計量工藝流程
2 系統結構
根據碼頭卸載工藝需求以及料斗秤計量需求,碼頭基礎控制系統使用西門子S7-300PLC控制器,控制碼頭卸料料線的啟停、布料器在計量倉上的位置檢測等。料線啟停等操作由基礎自動化操作站完成。S7-300PLC檢測信號(如卸料小車位置檢測、料線運行狀態等)實時通過Profibus-DP網絡傳給S7-200PLC系統。S7-200PLC、稱重儀表A、稱重儀表B、串口服務器等組成RS485總線計量網絡,計量操作站中的上位機軟件不斷讀取稱重儀表A、稱重儀表B、S7-200PLC中的數據,通過邏輯判斷完成稱量,S7-200PLC驅動計量倉下液壓閘門的打開或關閉,將計量倉中的原料排出,同時將計量信息(如料倉內物料重量、料倉是否具備裝料條件等)通過S7-200PLC傳給S7-300PLC系統,通過邏輯判斷實現S7-300PLC對布料器的驅動控制。計量料倉A和計量料倉B的靜態稱量由計量操作站完成。
S7-200PLC支持Modbus RTU 協議,稱重儀表A和稱重儀表B支持RS485接口通訊,計量軟件采用VB6.0開發,主要借助VB開發平臺下的MSComm、Timer控件來實現與S7-200PLC、稱重儀表A、重儀表B 的串行通訊。使用串口服務器完成RS485/RS232的轉換,同時在上位機中完成端口映射,計量操作站中實際使用了COM1、COM2、COM3三個串口,分別與S7-200PLC、稱重儀表A、稱重儀表B通訊。
計量操作站一用一備,計量數據保存在本地服務器的同時將數據傳給公司計量管理系統,為系統連續運行及數據的可靠性提供了保障。系統網絡結構如圖2所示。
圖2 系統網絡結構
3 系統功能的實現
3.1 S7-300PLC和S7-200PLC通訊
系統中使用S7-300PLC完成基礎自動化控制(如卸料料線的啟停、計量倉上布料器的位置檢測、公輔系統的控制等),其中如料線運行狀態信號、布料器位置信號等均要傳給S7-200PLC系統;由計量上位機發給S7-200PLC計量完成信號、液壓閘門打開/關閉信號等要傳給S7-300PLC系統。
S7-200PLC系統配置EM277通訊模塊,與S7-300PLC 通過Profibus-DP網絡連接,在S7-300PLC編程軟件中安裝EM277 GSD文件,將配有EM277模塊的S7-200PLC組態在S7-300PLC硬件系統中,完成地址映射,實現S7-300PLC 和S7-200PLC的通訊。
3.2 計量上位機軟件與S7-200PLC、稱重儀表A、稱重儀表B通訊
計量系統中計量操作站、S7-200PLC、稱重儀表A、稱重儀表B組成RS485總線網絡,采用Modbus RTU協議。Modbus RTU協議采用主從工作方式,允許一臺主機和多臺從機通信,每臺從機地址由用戶設定,地址范圍為1~255。計量操作站作為主站,S7-200PLC、稱重儀表A及稱重儀表B作為從站。S7-200 CPU上的通訊口Port0通過指令庫支持Modbus RTU 從站模式。
Modbus 通訊協議規范:起始符+設備地址+功能代碼+數據+校驗和+結束符。對S7-200PLC來說,其中“功能代碼”表明了該命令要執行什么功能,如01碼讀取單個/多個線圈(離散量輸出點)狀態,03碼讀取單個/多個保持寄存器,返回V存儲區的狀態等。“校效和”在整個規范中非常重要。我們知道,RS232通訊格式里的奇偶校驗方式并不能保證每個字符都正確,所以需要把所有字符的值按照某種規律計算,計算得到的字符(校驗和)傳給接收方,接收時再把接收到的字符的值按照某種規律計算,得到的字符與發送方傳送過來的校驗和字符比較,如果相等,就算接收正確了。
3.2.1 S7-200PLC作為從站與計量操作站通訊
S7-200 CPU上的通訊口Port0通過指令庫支持Modbus RTU 從站模式。S7-200PLC Modbus RTU
從站協議是通過調用指令庫中的兩個功能塊實現的,兩個功能塊分別是MBUS_INIT和MBUS_SLAVE。MBUS_INIT功能塊被用于啟用和初始化或禁止Modbus通訊。MBUS_SLAVE功能塊被用于為Modbus主設備發出的查詢服務,并且必須在每次掃描時執行,以便允許該指令檢查和響應Modbus主設備查詢。兩個功能塊圖如圖3。
圖3
在S7-200PLC與計量操作站通訊之前,根據主站的通訊參數進行初始化設置,MBUS_INIT功能塊通訊格式設置如下:Mode為1,表示為Modbus協議;Addr從站地址為1;Baud波特率為19200;Parity為2是偶校驗;MaxIQ表示讀取輸入輸出數字量的點數;MaxAI表示讀取模擬量的點數;MaxHold和HoldStart結合使用可以讀取V存儲區數據,設置開始讀取地址以及讀取數量。完成MBUS_INIT功能塊參數的設置,然后通過調用MBUS_SLAVE功能塊響應主機查詢信息。
3.2.2 計量操作站作為主站與PLC通訊
計量軟件采用VB6.0編程,VB6.0與Windows系統有著非常完美的接口,VB6.0提供了一個非常方便的通信控件MSComm。應用程序嵌入MSComm控件,通過MSComm控件提供的事件驅動或查詢方式來進行串行通信管理。S7-200PLC、稱重儀表A、稱重儀表B分別接入串口服務器后,實現RS485/RS232的轉換,通過串口映射,計算機中使用COM1、COM2、COM3分別對應S7-200PLC、稱重儀表A、稱重儀表B,分別對3個串口進行編寫通訊程序。
(1)通訊口初始化編程
使用VB中的MSComm控件通訊時,初始化程序如下:
On Error GoTo Prog_err: '此處作用:如果您選擇了電腦中不存在的通訊口,則'Prog_err'程序段,提示“無效的通訊口”
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False '串口是打開狀態,則關閉,進行串口的設置工作
MSComm1.CommPort = Combo1.ListIndex + 1 '設置通訊端口號
MSComm1.Settings = CStr(Combo3.Text) & “E,8,1” '*設定通訊格式
MSComm1.InputLen = 0 '*將接收緩沖區內容全部讀回來
MSComm1.OutBufferCount = 0 '*設置并返回發送緩沖區的字節數,設為0時清空發送緩沖區
MSComm1.InBufferCount = 0 '*設置并返回接收緩沖區的字節數,設為0時清空接收緩沖區
MSComm1.InputMode = comInputModeBinary '*二進制接收
MSComm1.RThreshold = 1 '*產生ON_COMMM事件的字符數
MSComm1.PortOpen = True '*打開串口
Label2.Caption = “串口已打開”
Order = 0
Timer1.Enabled = True
Timer2.Enabled = False
RWcomm = False
Exit Sub
Prog_err:
Label3.Caption = “無此端口”
(2)計量操作站讀數及寫數程序(以讀輸入I點和輸出Q點為例)
使用01功能碼和02功能碼實現對輸入I點和輸出Q點的讀數程序如下:
ReDim SenData(0 To 7) As Byte '*發送變量
Adree = Right(“0000” + Hex(Val(“&o” + CStr(Val(Text4.Text) * 10 + Combo2.Text))), 4)
'地址要求是兩個字節,所以前面補零
'西門子輸出是八進制,所以先將八進制轉換為十進制
SenData(0) = &H1 '從站站號
If Option6.Value = True Then '畫面中選擇 Q 點輸出
SenData(1) = &H1 '01碼 讀數字量輸出位 命令
Else '畫面中選擇 I 點輸入 即如果是對輸入操作
SenData(1) = &H2 '02碼 讀數字量輸入位 命令
End If
SenData(2) = Val(“&H” + Mid(Adree, 1, 2)) '寄存器通訊地址高字節
SenData(3) = Val(“&H” + Mid(Adree, 3, 2)) '寄存器通訊地址低字節
SenData(4) = &H0 '讀取個數高字節
SenData(5) = &H1 '讀取個數低字節
getData = Chr_crc(SenData) '校驗計算[從SenDataR(0) 到 SenDataR(5) 參加校驗和計算)]
SenData(6) = Val(“&H” + Mid(getData, 1, 2)) '校驗高字節
SenData(7) = Val(“&H” + Right(getData, 2)) '校驗低字節
……
(3)計量操作站中數據處理程序
MSComm控件處理通訊方式有兩種:事件驅動方式和查詢方式。本系統采用事件驅動方式。在串口緩沖區接受到字符時觸發OnComm事件捕獲并處理通信事件。程序通過Rthreshold屬性值來實現觸發OnComm事件來處理S7-200PLC發送來的從站響應信息。部分程序如下。
Private Sub MSComm1_OnComm()
Dim I As Integer '定義整數 I
Dim getData() As Byte '讀取接收緩沖區變量 定義字節型數組變量
Dim getData_len As Long '判斷讀取長度 定義長整型數據
Dim CrcJ() As Byte '用于校驗計算 定義字節型數組變量
Dim j As Integer '定義整數 j
If MSComm1.CommEvent = comEvReceive Then 'CommEvent的屬性返回的值為comEvReceive時是發生了接收事件.
getData = MSComm1.Input '讀取接收緩沖區內容 將緩沖區內容賦值給getData數組變量。
getData_len = UBound(getData) '返回一個 Long 型數據,其值為指定的數維組可用的最大下標
For j = 0 To getData_len '將讀取的字節變換為字符
Read = Read & Right(“00” + Hex(getData(j)), 2) '將獲取到的數組變量依次轉換成十六進制數,每個字節補齊后取2位 組合成一個十六進制數字符串。
Next j
……
(4)稱重儀表A和稱重儀表B和計量軟件的通訊
稱重儀表A和稱重儀表B都支持Modbus RTU 協議,分別對應COM2和COM3串口,編程方式類似對S7-200PLC的編程,需熟悉稱重儀表的數據格式,在此不再贅述。
4 結束語
本系統碼頭料斗秤計量軟件通過Modbus RTU 協議實現與S7-200PLC信號交換,通過S7-200PLC中轉也實現了與S7-300PLC的信號交換。通過信號的邏輯判斷以及稱重儀表重量數據的直接讀取,碼頭船舶大宗原料料斗秤檢斤計量得到成功實現,有效解決了買賣雙方之間的矛盾。
S7-200PLC 作為現場控制設備,通過Modbus協議,不僅可以作為與PC 機通訊的從站,也可以作為主站,在現代工業控制中使用相當廣泛。利用Modbus協議開發通訊程序,不僅能保證系統的可靠性,而且有效降低了開發成本。
參考文獻
[1]西門子公司SIMATIC S7-200可編程控制器手冊[M].北京國防工業出版社,2000.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[D].清華大學出版社,2002
[3]劉瑞新,李樹東,萬朝陽.Visual Basic 程序設計教程[M].電子工業出版社,2000.
[4]祝木田,師勇.Modbus 協議通訊的應用[J].微計算機信息,2003
Private Sub MSComm1_OnComm()
Dim I As Integer '定義整數 I
Dim getData() As Byte '讀取接收緩沖區變量 定義字節型數組變量
Dim getData_len As Long '判斷讀取長度 定義長整型數據
Dim CrcJ() As Byte '用于校驗計算 定義字節型數組變量
Dim j As Integer '定義整數 j
If MSComm1.CommEvent = comEvReceive Then 'CommEvent的屬性返回的值為comEvReceive時是發生了接收事件.
getData = MSComm1.Input '讀取接收緩沖區內容 將緩沖區內容賦值給getData數組變量。
getData_len = UBound(getData) '返回一個 Long 型數據,其值為指定的數維組可用的最大下標
For j = 0 To getData_len '將讀取的字節變換為字符
Read = Read & Right(“00” + Hex(getData(j)), 2) '將獲取到的數組變量依次轉換成十六進制數,每個字節補齊后取2位 組合成一個十六進制數字符串。
Next j
……
(4)稱重儀表A和稱重儀表B和計量軟件的通訊
稱重儀表A和稱重儀表B都支持Modbus RTU 協議,分別對應COM2和COM3串口,編程方式類似對S7-200PLC的編程,需熟悉稱重儀表的數據格式,在此不再贅述。
4 結束語
本系統碼頭料斗秤計量軟件通過Modbus RTU 協議實現與S7-200PLC信號交換,通過S7-200PLC中轉也實現了與S7-300PLC的信號交換。通過信號的邏輯判斷以及稱重儀表重量數據的直接讀取,碼頭船舶大宗原料料斗秤檢斤計量得到成功實現,有效解決了買賣雙方之間的矛盾。
S7-200PLC 作為現場控制設備,通過Modbus協議,不僅可以作為與PC 機通訊的從站,也可以作為主站,在現代工業控制中使用相當廣泛。利用Modbus協議開發通訊程序,不僅能保證系統的可靠性,而且有效降低了開發成本。
參考文獻
[1]西門子公司SIMATIC S7-200可編程控制器手冊[M].北京國防工業出版社,2000.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[D].清華大學出版社,2002
[3]劉瑞新,李樹東,萬朝陽.Visual Basic 程序設計教程[M].電子工業出版社,2000.
[4]祝木田,師勇.Modbus 協議通訊的應用[J].微計算機信息,2003
Private Sub MSComm1_OnComm()
Dim I As Integer '定義整數 I
Dim getData() As Byte '讀取接收緩沖區變量 定義字節型數組變量
Dim getData_len As Long '判斷讀取長度 定義長整型數據
Dim CrcJ() As Byte '用于校驗計算 定義字節型數組變量
Dim j As Integer '定義整數 j
If MSComm1.CommEvent = comEvReceive Then 'CommEvent的屬性返回的值為comEvReceive時是發生了接收事件.
getData = MSComm1.Input '讀取接收緩沖區內容 將緩沖區內容賦值給getData數組變量。
getData_len = UBound(getData) '返回一個 Long 型數據,其值為指定的數維組可用的最大下標
For j = 0 To getData_len '將讀取的字節變換為字符
Read = Read & Right(“00” + Hex(getData(j)), 2) '將獲取到的數組變量依次轉換成十六進制數,每個字節補齊后取2位 組合成一個十六進制數字符串。
Next j
……
(4)稱重儀表A和稱重儀表B和計量軟件的通訊
稱重儀表A和稱重儀表B都支持Modbus RTU 協議,分別對應COM2和COM3串口,編程方式類似對S7-200PLC的編程,需熟悉稱重儀表的數據格式,在此不再贅述。
4 結束語
本系統碼頭料斗秤計量軟件通過Modbus RTU 協議實現與S7-200PLC信號交換,通過S7-200PLC中轉也實現了與S7-300PLC的信號交換。通過信號的邏輯判斷以及稱重儀表重量數據的直接讀取,碼頭船舶大宗原料料斗秤檢斤計量得到成功實現,有效解決了買賣雙方之間的矛盾。
S7-200PLC 作為現場控制設備,通過Modbus協議,不僅可以作為與PC 機通訊的從站,也可以作為主站,在現代工業控制中使用相當廣泛。利用Modbus協議開發通訊程序,不僅能保證系統的可靠性,而且有效降低了開發成本。
參考文獻
[1]西門子公司SIMATIC S7-200可編程控制器手冊[M].北京國防工業出版社,2000.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[D].清華大學出版社,2002
[3]劉瑞新,李樹東,萬朝陽.Visual Basic 程序設計教程[M].電子工業出版社,2000.
[4]祝木田,師勇.Modbus 協議通訊的應用[J].微計算機信息,2003