周奇才,徐小芳,王 凱,熊肖磊,呂 強
(1. 同濟大學 機械工程學院 機械電子研究所,上海 201804;2. 上海盾構設備有限公司,上海 200031)
盾構在施工過程中會引起地表沉降,而沉降發生的主要原因是地層損失,一般將其定義為由于超挖(蛇形)、間隙與注漿共同作用下所產生的、不考慮土體變形的實際開挖土體積(需考慮開挖后土體體積的變化)與理論挖土體積之差[1]。經研究,地層損失的主要影響因素包括推進過程中的排土量、注漿壓力和注漿量等[2],通過對排土量和注漿量的測量可實現對地層損失的預測,提高盾構施工的自動化水平,而排土量與注漿量數據的獲取需要建立在數據采集的基礎上,由此可見,建立一個實時、高效的數據采集系統對實現地層損失監測是十分必要的。
本文研究設計了一種基于RS485總線的分布式實時數據采集系統,上位機基于Visual Studio 2010,在c#的語言環境利用串口控件Serial Port實現上位機與下位機之間的實時數據通信。
地層損失監控系統的主要功能包括數據采集、數據傳輸、數據存儲、數據處理、沉降預測、人機交互等,如圖1所示。數據采集部分主要包括盾構 推進過程中的實際出土體積、理論的出土體積以及同步注漿過程中的注漿量。采集得到的出土量與注漿量通過串行總線傳給上位機,并在上位機進行相關處理,原始數據與處理后的數據均存在數據庫中,處理后的數據可作為建立沉降預測模型的依據。另外操作人員能夠通過人機交互界面查找所需信息,在界面上直觀的看到預測的沉降值,判斷是否需要調整施工參數達到控制沉降的目的。數據采集系統是整個地層損失監測系統的基礎,占據著非常重要的地位。

圖1 地層損失監測系統功能框圖
采集系統的主要任務是實現對出土量與注漿量的測量,測量方案分別為:1)測量出土量——在螺旋輸送機出土口處安裝激光測速儀測量出土口速度,再將速度與出土口的橫截面積進行積分來測量排土體積,另外在皮帶輸送機上安裝模塊式皮帶秤測量土體重量;利用針輪裝置測出土量,即讓土體帶動針輪轉動,通過測針輪的轉速反推出出土速度,再與出土口橫截面積進行積分運算得到出土體積;2)測量注漿量——通過在注漿泵的兩個管道上均安裝質量流量計來實現。這些方案需要采集的參數主要包括盾構推進過程中螺旋機出土口的出土速度,皮帶輸送機上的土體重量以及注漿泵流過管道的漿液流量。
整個數據采集系統的組成如圖2所示,主要分為下位機與上位機兩部分。下位機是4個傳感器檢測從站,主要完成數據采集,包括optipact-s1激光測速儀,歐姆龍旋轉編碼器,賽摩電子皮帶秤,科力博奧質量流量計以及DAM3070D高頻計數模塊,其中歐姆龍旋轉編碼器用于測量自主研制的針輪裝置的轉速,DAM3070D高頻計數模塊是用于采集激光測速儀與旋轉編碼器的增量信號。上位機為數據采集主站,它是一臺放在操作室的工控PC機,負責讀取下位機采集的數據并進行相應的處理與數據存儲。下位的各個傳感器檢測裝置分布在多處,需要利用現場總線技術將這些傳感器采集的數據實時傳輸到主站,所以該采集系統是分布式的。
下位機主要是由四種不同類型的傳感器和一種高頻計數模塊組成。它們的性能介紹如下:
1)正常情況下螺旋機出土口的速度約為0.1m/s,一般的測速儀量程都比較大,難以滿足高精度的要求,而optipact-s1測速儀測量的最大速度只有4m/s,精度優于1%,是較為理想的選擇,體積小,方便安裝,防護等級為IP65,增量輸出;
2)歐姆龍旋轉編碼器,最高響應頻率達100kHz,防護等級為IP50,能夠適應惡劣的施工環境。
3)賽摩電子皮帶秤,雙托輥秤架適應皮帶的寬度從500~1200mm,而皮帶輸送機的皮帶寬度為600 mm,滿足要求。動態累計誤差小于0.125%,測量精度達到0.25%~0.5%,且過載達到傳感器容量的150%,RS485通訊接口,支持Modbus協議。
4)科力博奧質量流量計,在較為理想的情況下精度達到0.2%,耐壓值高達到8MPa,可以承受注漿過程中的因管道堵塞或土壓升高等帶來的高壓情況,并且抗抖動性強。RS485通訊接口,支持Modbus協議。
optipact-s1與旋轉編碼器均是增量輸出,不支持Modbus協議,高頻計數模塊DAM3070D用于采集這兩個傳感器的增量信號,輸出Modbus協議格式的數據傳給上位主站。該模塊有2路獨立的32位計數器,頻率測量范圍最大達到100KHz。
下位傳感器檢測裝置采集了各個參數,通過總線實時傳輸給PC機,并與PC機進行串口通信,將接收到的數據在PC機上顯示并利用后臺處理軟件進行處理。
2.2.1 通訊網絡
目前國際上正在使用的現場總線名目繁多,如PROFIBUS、CAN總線,但是其系統造價相對過高,不太適用于中小型系統的應用。而RS485串行通信總線構造簡單、技術成熟、造價低廉、便于維護,廣泛應用于工業控制、儀器、儀表、機電一體化產品等諸多領域,其技術指標為:傳輸速率最大為10Mbps;最大距離為1200 m;高阻抗、抗噪聲差分(有補償線)傳輸;最高為32個節點。因此選用RS485總線進行網絡通訊[3]。RS485總線模塊比較常用的通信協議是Modbus協議,它是一種廣泛的主從式通信協議,已經得到了眾多大公司(例如GE,SIEMENs,OMRON等)的支持,都把它作為一種標準的通信接口提供給用戶,并且作為與主系統通信的主要途徑。故該網絡是基于Modbus協議的RS485串行總線的通信網絡。

