
西門子6ES7214-2BD23-0XB8代理直銷
用Delphi在工業(yè)控制和自動化實現(xiàn)多線程進行數(shù)據(jù)采集
數(shù)據(jù)采集技術(shù)在工業(yè)控制及自動化等領(lǐng)域中發(fā)揮著重要的作用。數(shù)據(jù)采集的一般過程是這樣的:
①向采集卡發(fā)出通道選擇指令。②選擇要采集的通道號。③啟動A/D轉(zhuǎn)換。④等待,直到轉(zhuǎn)換完成。⑤從采集卡讀出數(shù)據(jù)。對于多通道的采集,在程序的設(shè)計中,一般采用的兩種方法。查詢法或中斷法。所謂查詢方法就是采用一個循環(huán),依次采集各個數(shù)據(jù)通道。查詢法的優(yōu)點是程序簡單,易于實現(xiàn);缺點是采集過程中,CPU多數(shù)時間是在等待,造成資源的浪費。中斷法是采用硬件中斷的形式��先啟動A/D轉(zhuǎn)換,在轉(zhuǎn)換結(jié)束時發(fā)出一中斷信號��CPU響應(yīng)采集卡的中斷時讀出所采集的數(shù)據(jù)。這樣,在等待轉(zhuǎn)換的時間里,CPU可以進行其他的計算工作,而不用處于等待狀態(tài)。中斷法的優(yōu)點是資源能充分利用;但是程序設(shè)計復(fù)雜,尤其是當(dāng)系統(tǒng)的硬件中斷資源緊張時,很容易造成中斷沖突;另外,在bbbbbbs或Win95等操作系統(tǒng)中,不允許用戶安裝中斷處理程序時,則無法實現(xiàn)。
---- 以上討論的兩種方法都是在DOS下的方法;在Win95下,現(xiàn)在有了一個更好的方法��多線程技術(shù)。現(xiàn)在,我們可以利用多線程技術(shù)來進行數(shù)據(jù)采集。
---- 1. 采用多線程進行數(shù)據(jù)采集的優(yōu)點
---- Win95/98較讓人喜愛的除了漂亮的界面以外,就是多線程與多任務(wù)了。DOS環(huán)境中,執(zhí)行中的程序可以獨占全部的資源;在bbbbbbs環(huán)境中,雖然它是一個略具雛形的多任務(wù)環(huán)境,但是只要你喜歡,你的程序仍然可以掌握所有的CPU時間。但是,在bbbbbbs95以及bbbbbbs NT中,一個程序無法獨占所有的CPU執(zhí)行時間。而且,一個程序也不是從頭到尾一條線。相反,一個程序在執(zhí)行中可以分為多個程序片段,同時執(zhí)行。這些能同時執(zhí)行的程序片段稱為線程。在bbbbbbs 95以及bbbbbbs NT中,操作系統(tǒng)同一時間可以輪流執(zhí)行多個程序,這就是多任務(wù)。
---- 采用多線程進行數(shù)據(jù)采集可以有效地加快程序的反應(yīng)速度、增加執(zhí)行的效率。一般的程序中都要處理用戶的輸入,但用戶的輸入速度與CPU的執(zhí)行速度相比就向走路與做飛機一樣。這樣,CPU就將浪費大量的時間用來等待用戶的輸入(如在DOS環(huán)境中)。如果采用多線程,那么就可以用一個線程等待用戶的輸入;另一個線程進行數(shù)據(jù)處理或其他的工作。對于數(shù)據(jù)采集程序,可以用一個單獨的線程進行數(shù)據(jù)采集。這樣,能較大限度的**采集的實時性,而另外的線程同時又能及時地響應(yīng)用戶的操作或進行數(shù)據(jù)處理。否則,程序在采集數(shù)據(jù)時就不能響應(yīng)用戶的操作;在響應(yīng)用戶操作時就不能進行數(shù)據(jù)。尤其當(dāng)采集的數(shù)據(jù)量很大,數(shù)據(jù)處理任務(wù)很重時,如果不采用多線程,采集時的漫長的等待是很讓人接受的。
---- 但是,多線程要比普通程序設(shè)計復(fù)雜得多。由于任一時刻都可能有多個線程同時執(zhí)行,所以,許多的變量、數(shù)據(jù)都可能會被其他線程所修改。這就是多線程程序中較關(guān)鍵的線程間的同步控制問題。
---- 2. 多線程進行數(shù)據(jù)采集應(yīng)解決的問題
---- 其實,多線程程序設(shè)計復(fù)雜是暫時的;如果,你采用傳統(tǒng)的C進行多線程的設(shè)計,那么你必須自己控制線程間的同步。那將是很復(fù)雜的。但是,如果利用面向?qū)ο蟮脑O(shè)計方法,采用Delphi進行多線程程序設(shè)計,問題就簡單多了。這是因為,Delphi已將多線程的復(fù)雜性替我們處理了,我們所要做的就是繼承。
---- 具體地說,多線程數(shù)據(jù)采集需要完成以下工作:
---- ① 從TThread類派生一個自己的類SampleThread。這就是我們用于數(shù)據(jù)采集的類。進行采集時,只需要簡單地創(chuàng)建一個SampleThread的實例。
---- ② 重載**類TThread的Execute方法。在這一方法中將具體地執(zhí)行數(shù)據(jù)采集任務(wù)。
---- ③ 如果希望一邊采集一邊顯示,就在編寫幾個用于顯示采集進度的過程,供Execute方法調(diào)用。
---- TThread類中較常用的屬性/方法如下:
Create方法:constructor Create
(CreateSuspended: Boolean);
---- 其中CreateSuspended參數(shù)確定線程在創(chuàng)建時是否立即執(zhí)行。如果為True,新線程在創(chuàng)建后被掛起;如果為False,線程在創(chuàng)建后立即執(zhí)行。
FreeOnTerminate屬性:
property FreeOnTerminate: Boolean;
---- 該屬性確定程序員是否負責(zé)撤消該線程。如果該屬性為True,VCL將在該線程終止時自動撤消線程對象。它的缺省值為False。
OnTerminate屬性:
property OnTerminate: TNotifyEvent;
---- 該屬性*一個當(dāng)線程終止時發(fā)生的事件。
---- 下面看一個具體的例子:
---- 3. 多線程數(shù)據(jù)采集的實現(xiàn)
---- 這是筆者開發(fā)的一個測抽油機功圖的程序。它的功能是采集抽油機懸點的載荷及位移數(shù)據(jù),經(jīng)過處理后做出抽油機的功圖。圖1(略)所示是數(shù)據(jù)采集時的界面。點“采集數(shù)據(jù)”按鈕后,程序?qū)?chuàng)建一新的線程,并設(shè)置其屬性。這一新線程將完成數(shù)據(jù)采集任務(wù)。程序如下:
Procedure Tsamplebbbb.
DoSampleBtnClick(Sender: Tbbbbbb);
Begin
ReDrawBtn.Enabled := True;
DoSampleBtn.Enabled := False;
FFTBtn.Enabled := True;
TheSampler := SampleThread.Create(False);
創(chuàng)建采集線程
TheSampler.OnTerminate := FFTBtnClick;
采集完成后要執(zhí)行的任務(wù)
TheSampler.FreeOnTerminate := True;
采集完成后撤消
End;
---- 采集線程的類定義如下:
Type
SampleThread = class(TThread)
Public
function AdRead(ach: byte): integer; safecall;
讀A/D卡的函數(shù)
procedure UpdateCaption;
顯示采集所用時間
private
{ Private declarations }
protected
thes, thep: real;
dt: real;
id: integer;
st, ed: LongInt;
procedure Execute; override;
這是關(guān)鍵。
End;
---- 在這個類中定義了一個函數(shù)AdRead用于操作A/D卡,兩個過程用于顯示采集的進度與所用時間。需要注意的是AdRead函數(shù)是用匯編寫的,參數(shù)調(diào)用格式必須是safecall。
---- 關(guān)鍵的重載方法Execute的代碼如下:
Procedure SampleThread.Execute;
Begin
StartTicker := GetTickCount;
id := 0;
Repeat
thes := Adread(15) * ad2mv * mv2l;
采集*15通道
thep := Adread(3) * ad2mv * mv2n;
采集*3通道
dt := GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id] := dt;
inc(id);
Synchronize(UpdateCaption);
注意:顯示采集進度
Until id >=4096;
ed := GetTickCount;
Synchronize(ShowCostTime);
注意:顯示所用時間
end;
---- 從以上代碼中可見,Execute與一般的代碼并無本質(zhì)區(qū)別。僅有的區(qū)別是顯示采集進度和顯示所用時間時,不能直接調(diào)用各自的過程,而是通過調(diào)用Synchronize間接地調(diào)用。這樣作是為了保持進程間的同VB串口通訊與開關(guān)量的與輸出
摘要:本文介紹了以VB和計算機串口在一個小型配料工程中的應(yīng)用為例。詳盡的闡述了串口在配料系統(tǒng)中的應(yīng)用方法。特別在串口通訊中的開關(guān)量的和輸出要點。較大限度的降低了系統(tǒng)硬件所占工程中的成本。
引言:在一般的配料工程中,要一臺上位機對配料過程中所產(chǎn)生的一系列數(shù)據(jù)進行保存和統(tǒng)計,往往需要檢測來自現(xiàn)場的一些開關(guān)信號。在應(yīng)用工程中,在一般的上位機與稱量儀表的通訊過程中,一般只用了3個引腳(TXD ,RXD ,GND),而還有6個腳(CD,DSR,CTS,RI,DTR,RTS)沒有用到,而這些沒有用到的引腳就正好可用于和輸出開關(guān)量。
下面我將介紹基于VB6.0的平臺做的一個小項目。
工程概況:該項目是廣州科密集團公司用于一種新型耗材的配方研制所用的一個的自動配方管理軟件。由于實驗場所環(huán)境所限制,要求計算機不放在現(xiàn)場(不要求設(shè)立專人去操作計算機),只要求操作工人每稱量按一下秤臺旁邊的一個按鈕就可以存儲當(dāng)前每物料種類和其相應(yīng)的重量,使管理系統(tǒng)以這個實驗數(shù)據(jù)為依據(jù),進行整理和加工。最后得出一些綜合分析,為以后的正式生產(chǎn)提出配方工藝上的要求。因此系統(tǒng)本身就要求負責(zé)實時采集儀表的數(shù)據(jù);實時采集開關(guān)量(按鈕和轉(zhuǎn)換開關(guān)的狀態(tài));實時的提醒操作員當(dāng)些次配料是否有效果(根據(jù)配方來看是否報警也就是開關(guān)量的輸出);還有存儲當(dāng)前當(dāng)種物料的配料量,配方的管理,用戶日后的數(shù)據(jù)查詢和分析工作等。
根據(jù)這種要求,我們可以選擇一種RAD工具來作為開發(fā)平臺。
硬件配置:兩套計量設(shè)備(包含兩臺**輸出儀表)一臺計算機(工控機)
軟件:本實例采用Microsoft公司的Visual Basic 6.0作為開發(fā)平臺。Visual Basic是一種具有可視圖形界面的、快速開發(fā)工具,同時它也較流行的開發(fā)工具。它可以利用Mscomm控件來完成對串口的控制和開關(guān)量的采用以及開關(guān)量的輸出。
先介紹一下這九個引腳所代表的意義:
RXD表示接收數(shù)據(jù)
TXD表示發(fā)送數(shù)據(jù)
GND表示接地
注:(連接計算機和通訊儀表的接地端,開關(guān)量的輸入的公共端就用儀表的電源)
CD表示調(diào)制解調(diào)器通知通計算機有載波被檢測到
DTR表示計算機通知調(diào)制解調(diào)器可以進行傳輸
DSR表示調(diào)制解調(diào)器通知計算機準備就序
RI表示調(diào)制解調(diào)器通知計算機有電話打來
CTS表示調(diào)制解調(diào)器通知計算機可送出數(shù)據(jù)
RTS表示計算機要求調(diào)制解調(diào)器將數(shù)據(jù)發(fā)出
根據(jù)這些引腳的意義,我們將調(diào)制解調(diào)器當(dāng)成其它的外部設(shè)備, CD、DSR、RTS、RI可以用于開關(guān)量的輸入引腳。RTS和DTR可用于開關(guān)量的輸出。
具體方法如下:
在工程中,添加部件Microsoft Comm Control 6.0控件。
1. 控件屬性設(shè)置介紹:
Commport:設(shè)置或返回端口號。就是指 通訊的端口號, 用COMM1就設(shè)為1, 用COMM2就設(shè)為2, 但MSComm控件的較大值是16, 在本項目中同 時用了兩個口, 因為需要和兩臺儀表進行通訊(常用計算機有兩個串口, 如果串口不 夠用的話, 可以買串口卡)。
Settings:設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位 。參數(shù)格式為:"BBBB,P,D,S"。例如“9600, E, 7, 2”;在RS232中雙方必須完全一樣, 彼此才能順利的通信。否則的話將不 能正確的接收到來自對方的信號。
Handshaking:設(shè)置并返回硬件握手協(xié)議;(設(shè)為無)
InBufferSize:設(shè)置并返回接收緩沖區(qū)的字節(jié)數(shù);
OutBufferCount:返回在傳輸緩沖區(qū)中等待的字符數(shù)。也可以用它來傳輸緩沖區(qū);
DTREnable:確定在通訊時是否使 Data Terminal Ready (DTR) 線有效(設(shè)為有效)。
RTSEnable:確定在通訊時是否使 Request To Send (RTS) 線有效(設(shè)為有效)。
CommEvent:返回較近的通訊事件或錯誤。當(dāng)發(fā)生錯誤或事件會產(chǎn)生OnComm事件。
bbbbbMode:設(shè)置或返回bbbbb 屬性取回的數(shù)據(jù)的類型。它有兩個參數(shù), 0 表示以文字形式取回, 1表示以二進制形式取回。(設(shè)為0)
Rthreshold:設(shè)置并返回的要接收的字符數(shù)。
Sthreshold:設(shè)置并返回傳輸緩沖區(qū)中允許的較小字符數(shù)
bbbbbLen:設(shè)置并返回 bbbbb 屬性從接收緩沖區(qū)讀取的字符數(shù)。
2. 采集儀表當(dāng)前數(shù)據(jù)
提醒:要和儀表通訊,在參數(shù)(Comports、Settings)設(shè)置上必須相互吻合。
先要打開對象
MSComm1.PortOpen = True
MSComm2.PortOpen = True
Private Sub MSComm1_OnComm ()
If mEvent = comEvReceive Then // 收到Rthreshold # of
TxtReceive.Text = MSComm1.bbbbb //將到的信息賦予到文本框
found1 = InStr(TxtReceive.Text, "+") //以下數(shù)行是對所采集到的數(shù)據(jù)進行處理加工,較終得到我們想要的格式的數(shù)據(jù)。
… ……
If found1 > 0 Then
For i = 1 To leng Step 1
Strin1 = Mid(TxtReceive.Text, found1 + 1, 3)
Strin2 = Mid(TxtReceive.Text, found1 + 4, 3)
bbbbat(Val(strin2), "000")
Next i
display1.Caption = bbbbat(Val(strin1), "###0") + "." + bbbbat(Val(strin2), "00")
End If
End If
//本項目中,也就是需要兩個計量儀表的的當(dāng)前數(shù)據(jù))
3. 開關(guān)狀態(tài)的采集 //檢測四個引腳的工作狀態(tài)(就是判斷現(xiàn)場的開關(guān)狀態(tài)和按鈕狀態(tài))
在具體的應(yīng)用過程中,要添加一個TIMER控件用于循環(huán)的檢測這幾個輸入引腳的電位的高低。
Private Sub Timer1_Timer()
If MSComm1.CDHolding Then msgbox "CD is switch in! " //檢測CD腳的電位
… … … … //消息處理過程
If MSComm1.CTSHolding Then msgbox "CTS is switch in! "http://檢測CTS腳的電位
… … … … //消息處理過程
If MSComm1.DSRHolding Then msgbox "DSR is switch in! "http://檢測CTS腳的電位
… … … … //消息處理過程
If mEvent=comEvRing Then msgbox "RI is switch in!"http://檢測CTS腳的電位
… … … … //消息處理過程
End Sub
4. 兩個開關(guān)量的輸出 //就是控制兩個引腳的電位,5. 驅(qū)動的微型繼電器工作
如果操作員在具體的配料過程中,出現(xiàn)錯誤(**出了配方所要求物料品種的誤差范圍),軟件會將DTR或者是RTS引腳上的電位抬高,驅(qū)動微型繼電器來控制現(xiàn)場的報置。用報警來提示操作人員,本次配料不符合要求,需要添加或是減少份量。這樣可以實時的糾正不必要了操作失誤。
MSComm1.RTSEnable = True //抬高電位 使微型繼電器動作接通報警器
MSComm1.DTREnable = True
總結(jié):在本應(yīng)用工程已在現(xiàn)場運行快一年時間,實踐證明采用這種用串口來作開關(guān)量的和輸出方式作有限開關(guān)量輸入輸出是可行的,也是可靠。因此在類似這種小型應(yīng)用項目中,采用這種串口來作開關(guān)量的和輸出做法,即滿足了用戶要求,又為用戶提供了更多的選擇,同時控制了工程的成本。
潯之漫智控技術(shù)(上海)有限公司經(jīng)銷/CO-TRUST科思創(chuàng)西門子PLC;S7-200S7-300 S7-400 S7-1200 觸摸屏,變頻器,6FC,6SNS120 V10 V60 V80伺服數(shù)控備件:原裝進口電機,電線,電纜,希望能跟您有更多的合作機會。我公司經(jīng)營西門子全新原裝PLC;S7-200S7-300 S7-400 S7-1200 觸摸屏,變頻器,6FC,6SNS120 V10 V60 V80伺服數(shù)控備件:原裝進口電機(1LA7、1LG4、1LA9、1LE1),國產(chǎn)電機(1LG0,1LE0)大型電機(1LA8,1LA4,1PQ8)伺服電機(1PH,1PM,1FT,1FK,1FS)西門子保內(nèi)全新原裝產(chǎn)品‘質(zhì)保一年。一年內(nèi)因產(chǎn)品質(zhì)量問題免費更換新產(chǎn)品;不收取任何費。歡迎致電咨詢。