圖2 數據采集系統的總體框圖
2.2.2 通訊協議
Modbus是OSI模型第7層上的應用層報文傳輸協議,是一種請求/應答(Master/Slave)協議。一個主站(Master)可以對應多個從站(Slave),能夠在連接至不同類型總線或網絡的設備之間提供客戶機/服務器通信,并且提供功能碼規定的服務。Modbus功能碼是Modbus請求/應答PDU 的元素[4]。
Modbus 協議定義了一個與基礎通信層無關的簡單協議數據單元(PDU)。特定總線或網絡上的Modbus協議映射能夠在應用數據單元(ADU)上引入一些附加域。通用的Modbus協議格式如圖3所示。

圖3 通用的Modbus協議格式
地址域是指slave的地址,取值范圍足1—247,“0”單獨用作廣播地址。在更高一級的網絡將使用其他的方法代替“0”實施廣播;功能碼的取值范圍是在1—255,表示Master要求Slave執行何種操作。功能碼分為通用功能碼(適用所有的Mod icon控制器)、
專用功能碼(適用某些功能模塊)、留用功能碼(作為將來的使用),Slave在收到Master的功能碼后,如果一切正常,將原樣返回功能碼,否則,將返回錯誤代碼,提示Master有錯誤發生;數據是請求和響應的主要內容。當Master向slave請求讀取寄存器內容時,數據將包括寄存器的起始地址及讀取的寄存器個數。寄存器是slave存放數據的地方,它的起始地址是從l開始的,但是Master計算時是由0開始的,所以對應的實際寄存器地址應該加l。slave回送響應的數據包括數據長度、實際采集的數據。注意數據長度只是計算數據區的長度,并不管其他部分的長度。如果S1ave出現異常,數據就返回錯誤代碼(Exception code),說明發生何種錯誤。循環冗余校驗(CRC),它是一個16位字。要注意的是加入到數據幀時CRC是低位在前,高位在后。
主機向各個從站發送命令幀并且接收從站的響應幀格式分別如下:
1)高頻計數模塊
高頻計數模塊與上位機通信的功能碼為04,即訪問輸入寄存區,主站發送數據格式如表1所示。

表1 計數模塊的主站發送數據格式
主機向從機發送8字節命令,包括的信息有:從機地址為02,訪問輸入寄存器的起始地址為0000H(16進制),訪問寄存區的數量為4,最后兩位是CRC(循環冗余校驗)的高位與地位。從站響應數據格式如表2所示。

表2 計數模塊從站響應數據格式
計數模塊返回8字節數據,其中:
0通道計數/頻率值低字—2字節,0通道計數/頻率值高字—2字節;
1通道計數/頻率值低字—2字節,1通道計數/頻率值高字—2字節;
0通道用于輸出optipact的脈沖量,1通道用于輸出旋轉編碼器的脈沖量。
2)電子皮帶秤
主機向賽摩電子皮帶秤的發送的命令格式如表3所示。

表3 主站向皮帶秤發送的數據格式
主機向從機發送8字節命令,包括的信息有:從機地址為01,讀取保持寄存器的起始地址為6640H,訪問寄存區的數量為26,最后兩位是CRC(循環冗余校驗)的高位與地位。從站響應數據格式如表4所示。

表4 從站皮帶秤響應數據格式
電子皮帶秤返回26字節數據,包括:流量—4字節,設定值—4 字節,累計量—8 字節,速度—4 字節,載荷—4 字節,燈狀態—1 字節,報警信息—1 字節。
3)質量流量計
主站向兩個質量流量計發送的命令格式與向電子皮帶秤發送的格式類似,不同之處在于從站地址不一致,分別為03,04,產生的校驗位也不一致。
質量流量計返回88字節的數據,包括質量流量、質量總量、體積總量、溫度、密度以及儀表狀態等信息,但并非所有的數據都是必須的,從中提取的主要信息如表5所示,共26字節。

表5 質量流量計返回的數據含義
在該數據采集系統中,RS485總線構成了主從式的多機串行總線通訊系統,PC機按照通訊協議向下位機發送命令,下位機接收到命令后進行各種操作。PC機與各下位機之間的通訊方式采用半雙工方式,每一個下位機被賦予唯一的從站地址,PC機采用輪循的方式在一個固定周期內先后訪問4個從站,由PC機輪流向各個從站發送命令,在其控制下完成與各個下位機模塊的數據交換,次序為電子皮帶秤,高頻計數模塊,2個質量流量計,同時數據以幀的形式在RS485總線上進行傳輸。
串行接口包括4個寄存器,即控制寄存器、狀態寄存器、數據輸入寄存器及數據輸出寄存器。數據輸入寄存器總是和串行輸入/并行輸出移位寄存器配對使用的。在輸入過程中,數據一位一位從外部設備進入移位寄存器,當數據完整接收之后則從移位寄存器送入輸入寄存器,再等待CPU取走。輸出的情況與輸入過程類似。當CPU向數據輸出寄存器中輸出一個數據后,數據便傳輸到移位寄存器,然后一位一位地通過輸出線送到外設。
本采集系統利用vs2010提供的Serial Port控件可以實現設備與設備、設備與PC機之間的串口通信。串口通訊的一般流程是設置通訊端口及波特率、數據位、停止位與校驗位,對于上位機與下位機而言,這些屬性的設置必須一致,然后再打開端口,發送與接收數據,最后關閉端口。設備的工作狀態通過串口發送到PC機,發送方不斷從輸出緩沖提取數據形成數據幀發送出去,接收方不斷把接收數據包解開后放入接收緩沖,兩者需要遵從共同的數據包協議進行收發[5,6]。串口數據的讀取有兩種方式:線程實時讀串口方式;事件觸發方式。由于線程實時讀串口的效率不是很高,所以選DataReceiv ed事件觸發的方法,將Received BytesThreshold屬性值設置為1,即只要接收緩沖區有字符就觸發接收事件。由于DataReceived事件在輔助線程被引發,當接收完整的一條數據,返回主線程處理或窗體上顯示時,必須要采用跨線程的處理,c#可采用控件的異步委托的方法Control.BeginInvoke及同步委托的方法Invoke。
皮帶秤、計數模塊、質量流量計與PC機之間的通信過程是類似的,本文以皮帶秤和PC機間的通信為例,具體流程如下:
1)Serial port控件實現通信的關鍵是正確設置該控件的屬性與方法。首先對該控件進行初始化,設置波特率為9600b/s、數據位為8位、無奇偶校驗、1位停止位即9600,8,N,1。然后打開串口。見以下程序所示。
private void InitializeSerialPort()//initialize the serial port
{
serialPort1.Baudrate=9600;//波特率為9600
serialPort1.DataBits = 8;//8位數據位
serialPort1.DtrEnable = false;
serialPort1.Handshake = Handshake.None;//無握手協議
serialPort1.Parity = Parity.None;//無奇偶校驗
serialPort1.RtsEnable = false;
serialPort1.StopBits = StopBits.One;//1位停止位
}
2)上位機向下位機發送讀取數據的命令。為了保證兩者之間的正確通信,發送的命令幀必須正確,在發送完命令幀后,上位機處于等待狀態,為了提高通信效率,主機不會一直處于被動的等待狀態,采用定時器設置主機等待的時間為30s。主機向從機發送8字節命令,01036640001ADB5D,即向地址為01的從機發送讀保持寄存區的命令,最后4位為CRC校驗位,并同時開啟定時器,若30s之后主機未收到數據,那么重發一次命令,若仍未收到,則再重發,當未收到的次數超過3次則出現報錯,退出線程;如果30s之內數據接收成功,關閉定時器,關閉串口。
3)下位機成功接收命令幀后先對地址信息進行審查,若從站地址與本機相符,則根據PC機要求進行相關的工作,并利用串口進行數據發送。
4)對接收的數據進行循環冗余校驗CRC校驗,判斷接收數據的合法性與有效性。CRC校驗的過程為,小調入1個16位寄存器,所有位均為1,然后調用消息幀中開始的8位字節和寄存器內容異或,結果向最低有效位(LSB)方向移動(右移),最高有效位以0 填充。LSB被提取出來檢測,如果LSB 為1 ,寄存器值和預置的值A001H進行異或運算;如果LSB 為0,則不進行,整個過程重復8 次運算;在最后一位(第8 位)完成后,下一個8 位字節又和寄存器的當前值異或。最終寄存器中的值,是消息中所有的字節都執行校驗之后的CRC 值[7]。接收設備將這個CRC 值與被傳送的CRC 值比較來檢驗主機或從機在通信數據傳送過程中的信息是有誤。經過校驗后若數據正確則放
入數據庫中存儲,否則丟棄。整個流程如圖4所示。利用Timer定時器控件的Interval屬性設置系統輪循4個從機的周期時間,在Timer事件過程中寫入主機與各個從機通信的子程序,保證主機按照固定的時間間隔將命令下達到各個從機并獲得數據,從而實現數據的定時采集。

圖4 電子皮帶秤的串口通信流程圖
本實例主要是實現電子皮帶秤與上位機的通信,通信界面如圖5所示。用戶可以在工具欄中選擇通信端口,在關閉串口后可以重新設置串口屬性,還可以設置通訊等待時間和輪循的時間周期。在狀態欄中會顯示串口當前的狀態,打開或關閉,以及數據存儲的情況等。
下面給出皮帶秤與PC機通信的部分程序清單[8,9],首先是流程圖4中的打開串口過程,見以下步驟1)所示,步驟2)中的程序是實現流程圖4中的主機向皮帶秤發送讀數據命令,并等待皮帶秤返回數據。
1)主顯示區“采集”按鈕的Click事件打開串口。
private void button12_Click(object sender,EventArgs e)//打開串口
{ if (serialPort2.IsOpen == false)
{ serialPort2.Open();
button12.Text = “關閉串口";
else{serialPort2.Close();
button12.Text = "打開串口";}}
2)PC機以Modbus協議格式向皮帶機發送命
令并接收皮帶秤返回的數據。

圖5 采集賽摩皮帶秤的操作界面
public MODBUSRESULT SendAndReceive(string SendData, int _BytesToRec,out string RetData)
{
RetData = “”;//初始化接收數據
IsTimeout = false;//通訊未超時
DataBuff = "";//數據緩存
DataRecCount = 0;//接收的數據個數
BytesToRec = _BytesToRec;
SerialPort sp = new SerialPort(_PortName,_PortBaud, _parity, _Databit, _Stopbit);//實例化串口
try
{
sp.Open();//打開串口
}
catch
{
return MODBUSRESULT.PortOpenFall;//串口未打開,報錯
}
if (SendData.Length / 2 > 0)//PC發送命令幀
{
byte[] bt = CRC16.StrToByte(SendData);
DataHead = bt[0];
sp.Write(bt, 0, bt.Length);//數據寫入串口
}
if (_BytesToRec > 0)//上位接收數據
{sp.DataReceived += new
SerialDataReceivedEventHandler(sp_DataReceived);//數據接收事件
Timers.Timer MyTimer = new System.Timers.Timer(_Timeout);
MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Elapsed); //通訊超時事件
MyTimer.Enabled = true;
MyTimer.Start();//定時器開啟
while ((IsTimeout == false) && (DataIsReceived== false)) ;//
通訊未超時且數據接收
MyTimer.Stop();//定時器停止
MyTimer.Elapsed -= new ElapsedEventHandler(MyTimer_Elapsed);
MyTimer.Dispose();//定時器資源釋放
sp.Close();//串口關閉}
else{
sp.Close();
return MODBUSRESULT.OK;//通訊未超時且數據接收}
if (IsTimeout == true)
{
return MODBUSRESULT.Timeout;//返回通訊超時
}
//校驗數據
MODBUSRESULT ret = CheckData(DataBuff,SendData);
if (ret == MODBUSRESULT.OK)
{
RetData = DataBuff;
return MODBUSRESULT.OK;
}
else
{return ret;
}
}
數據采集系統的實時性與高效性對地層損失監測系統非常重要。本文主要對整個采集系統的結構進行了較為深入的闡述,介紹了各個下位機的基本性能及其Modbus通訊協議,在Visual Studio 2010環境下利用C#的Serial Port類編寫了網絡通信程序,實現了皮帶秤、計數模塊、質量流量計與上位機通信。經過多次試驗,本文設計的通信程序性能良好,操作簡便。
[1] 周奇才,徐小芳,王凱,等.盾構施工過程地層損失監測系統的設計[J].機電一體化,2012,18(5):65-71.
[2] 王國才,許四法.地鐵盾構隧道施工引起地表沉降的影響因素分析[J].溫州大學學報·自然科學版,2010,31(增2):280-285.
[3] 孫鵬,任維松,張赤斌.基于RS485總線的SBI試驗數據采集系統的設計[J].計算機應用,2009(11):44-47.
[4] 文小玲,余飛,盧圣文,等.基于MODBUS協議的串口通信軟件設計[J].湖南工業大學學報,2008,22(6):100-102.
[5] 謝瑞和.串行技術大全[M].北京:清華大學出版社,2003.
[6] 趙炯,熊肖磊,周奇才.串行數據傳輸協議的剖析研究[J].計算機工程,2004,30 ( 9) : 106- 108.
[7] 李宥謀,房鼎益.CRC編碼算法研究與實現[J]. 西北大學學報,2006,36(1):895-898.
[8] 張立.C#程序設計編程經典[M].北京:清華大學出版社,2008.
[9] 姜拓,張劍平.基于c#的數據采集系統上位機軟件設計與實現[J].電子測試,2009(9):58-61.