版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器視覺綜合應(yīng)用第九章第九章機(jī)器視覺綜合應(yīng)用C#腳本編程9.1機(jī)器視覺生產(chǎn)線綜合案例9.2第九章
機(jī)器視覺綜合應(yīng)用C#腳本編程019.1C#腳本編程
?C#編程簡(jiǎn)介1.C#概述C#是微軟公司在2000年6月發(fā)布的一種新的編程語(yǔ)言,主要由安德斯·海爾斯伯格(AndersHejlsberg)主持開發(fā),它是第一個(gè)面向組件的編程語(yǔ)言。C#語(yǔ)言是一種現(xiàn)代、面向?qū)ο蟮恼Z(yǔ)言,它簡(jiǎn)化了C++語(yǔ)言在類、命名空間、方法重載和異常處理等方面的操作,它摒棄了C++的復(fù)雜性,更易使用,更少出錯(cuò)。它使用組件編程。C#語(yǔ)法和C++和JAVA語(yǔ)法非常相似。用C#編寫的源代碼被編譯成符合CLI規(guī)范的中間語(yǔ)言(IL)。IL代碼和資源(如位圖和字符串)存儲(chǔ)在程序集中,擴(kuò)展名通常為.dll。程序集包含一個(gè)介紹程序集的類型、版本和區(qū)域性的清單。C#概述C#基礎(chǔ)知識(shí)C#語(yǔ)言是Microsoft.NET框架中新一代的開發(fā)工具,是一種新的、面向?qū)ο蟮木幊陶Z(yǔ)言。它使得程序員可以快速地編寫各種基于Microsoft.NET平臺(tái)的應(yīng)用程序,Microsoft.NET提供了一系列的工具和服務(wù)來最大程度地開發(fā)利用計(jì)算與通訊領(lǐng)域。C#程序在.NET上運(yùn)行,而.NET是名為公共語(yǔ)言運(yùn)行時(shí)(CLR)的虛擬執(zhí)行系統(tǒng)和一組統(tǒng)一的類庫(kù)。CLR是Microsoft對(duì)公共語(yǔ)言基礎(chǔ)結(jié)構(gòu)(CLI)國(guó)際標(biāo)準(zhǔn)的商業(yè)實(shí)現(xiàn)。CLI是創(chuàng)建執(zhí)行和開發(fā)環(huán)境的基礎(chǔ),語(yǔ)言和庫(kù)可以在其中無縫地協(xié)同工作。通過CLR將MSIL轉(zhuǎn)換為具體CPU的代碼C#基礎(chǔ)知識(shí)編譯執(zhí)行.NET程序MSIL+元數(shù)據(jù)機(jī)器代碼代碼被執(zhí)行CLR第一次編譯第二次編譯.NET程序被編譯兩次。IL(中間語(yǔ)言,IntermediateLanguage)是C#、VB.NET等編程語(yǔ)言編譯后的代碼形式。Microsoft中間語(yǔ)言(MSIL)不是直接運(yùn)行的,而是需要通過CLR(CommonLanguageRuntime)在運(yùn)行時(shí)轉(zhuǎn)換為機(jī)器代碼。語(yǔ)言編譯器.NET源代碼C#基礎(chǔ)知識(shí)client.execlient.execlientlib.dllclient.exemodule程序集程序集是.NET框架中的基本部署單元,它包含了一個(gè)或多個(gè)類型的定義以及它們之間的關(guān)聯(lián)關(guān)系。程序集還包含了元數(shù)據(jù)、資源和其他相關(guān)信息。程序集的文件擴(kuò)展名通常為.exe或.dll,具體取決于實(shí)現(xiàn)的是應(yīng)用程序還是庫(kù)。C#基礎(chǔ)知識(shí)
“托管代碼”。執(zhí)行C#程序時(shí),程序集將加載到CLR。CLR會(huì)直接執(zhí)行實(shí)時(shí)(JIT)編譯,將IL代碼轉(zhuǎn)換成本機(jī)指令。.NETFramework類庫(kù)。.NET包含大量庫(kù),這些庫(kù)支持多種不同的工作負(fù)載。它們已整理到命名空間中,這些命名空間提供各種實(shí)用功能,包括文件輸入輸出、字符串控制、Web應(yīng)用程序框架和Windows窗體控件等。語(yǔ)言互操作性。C#編譯器生成的IL代碼符合公共類型規(guī)范(CTS)。通過C#生成的IL代碼可以與通過.NET版本的C++或其他20多種與CTS兼容的任何語(yǔ)言所生成的代碼進(jìn)行交互。C#基礎(chǔ)知識(shí)通用語(yǔ)言規(guī)范CLS
CommonLanguageSpecification規(guī)定所有.NET語(yǔ)言都應(yīng)遵循的規(guī)則生成可與其他語(yǔ)言互操作的應(yīng)用程序通用類型系統(tǒng)
(CommonTypeSystem,CTS)包含標(biāo)準(zhǔn)數(shù)據(jù)類型包含準(zhǔn)則集CLS、CTS和MSIL緊密配合以實(shí)現(xiàn)語(yǔ)言互操作性C#基礎(chǔ)知識(shí)C#示例程序C#中的關(guān)鍵組織結(jié)構(gòu)概念包括程序、命名空間、類型、成員和程序集。程序聲明類型,而類型則包含成員,并被整理到命名空間中。類型示例包括類、結(jié)構(gòu)和接口。成員示例包括字段、方法、屬性和事件。編譯完的C#程序?qū)嶋H上會(huì)打包到程序集中?!癏ello,World”程序的C#代碼如下:usingSystem;
//導(dǎo)入命名空間。classHello //類定義{/*解釋開始,和C語(yǔ)言解釋用法相同解釋結(jié)束*/staticvoidMain() //主程序,程序入口函數(shù),
//必須在一個(gè)類中定義{ Console.WriteLine("Hello,World");}}9.1C#腳本編程
C#示例程序“Hello,World”程序的C#代碼如下:usingSystem;
//導(dǎo)入命名空間。classHello //類定義{/*解釋開始,和C語(yǔ)言解釋用法相同解釋結(jié)束*/staticvoidMain() //主程序,程序入口函數(shù),必須在一個(gè)類中定義{ Console.WriteLine("Hello,World");}}命名空間提供了一種用于組織C#程序和庫(kù)的分層方法。命名空間包含類型和其他命名空間。例如,System命名空間包含許多類型(如程序中引用的Console類)和其他許多命名空間(如IO)。借助引用給定命名空間的using指令,可以非限定的方式使用作為相應(yīng)命名空間成員的類型。由于使用using指令,因此程序可以使用Console.WriteLine作為System.Console.WriteLine的簡(jiǎn)寫。在每個(gè)Console前加上一個(gè)前綴“System.”,這個(gè)小原點(diǎn)表示Console是作為System的成員而存在的。9.1C#腳本編程
C#示例程序“Hello,World”程序的C#代碼如下:usingSystem;
//導(dǎo)入命名空間。classHello //類定義{/*解釋開始,和C語(yǔ)言解釋用法相同解釋結(jié)束*/staticvoidMain() //主程序,程序入口函數(shù),必須在一個(gè)類中定義{ Console.WriteLine("Hello,World");}}C#程序中每個(gè)變量或函數(shù)都必須屬于一個(gè)類,包括主函數(shù)Main()。不能如C或C++那樣建立全局變量。C#語(yǔ)言程序總是從Main()方法開始執(zhí)行,一個(gè)程序中不允許出現(xiàn)兩個(gè)或兩個(gè)以上的Main()方法。staticvoidMain()是類Hello中定義的主函數(shù)。“Hello,World”程序聲明的Hello類只有一個(gè)成員,即Main方法。C#基礎(chǔ)知識(shí)命名空間就像在文件系統(tǒng)中一個(gè)文件夾容納多個(gè)文件一樣,可以看作某些類的一個(gè)容器。通過把類放入命名空間可以把相關(guān)的類組織起來,并且可以避免命名沖突。使用命名空間:using類似#includeusingSystem語(yǔ)句意義是導(dǎo)入System名字空間。using語(yǔ)句用于導(dǎo)入預(yù)定義的變量和函數(shù),這樣在自己的程序中就可以自由地使用這些變量和函數(shù)。C#基礎(chǔ)知識(shí)首先使用using語(yǔ)句,導(dǎo)入System命名空間。然后定義一個(gè)名為Hello的類。在Hello類中,定義了一個(gè)成員,即Main方法。在Main方法中,使用Console.WriteLine()方法輸出"Hello,World"。由于導(dǎo)入了System命名空間,因此程序可以使用Console.WriteLine作為System.Console.WriteLine的簡(jiǎn)寫?!癝ystem.”表示Console是System的成員。C#程序中每個(gè)變量或函數(shù)都必須屬于一個(gè)類,包括主函數(shù)Main()。C#語(yǔ)言程序總是從唯一的Main()方法開始執(zhí)行。“Hello,World”程序的C#代碼如下:usingSystem;
//導(dǎo)入命名空間。classHello //類定義{/*解釋開始,和C語(yǔ)言解釋用法相同解釋結(jié)束*/staticvoidMain() //主程序,程序入口函數(shù),
//必須在一個(gè)類中定義{ Console.WriteLine("Hello,World");}}9.1C#腳本編程
類的概念C#語(yǔ)言是一種現(xiàn)代、面向?qū)ο蟮恼Z(yǔ)言。面向?qū)ο蟪绦蛟O(shè)計(jì)方法提出了一個(gè)全新的概念:類,它的主要思想是將數(shù)據(jù)(數(shù)據(jù)成員)及處理這些數(shù)據(jù)的相應(yīng)方法(函數(shù)成員)封裝到類中,類的實(shí)例則稱為對(duì)象。這就是我們常說的封裝性。類可以認(rèn)為是對(duì)結(jié)構(gòu)的擴(kuò)充,它和C中的結(jié)構(gòu)最大的不同是:類中不但可以包括數(shù)據(jù),還包括處理這些數(shù)據(jù)的函數(shù)。類是對(duì)數(shù)據(jù)和處理數(shù)據(jù)的方法(函數(shù))的封裝。類是對(duì)某一類具有相同特性和行為的事物的描述。usingSystem;classPerson//類的定義,class是保留字,表示定義一個(gè)類,Person是類名{privatestringname="張三";//類的數(shù)據(jù)成員聲明privateintage=12; //private表示私有數(shù)據(jù)成員publicvoidDisplay() //類的方法(函數(shù))聲明,顯示姓名和年齡{Console.WriteLine("姓名:{0},年齡:{1}",name,age);}publicvoidSetName(stringPersonName)//修改姓名的方法(函數(shù)){name=PersonName;}}定義一個(gè)描述個(gè)人情況的類PersonC#基礎(chǔ)知識(shí)用戶自定義一個(gè)數(shù)據(jù)類型,類型名為Person。用定義新數(shù)據(jù)類型Person類的方法把數(shù)據(jù)和處理數(shù)據(jù)的函數(shù)封裝起來。Person類有兩個(gè)私有數(shù)據(jù)成員name,age;Person類中有兩個(gè)方法(函數(shù))成員:Display(),顯示姓名和年齡;SetName(stringPersonName),更改姓名;Person類僅是一個(gè)用戶新定義的數(shù)據(jù)類型,由它可以生成Person類的實(shí)例,C#語(yǔ)言叫對(duì)象。usingSystem;//類的定義,class是保留字,//表示定義一個(gè)類,Person是類名classPerson{privatestringname="張三";//類的數(shù)據(jù)成員聲明privateintage=12; //private表示私有數(shù)據(jù)成員//類的方法(函數(shù))聲明,顯示姓名和年齡publicvoidDisplay() {Console.WriteLine("姓名:{0},年齡:{1}",name,age);}//修改姓名的方法(函數(shù))publicvoidSetName(stringPersonName){name=PersonName;}}定義一個(gè)描述個(gè)人情況的類PersonC#基礎(chǔ)知識(shí)usingSystem;//類的定義,class是保留字,//表示定義一個(gè)類,Person是類名classPerson{privatestringname="張三";//類的數(shù)據(jù)成員聲明privateintage=12; //private表示私有數(shù)據(jù)成員//類的方法(函數(shù))聲明,顯示姓名和年齡publicvoidDisplay() {Console.WriteLine("姓名:{0},年齡:{1}",name,age);}//修改姓名的方法(函數(shù))publicvoidSetName(stringPersonName){name=PersonName;}}定義一個(gè)描述個(gè)人情況的類PersonclassProgram{staticvoidMain(string[]args){PersononePerson=newPerson();onePerson.Display();//輸出:姓名:張三,年齡:12onePerson.SetName("Deng");onePerson.Display();//輸出:姓名:Deng,年齡:12}}在程序中,可以用OnePerson.方法名或OnePerson.數(shù)據(jù)成員名訪問對(duì)象的成員。例如:OnePerson.Display()
;onePerson.SetName(“Deng");1)用如下方法聲明類的對(duì)象:PersonOnePerson=newPerson();2)也可以分兩步創(chuàng)建Person類的對(duì)象:PersonOnePerson;OnePerson=newPerson();9.1C#腳本編程
?C#腳本編程基礎(chǔ)1.C#腳本類型主要包括以下三種類型:Job腳本:作業(yè)腳本可以對(duì)取像過程進(jìn)行控制,可以設(shè)置取像參數(shù)、控制取像行為,例如:設(shè)置曝光、頻閃、自動(dòng)對(duì)焦等功能。ToolGroup腳本:在ToolGroup中添加腳本,可以控制ToolGroup的運(yùn)行行為。定義輸入輸出終端,控制工具運(yùn)行邏輯等。ToolBlock腳本:控制當(dāng)前ToolBlock所包含工具的行為,執(zhí)行邏輯以及拓展工具所不包含的計(jì)算等。9.1C#腳本編程
?C#腳本編程基礎(chǔ)2.ToolBlock的腳本ToolBlock的腳本父類CogToolBlockAdvancedScriptBase,該類提供了一組用于編寫ToolBlock腳本的基本方法和屬性。通過繼承CogToolBlockAdvancedScriptBase類,可以擴(kuò)展和定制ToolBlock的功能。兩個(gè)腳本基類,CogToolBlockSimpleScript與CogToolBlockAdvancedScript分別用于“簡(jiǎn)單腳本”與“復(fù)雜”腳本,兩者之間的區(qū)別在于復(fù)雜腳本能夠?qū)崿F(xiàn):1)動(dòng)態(tài)定義ToolBlock的輸入輸出終端。2)能夠訪問當(dāng)前工具塊所包含工具的所有屬性與方法。ToolBlock腳本C#腳本編程簡(jiǎn)單腳本:主要包括一系列單個(gè)步驟,每個(gè)步驟都對(duì)應(yīng)一個(gè)工具的操作。簡(jiǎn)單腳本的特點(diǎn)是代碼量較小,邏輯相對(duì)簡(jiǎn)單,易于理解和編寫。復(fù)雜腳本:包含多個(gè)步驟,其中每個(gè)步驟可能涉及到多個(gè)工具的操作。與簡(jiǎn)單腳本相比,復(fù)雜腳本的邏輯更為復(fù)雜,需要處理更多的情況和細(xì)節(jié)。復(fù)雜腳本能夠?qū)崿F(xiàn):①動(dòng)態(tài)定義toolBlock的輸入輸出終端,②能夠訪問當(dāng)前工具塊所包含工具的所有屬性與方法。//使用簡(jiǎn)單腳本為輸出賦值Outputs.Degrees=Inputs.Radians*180/Math.PI;//使用復(fù)雜腳本為輸出賦值this.mToolBlock.Outputs["Degrees"].Value=((double)this.mToolBlock.Inputs["Radians"].Value)*180/Math.PI;9.1C#腳本編程
?C#腳本編輯9.1C#腳本編程
?C#腳本編輯1.添加命名空間如果在創(chuàng)建腳本之前將視覺工具都添加完畢,在創(chuàng)建腳本的時(shí)候,系統(tǒng)會(huì)自動(dòng)添加全部所需的命名空間。如果后期又有新的視覺工具添加到程序中,需要自己添加命名空間。如下所示,添加以下命名空間。usingCognex.VisionPro;usingCognex.VisionPro.ToolBlock;usingCognex.VisionPro.PMAlign;分類名稱命名空間無分類CogAcqFifoToolCognex.VisionPro.CogAcqFifoToolCogBlobToolCognex.VisionPro.BlobCogCaliperToolCognex.VisionPro.CaliperCogCNLSearchToolCognex.VisionPro.CNLSearchCogToolBlockCognex.VisionPro.ToolBlockCogPatInspectToolCognex.VisionPro.PatInspectCogPMAlignToolCognex.VisionPro.PMAlignID&VerificationCogIDToolCognex.VisionPro.IDCogOCRMaxToolCognex.VisionPro.OCRMaxCogOCVMaxToolCognex.VisionPro.OCVMax9.1C#腳本編程
?C#腳本編輯1.添加命名空間如果在腳本編譯時(shí),遇到“未能找到類型或命名空間名稱‘XXX’(是否缺少using指令或程序集引用?)”的錯(cuò)誤時(shí),可打開VisionPro幫助文檔,輸入對(duì)應(yīng)工具類。查看需要引用的命名空間名稱及需要導(dǎo)入的程序集(dll)。9.1C#腳本編程
?C#腳本編輯1.添加命名空間若先創(chuàng)建C#高級(jí)腳本,后在ToolBlock中增加新工具,則需要手動(dòng)添加參考程序集。找到需要導(dǎo)入的程序集,進(jìn)行導(dǎo)入,并在腳本開頭引入對(duì)應(yīng)命名空間。9.1C#腳本編程
?C#腳本編輯2.定義成員變量可以定義一些后續(xù)會(huì)用到的變量,可以隨時(shí)添加、刪除這些變量。在方法外面,定義全局變量,如康耐視自動(dòng)生成的變量:privateCognex.VisionPro.ToolBlock.CogToolBlockmToolBlock;//定義工具變量以下常見的定義的工具變量如下:
privateCognex.VisionPro.Blob.CogBlobToolmCogBlob;privateCognex.VisionPro.Caliper.CogCaliperToolmCogCaliper;privateCognex.VisionPro.Caliper.CogFindCircleToolmCogFindCircle;privateCogGraphicCollectionlabels;privateCogGraphicLabelmyLabel;9.1C#腳本編程
?C#腳本編輯3.定義GroupRun方法工具組運(yùn)行時(shí),調(diào)用此方法。如果此方法返回True,Visionpro將運(yùn)行此ToolBlock中的所有工具;如果返回值設(shè)為False,將由用戶來編寫代碼手動(dòng)運(yùn)行ToolBlock中的工具。為了能夠在TooIBlock腳本中獨(dú)立運(yùn)行視覺工具,可以使用TooIBlock的Tools屬性??梢酝ㄟ^兩種方法來引用視覺工具,一是通過索引,二是通過工具名稱。一般來講,通過名稱來引用視覺工具更為方便,因?yàn)榭梢詾槠涠x有實(shí)際意義的名稱,以便于理解和記憶。例如:CogBlobTool_cogBlob=(CogBlobTool)mToolBlock.Tools["CogBlobTool1"];//通過名稱CogBlobTool_cogBlob=(CogBlobTool)mToolBlock.Tools[4];//通過索引9.1C#腳本編程
?C#腳本編輯3.定義GroupRun方法publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//獲取視覺工具箱中的工具,進(jìn)行實(shí)例初始化CogBlobToolmCogBlob=mToolBlock.Tools["CogBlobTool1"]asCogBlobTool;CogCaliperToolmCogCaliper=mToolBlock.Tools["CogCaliperTool1"]asCogCaliperTool;CogFindCircleToolmCogFindCircle=mToolBlock.Tools["CogFindCircleTool1"]asCogFindCircleTool;mCogFindCircle.Run();//運(yùn)行CogFindCircleTool1工具mCogBlob.Run();//運(yùn)行"CogBlobTool1工具returntrue;}9.1C#腳本編程
?C#腳本編輯4.CurrentRunRecord方法ModifyCurrentRunRecord()方法用于修改CurrentRecord,在ToolBlock的CurrentRecord被創(chuàng)建后調(diào)用。VisionPro工具記錄是一種靈活的分層數(shù)據(jù)結(jié)構(gòu),所有VisioPro工具都使用工具記錄來記錄和報(bào)告有關(guān)其狀態(tài)的信息。存儲(chǔ)在工具記錄中的信息可以包括輸入、訓(xùn)練和輸出圖像,輸入?yún)^(qū)域,工具結(jié)果和工具結(jié)果圖形。CurrentRecords當(dāng)前記錄,LastRunRecords最近運(yùn)行記錄。9.1C#腳本編程
?C#腳本編輯5.LastRunRecord方法ModifyLastRunRecord()方法用于修改LastRunRecord,在ToolBlock的LastRunRecord被創(chuàng)建后調(diào)用。用于腳本運(yùn)行完畢最后的結(jié)果的處理。例如:在最終生成圖像中添加標(biāo)簽、顏色等,用不同幾何圖像標(biāo)記目標(biāo)區(qū)域。ModifyLastRunRecord輸出執(zhí)行結(jié)果??赏ㄟ^mToolBlock.AddGraphicToRunRecord方法把結(jié)果輸出到界面上。函數(shù)AddGraphicToRunRecord有四個(gè)參數(shù);第一個(gè)參數(shù)是:CogGraphicLabel類型;第二個(gè)參數(shù)是:lastRecord;一般是這個(gè)值;第三個(gè)參數(shù)是:標(biāo)簽要寫入的圖片,選擇某個(gè)工具的輸出圖片;第四個(gè)參數(shù)是:一般為空字符串。9.1C#腳本編程
?C#腳本編輯5.LastRunRecord方法publicoverridevoidModifyLastRunRecord(Cognex.VisionPro.ICogRecordlastRecord){//顯示foreach(ICogGraphicgraphicinlabels){mToolBlock.AddGraphicToRunRecord(graphic,lastRecord,"CogFindCircleTool1.InputImage","script");}labels.Clear();CogGraphicLabellabel=newCogGraphicLabel();label.SetXYText(160,50,"齒數(shù):"+mCogBlob.Results.GetBlobs().Count.ToString());label.Font=newFont("微軟黑體",10);label.Color=Cognex.VisionPro.CogColorConstants.Blue;mToolBlock.AddGraphicToRunRecord(label,lastRecord,"CogFindCircleTool1.InputImage","script");}9.1C#腳本編程
?C#腳本編輯6.初始化方法當(dāng)關(guān)閉腳本編譯器且編譯腳本時(shí)調(diào)用。所有的“一次性”的初始化工作都應(yīng)該寫在該方法中。publicoverridevoidInitialize(Cognex.VisionPro.ToolGroup.CogToolGrouphost){//DONOTREMOVE-Callthebaseclassimplementationfirst-DONOTREMOVEbase.Initialize(host);//實(shí)例化。注:在使用類的非靜態(tài)方法或?qū)傩詴r(shí),必須將類實(shí)例化
this.mCogBlob=newCogBlobTool();this.mCogFindCircle=newCogFindCircleTool();this.labels=newCogGraphicCollection();//Storealocalcopyofthescripthostthis.mToolBlock=((Cognex.VisionPro.ToolBlock.CogToolBlock)(host));}9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一任務(wù)要求:需要測(cè)量零件寬度,測(cè)量中間兩個(gè)小孔的圓心距離,對(duì)其圓心間的測(cè)量距離進(jìn)行公差分析,做出合格與否的判斷,在圖形上顯示相關(guān)數(shù)據(jù)。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一任務(wù)分析:對(duì)于零件,首先要采集圖像,然后對(duì)圖像特征提取,建立特征坐標(biāo)系。然后,通過卡尺工具(CogCaliperTool)測(cè)量中間寬度。采用CogFindCircleTool工具分別找到中間兩個(gè)小孔的圓心。運(yùn)行ToolBlock的C#高級(jí)腳本編程,求出兩個(gè)小孔的圓心距離,輸出到ToolBlock的終端輸出端,并將距離在圖像上顯示。任務(wù)流程設(shè)計(jì)在V+程序中建立一個(gè)任務(wù)流程。主要包括觸發(fā)信號(hào)、取像、視覺工件塊和結(jié)果圖像。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一視覺任務(wù)(ToolBlock)流程設(shè)計(jì)視覺工件塊ToolBlock中包含CogPMAlignTool、CogFixtureTool、CogCaliperTool、CogFindCircleTool等工具。選擇視覺工具的輸出終端“Outputs”,右鍵選擇“addnewsystemtypes”然后,進(jìn)入“>”,選擇“addnewsystem.Double”,將輸出的Double類型的變量命名為“Distance”。添加“addnewsystemtypes”>“addnewsystem.Boolean”,將添加的輸出變量命名為“Dis_OK”。將“CogCaliperTool1”卡尺工具測(cè)量的結(jié)果“Results.Item[0].Width”鏈接到輸出終端,并命名為“Width”9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一各工具運(yùn)行成功后,然后進(jìn)入“C#高級(jí)編程”設(shè)計(jì)界面。3.腳本編輯(1)添加命名空間如果所有的視覺工具都運(yùn)行成功,此時(shí)進(jìn)入腳本編輯器,那視覺工具組織樹中的所有工具所需的命名空間都已存在,不需要另外添加。(2)定義成員變量定義GraphicLable的全局變量。privateCogGraphicLabelmLab;(3)調(diào)用GroupRun方法在GourpRun運(yùn)行時(shí),各工具遍歷運(yùn)行。獲取對(duì)應(yīng)工具運(yùn)行后的結(jié)果。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一3.腳本編輯publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//將兩個(gè)CogFindCircleTool初始化
CogFindCircleToolcircle1=mToolBlock.Tools["CogFindCircleTool1"]asCogFindCircleTool;CogFindCircleToolcircle2=mToolBlock.Tools["CogFindCircleTool2"]asCogFindCircleTool;//求解兩個(gè)圓心的距離
doublex1=circle1.Results.GetCircle().CenterX;doubley1=circle1.Results.GetCircle().CenterY;doublex2=circle2.Results.GetCircle().CenterX;doubley2=circle2.Results.GetCircle().CenterY;doubledis=Math.Sqrt(Math.Pow(x1-x2,2)+Math.Pow(y1-y2,2));9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一3.腳本編輯//在ToolBlock的終端輸出距離(Distance)值
mToolBlock.Outputs["Distance"].Value=dis;//在ToolBlock的終端輸出判斷結(jié)果(Dis_OK)值
if((dis>218)&&(dis<220)){mToolBlock.Outputs["Dis_OK"].Value=true;}else{mToolBlock.Outputs["Dis_OK"].Value=false;}//創(chuàng)建輸出的圖形標(biāo)簽,包括圖形標(biāo)簽的字體,顏色,放置的X,Y坐標(biāo)位置及內(nèi)容。mLab=newCogGraphicLabel();//實(shí)例化圖形標(biāo)簽變量
mLab.Font=newFont("宋體",18);//設(shè)置字體及大小
mLab.Color=CogColorConstants.Green;//設(shè)置顏色
mLab.SetXYText(100,80,"圓孔距離:"+dis.ToString("0.00"));//設(shè)置放置位置及內(nèi)容
returnfalse;}9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一3.腳本編輯(4)調(diào)用ModifyLastRunRecord方法在最終生成圖像中添加圖形標(biāo)簽。publicoverridevoidModifyLastRunRecord(Cognex.VisionPro.ICogRecordlastRecord){mToolBlock.AddGraphicToRunRecord(mLab,lastRecord,"CogFixtureTool1.OutputImage","script")}9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一4.HMI界面設(shè)計(jì)在V+界面設(shè)計(jì)器中,輸出采集到的尺寸及分析結(jié)果。視覺工具塊運(yùn)行后,在“CogFixtureTool1.OutputImage”的最終生成圖像中添加圖形標(biāo)簽。視覺工具塊(ToolBlock)的終端輸出“Distance”、“Dis_OK”、“Width”可在V+程序中的HMI界面設(shè)計(jì)中輸出。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目一9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二任務(wù)要求要求統(tǒng)計(jì)和顯示各個(gè)顏色糖果的個(gè)數(shù)。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二1.程序流程設(shè)計(jì)在V+程序中建立一個(gè)任務(wù)流程。主要包括觸發(fā)信號(hào)、取像、視覺工件塊和結(jié)果圖像。2.視覺工具塊流程設(shè)計(jì)在ToolBlock中,建有CogPMAlignTool、CogCompositeColorMatchTool等工具。選擇視覺工具的輸出終端“Outputs”,右鍵選擇“addnewsystemtypes”然后,進(jìn)入“>”,選擇“addnewsystem.Int32”,將輸出的整數(shù)類型(Int32)的變量命名為“Red_count”。依照同樣方法,依次添加“Blue_count”、“Orange_count”、“Yellow_count”、“Green_count”。把CogPMAlignTool工具的“Results”進(jìn)行添加輸出。CogPMAlignTool工具運(yùn)行輸出的結(jié)果“Results_Count”添加到終端輸出。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二2.視覺工具塊流程設(shè)計(jì)(2)特征提取工具在CogPMAlignTool工具運(yùn)行之前,先用CogImageConvertTool工具把圖像轉(zhuǎn)換成灰度圖像。在設(shè)置“運(yùn)行參數(shù)”時(shí),設(shè)置如圖所示。查找概數(shù)設(shè)置為圖像中的糖果最大數(shù)。訓(xùn)練區(qū)域?yàn)閳A形,在“縮放”設(shè)置時(shí),縮放因子應(yīng)設(shè)置足夠?qū)?,能夠把大大小小的圓形(或橢圓形)的糖果都包含在內(nèi)。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二2.視覺工具塊流程設(shè)計(jì)(3)顏色匹配工具CogCompositeColorMatchTool可用于將運(yùn)行時(shí)圖像目標(biāo)區(qū)域(ROI)中的顏色分布與一種或多種經(jīng)過訓(xùn)練的顏色樣本進(jìn)行比較。對(duì)于每個(gè)受過訓(xùn)練的樣本,輸出的分?jǐn)?shù)在0到1的范圍內(nèi)。該工具還會(huì)計(jì)算0到1范圍內(nèi)的置信度得分,該得分將訓(xùn)練樣本的得分之間的差異進(jìn)行比較。高置信度得分表示是最合適的匹配對(duì)象。如圖所示,對(duì)于CogCompositeColorMatchTool工具,先設(shè)置目標(biāo)區(qū)域。設(shè)置成“CogCircle”,區(qū)域的中心點(diǎn)即圓點(diǎn)坐標(biāo)可以用腳本編程輸入。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二2.視覺工具塊流程設(shè)計(jì)(3)顏色匹配工具設(shè)置目標(biāo)區(qū)域后,然后點(diǎn)擊“新增”,添加目標(biāo)區(qū)域的顏色設(shè)置。設(shè)置區(qū)域顏色名稱后,進(jìn)行接受。然后,進(jìn)行訓(xùn)練。如圖所示。依次把圖像中所有的顏色(Red、Blue、Orange、Green、Yellow)都訓(xùn)練完。9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二3.腳本編輯publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//定義統(tǒng)計(jì)顏色個(gè)數(shù)的整數(shù)變量,并且初始化
intRed_count=0;intBlue_count=0;intOrange_count=0;intYellow_count=0;intGreen_count=0;//獲取PMAlign工具
CogPMAlignToolPma1=mToolBlock.Tools["CogPMAlignTool1"]asCogPMAlignTool;9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二3.腳本編輯
//獲取CompositeColorMatch工具CogCompositeColorMatchToolmatch=mToolBlock.Tools["CogCompositeColorMatchTool1"]asCogCompositeColorMatchTool;//定義顏色匹配工具的區(qū)域圖形,為圓形區(qū)域
CogCircleregion=match.RegionasCogCircle;//遍歷運(yùn)行CogPMAlign產(chǎn)生的每一個(gè)結(jié)果
foreach(CogPMAlignResultiteminPma1.Results){//將CogPMAlign結(jié)果的中心點(diǎn)坐標(biāo)傳給的顏色匹配工具的區(qū)域中心點(diǎn)
region.CenterX=item.GetPose().TranslationX;region.CenterY=item.GetPose().TranslationY;//運(yùn)行顏色匹配工具
mToolBlock.RunTool(match,refmessage,refresult);9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二3.腳本編輯//輸出顏色匹配工具輸出的顏色
stringcolor=match.Result.ResultOfBestMatch.Color.Name;//統(tǒng)計(jì)各個(gè)顏色匹配的總數(shù)
switch(color){case"Red":Red_count++;break;case"Blue":Blue_count++;break;case"Orange":Orange_count++;break;case"Yellow":Yellow_count++;break;case"Green":Green_count++;break;default:break;}9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二3.腳本編輯//將遍歷PMAlignTool工具的各個(gè)顏色統(tǒng)計(jì)結(jié)果傳遞給輸出端相應(yīng)的變量值。
mToolBlock.Outputs["Red_count"].Value=Red_count;mToolBlock.Outputs["Blue_count"].Value=Blue_count;mToolBlock.Outputs["Orange_count"].Value=Orange_count;mToolBlock.Outputs["Yellow_count"].Value=Yellow_count;mToolBlock.Outputs["Green_count"].Value=Green_count;}returnfalse;}9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二4.HMI界面設(shè)計(jì)9.1C#腳本編程
?C#腳本編程實(shí)例項(xiàng)目二第九章
機(jī)器視覺綜合應(yīng)用機(jī)器視覺生成線綜合案例029.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)要求綜合案例涵蓋機(jī)器視覺四大類應(yīng)用:測(cè)量、識(shí)別、檢測(cè)和引導(dǎo)。綜合場(chǎng)景即前面所說的工業(yè)場(chǎng)景7,如圖所示。在上料單元有三種不同類型的鋰電池,在九宮格內(nèi)任意位置放置,通過移動(dòng)相機(jī)在上料區(qū)走九宮格拍照,經(jīng)過視覺處理區(qū)分料號(hào)、識(shí)別鋰電池上的字符和二維碼、進(jìn)行尺寸測(cè)量和分析,引導(dǎo)移動(dòng)模組抓取工件。模組攜帶工件丟在流水線上,被傳送到流水線上固定相機(jī)下停止。相機(jī)拍照引導(dǎo)模組抓取工件,移動(dòng)到裝配平臺(tái)。裝配平臺(tái)上也有三種料盤(定位模塊),分別對(duì)應(yīng)三種鋰電池。固定相機(jī)位于料盤上方拍照,經(jīng)過視覺處理找到及區(qū)分料盤類別。引導(dǎo)移動(dòng)模組移動(dòng)到對(duì)應(yīng)料盤,進(jìn)行精準(zhǔn)裝配。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施1.硬件配置(1)添加相機(jī)該項(xiàng)目需要配置3臺(tái)相機(jī):移動(dòng)相機(jī)、右側(cè)面光源上方固定組裝相機(jī)、傳送帶上方相機(jī)。1號(hào)相機(jī)為移動(dòng)CCD,IP地址為0;2號(hào)相機(jī)為固定CCD,IP地址為0;3號(hào)相機(jī)為皮帶CCD,IP地址為0。(2)添加光源該項(xiàng)目一共包含8個(gè)光源,分別使用兩個(gè)光源控制器(分別命名為德創(chuàng)1、德創(chuàng)2)控制,端口號(hào)分別為COM1和COM2,波特率19200。(3)添加PLC“設(shè)備”→“PLC”→“三菱”,添加三菱PLC。設(shè)置三菱PLC參數(shù)為,IP地址:0;端口號(hào):502;編碼:ASCII;數(shù)據(jù)格式:CDAB;字符串顛倒。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(1)標(biāo)定程序設(shè)計(jì)如圖所示,將標(biāo)定片放置在裝配單元上預(yù)定的固定初始位置。首先,機(jī)械手吸取標(biāo)定片,進(jìn)行移動(dòng),將標(biāo)定片放置在右側(cè)面光源中間。機(jī)械手移開,觸發(fā)固定相機(jī)(從相機(jī)2)拍照取像。
然后,機(jī)械手吸取標(biāo)定片,放置到左側(cè)面光源中間。按照做9點(diǎn)平移和2點(diǎn)旋轉(zhuǎn)的路線,依次觸發(fā)移動(dòng)相機(jī)(主相機(jī)1)進(jìn)行拍照取像。最后,機(jī)械手吸嘴標(biāo)定片,放置在流水線上白色墊板上。移開后,觸發(fā)皮帶上固定相機(jī)(從相機(jī)3)拍照。
至此,三個(gè)相機(jī)的聯(lián)合結(jié)束,經(jīng)過分析出來,最終形成三個(gè)標(biāo)定文件。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(1)標(biāo)定程序設(shè)計(jì)1)等待觸發(fā)。在“信號(hào)”工具組中的“PLC掃描”工具,掃描接受PLC中的D168地址發(fā)來的“標(biāo)定”指令--1,“觸發(fā)條件”設(shè)置變?yōu)?。也即如果收到PLC發(fā)送到D168地址的數(shù)據(jù)為1,就觸發(fā)標(biāo)定流程。2)解析指令字符串。觸發(fā)之后用“通訊”工具組中的“讀PLC”工具讀取PLC中的地址D120開始長(zhǎng)度為92的指令字符串。用“數(shù)據(jù)”工具組中的“字符串操作”工具將前面“讀PLC”工具接受到的字符串值去掉空格和不可打印字符,并將經(jīng)過“字符串操作”上述操作后的值輸出,輸出變量命名為“@Trim2”。將去空格后的字符串用逗號(hào)進(jìn)行分割,索引3為相機(jī)號(hào),將相機(jī)號(hào)輸出為變量(“@Split1”)。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(1)標(biāo)定程序設(shè)計(jì)3)分支和光源打開。選用“分支”工具,數(shù)據(jù)來源為前步驟“字符串操作”工具輸出的“@Split1”,即相機(jī)號(hào),根據(jù)相機(jī)號(hào)(1、2、3),分成3個(gè)分支,選擇在相應(yīng)位置的光源亮起。分支1:控制主相機(jī)1(移動(dòng)相機(jī))對(duì)應(yīng)的光源開啟,將左側(cè)取料位對(duì)應(yīng)光源(德創(chuàng)1的光源通道1、2、3)亮起。分支2:控制從相機(jī)2(右側(cè)固定組裝相機(jī))放料區(qū)對(duì)應(yīng)的光源(德創(chuàng)1的光源通道1、2、4)開啟。分支3:控制從相機(jī)3(傳送帶上方相機(jī))對(duì)應(yīng)的光源(德創(chuàng)1的光源通道2,德創(chuàng)2的光源通道1)開啟。“分支選擇”工具無需配置,目的是將多條分支進(jìn)行合并選擇,否則后續(xù)工具無法同時(shí)鏈接多條流程。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(1)標(biāo)定程序設(shè)計(jì)4)手眼標(biāo)定。采用“引導(dǎo)”工具組(行業(yè)模塊)中的“手眼標(biāo)定”工具。圖像來源:選擇設(shè)備管理內(nèi)已有的3個(gè)相機(jī),即為編號(hào)分別為1(移動(dòng)相機(jī)為主相機(jī)1)、2(固定抓料相機(jī)為從相機(jī)2)、3(皮帶相機(jī)為從相機(jī)3)。手眼標(biāo)定結(jié)束后,會(huì)自動(dòng)生產(chǎn)主、從相機(jī)標(biāo)定文件。3個(gè)標(biāo)定文件自動(dòng)被保存在硬盤指定的文件夾下,如為程序文件夾下的“/Config/Guide/Calibratoin/”文件夾下的“1295_主機(jī)位1.vpp”、“1295_從機(jī)位2.vpp”、“1295_從機(jī)位3.vpp”文件。5)光源關(guān)閉。用“光源設(shè)定”工具,將已經(jīng)打開的各光源關(guān)閉。6)反饋信息。標(biāo)定步驟完成后,需要發(fā)送信號(hào)給PLC?!胺种А惫ぞ咭浴笆盅蹣?biāo)定”工具成功與否的Bool量作為分支依據(jù)。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(2)移動(dòng)抓取位置標(biāo)準(zhǔn)位示教(訓(xùn)練吸嘴)程序流程設(shè)計(jì)和之前的標(biāo)準(zhǔn)位示教程序類似,采用“引導(dǎo)”工具組中的“標(biāo)準(zhǔn)位示教”工具。通過“寫變量”工具,將“標(biāo)準(zhǔn)位示教”工具輸出軸的X/Y/R和ToolBlock里Outputs導(dǎo)出的鋰電池圖像X/Y/R(注意:圖像R變量應(yīng)為角度轉(zhuǎn)換后的值)值寫到“變量管理”創(chuàng)建的相應(yīng)的六個(gè)變量中。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(3)皮帶相機(jī)抓取位置標(biāo)準(zhǔn)位示教(訓(xùn)練吸嘴)程序流程設(shè)計(jì)傳送帶上相機(jī)實(shí)現(xiàn)功能也為抓取,這部分也需要進(jìn)行標(biāo)準(zhǔn)位示教。大部分與上面所述的移動(dòng)相機(jī)抓取位置示教相同。這里只介紹不同部分?!癙LC掃描工具”:地址為D168,這里“觸發(fā)條件”設(shè)置變?yōu)?0。“取像”工具:相機(jī)為皮帶上相機(jī)。在“標(biāo)準(zhǔn)位示教工具”:在第二步驟“標(biāo)定設(shè)置”選擇“從機(jī)位3”的標(biāo)定文件。皮帶相機(jī)抓取的位置和移動(dòng)相機(jī)抓取的位置不同。同樣,“標(biāo)準(zhǔn)位示教”工具輸出ImageX、ImageY、ImageR和軸坐標(biāo)RobotX、RobotY、RobotR。將ImageR由弧度進(jìn)行角度轉(zhuǎn)換。這里另外建立6個(gè)Double類型變量:3TRX/3TRY/3TRR,3TIX/3TIY/3TIR。分別是訓(xùn)練相機(jī)3示教位時(shí),軸X/Y/R(3TRX/3TRY/3TRR),圖像X/Y/R(3TIX/3TIY/3TIR)。通過“寫變量”工具,將“標(biāo)準(zhǔn)位示教”工具輸出軸的X/Y/R(RobotX/Y/R)和ToolBlock里Outputs導(dǎo)出的鋰電池圖像X/Y/R值寫到“變量管理”創(chuàng)建的相應(yīng)的六個(gè)變量中。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(4)標(biāo)準(zhǔn)位示教(訓(xùn)練吸嘴)程序?qū)嵅僬{(diào)試鋰電池初始被放置在右面光源左上角,且電池凸起位于下方。標(biāo)定時(shí)放于皮帶上的白色墊塊不再需要。機(jī)械手移動(dòng)到鋰電池初始位置,抓取鋰電池后放置于左側(cè)面光源上,機(jī)械手抬起,移動(dòng)相機(jī)拍照,程序中可以查看鋰電池中心點(diǎn)和旋轉(zhuǎn)角度情況。機(jī)械手吸取鋰電池到下一個(gè)抓取位置(皮帶上相機(jī))進(jìn)行示教。機(jī)械手移開,相機(jī)拍照,程序中可以查看鋰電池中心點(diǎn)和旋轉(zhuǎn)角度情況。至此,訓(xùn)練吸嘴流程結(jié)束。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓取和之前程序類似,步驟如下:1)觸發(fā)程序。2)解析指令字符串。使用“讀PLC”工具讀取當(dāng)前軸坐標(biāo)X/Y/R。3)添加變量。在“變量管理”里增加兩個(gè)Double類型變量,命名為TrigX和TrigY。用“寫變量”工具分別寫入經(jīng)“格式轉(zhuǎn)換”后的X和Y,即當(dāng)前拍照位置的X和Y。4)取像。5)特征定位。采用“引導(dǎo)”工具組中的“特征定位”工具。此步驟可以由移動(dòng)相機(jī)抓取位置標(biāo)準(zhǔn)位示教程序右側(cè)進(jìn)行導(dǎo)出,再在此右側(cè)進(jìn)行導(dǎo)入,抓取更準(zhǔn)確。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓取6)判斷料號(hào)?!芭袛嗔咸?hào)”為“ToolBlock”工具,用于判斷鋰電池型號(hào)。抓取定位之后,利用“Histogram”算法分別對(duì)鋰電池的尾部和頂部進(jìn)行灰度值平均值統(tǒng)計(jì),將結(jié)果添加輸出,用于后續(xù)的邏輯判斷。將灰度直方圖運(yùn)算的均值鏈接到終端輸出,并分別名為“Top”、“Tail”。7)測(cè)量及識(shí)別。測(cè)量及識(shí)別也為“ToolBlock”工具,用于檢測(cè)鋰電池的長(zhǎng)度及識(shí)別鋰電池上的二維碼及字符信息。測(cè)量之前,先用棋盤格標(biāo)定片進(jìn)行標(biāo)定。也可以用前面標(biāo)定程序流程中已經(jīng)標(biāo)定過的vpp文件進(jìn)行導(dǎo)入,在此導(dǎo)入的Toolblock工具塊中,用其中的CheckerBorad標(biāo)定。然后建立特征坐標(biāo)系。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓取基于標(biāo)定后的特征坐標(biāo)系,用CogCaliperTool卡尺工具,測(cè)量鋰電池的長(zhǎng)度。將長(zhǎng)度鏈接到終端輸出,命名為“Length”。用CogIDTool工具識(shí)別鋰電池上的二維碼(QR代碼),將識(shí)別結(jié)果鏈接到終端輸出,命名為ID_StringOCR_String。用CogOCRMaxTool工具識(shí)別鋰電池上的字符信息,將識(shí)別的字符信息鏈接到終端輸出,命名為OCR_String。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓取8)腳本運(yùn)算。腳本運(yùn)算是“ToolBLock”工具,主要是應(yīng)用ToolBlock的C#高級(jí)編程功能。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓取8)腳本運(yùn)算。在“Inputs”端,通過“Addnewsystemtypes”后“Addnewsystem.Double”,添加若干Double類型的變量。Top、Tail:分別為前面“判斷料號(hào)”視覺工具塊輸出的Top、Tail。ImageX、ImageY、ImageR分別為前面特征定位輸出的圖像的X、Y、R。TrigX、TrigY分別是系統(tǒng)變量TrigX、TrigY的值。Dis為“測(cè)量及識(shí)別”視覺工具塊輸出的“Length”。在“Outputs”端,通過“Addnewsystemtypes”后“Addnewsystem.string”,添加“Mode”(string)輸出變量。通過“Addnewsystemtypes”后“Addnewsystem.Double”,添加若干Double類型的變量“ImageX_output”、“ImageY_output”、“ImageR_output”。通過“Addnewsystemtypes”后“Addnewsystem.Boolean”,添加“Dis_OK”(Boolean)輸出變量。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//將輸入端的各個(gè)變量的值取出來賦值給自定義的相應(yīng)的變量
doubleTop=(double)mToolBlock.Inputs["Top"].Value;doubleTail=(double)mToolBlock.Inputs["Tail"].Value;doubleImageX=(double)mToolBlock.Inputs["ImageX"].Value;doubleTrigX=(double)mToolBlock.Inputs["TrigX"].Value;doubleImageY=(double)mToolBlock.Inputs["ImageY"].Value;doubleTrigY=(double)mToolBlock.Inputs["TrigY"].Value;doubleImageR=(double)mToolBlock.Inputs["ImageR"].Value;//對(duì)應(yīng)輸出變量,定義各變量
stringModel="A";//=(string)mToolBlock.Outputs["Model"].Value;doubleImageX_output;doubleImageY_output;doubleImageR_output;boolDis_OK;9.2機(jī)器視覺生產(chǎn)線綜合案例
?腳本編輯
//進(jìn)行鋰電池的型號(hào)判斷(A、B、C型號(hào))
if(Top<50&&Tail<50){Model="A";}
if(Top<50&&Tail>50){Model="B";}
if(Top>50&&Tail<50){Model="C";}//對(duì)測(cè)量的鋰電池長(zhǎng)度進(jìn)行分析,在公差范圍,則輸出true;否則輸出false。
if(Dis<=34.3&&Dis>=33.7){Dis_OK=true;}else{Dis_OK=false;}9.2機(jī)器視覺生產(chǎn)線綜合案例
?腳本編輯
//進(jìn)行有偏移量的圖像坐標(biāo)值的計(jì)算//*計(jì)算公式為:ImageX+TrigX-CalibX。//ImageX:“分支選擇”內(nèi)的數(shù)據(jù)項(xiàng),也即“特征抓取”后輸出的ImageX。//TrigX:前面步驟存到“變量管理”內(nèi)的TrigX,當(dāng)前拍照時(shí)的軸坐標(biāo)X。//CalibX:標(biāo)定時(shí)在中心位置拍照時(shí)的軸坐標(biāo),此為固定坐標(biāo),可在觸摸屏上【參數(shù)設(shè)置】//上,“參數(shù)設(shè)置2”界面上的,“移動(dòng)相機(jī)左拍照位置”可查詢到。
ImageX_output=ImageX+TrigX-62.34;ImageY_output=ImageY+TrigY-(-194.63);//把特征定位輸出的姿態(tài)值從弧度轉(zhuǎn)換成角度
ImageR_output=ImageR/Math.PI*180;//把判斷出的鋰電池的型號(hào)值賦給輸出端的Model變量值 mToolBlock.Outputs["Model"].Value=Model;9.2機(jī)器視覺生產(chǎn)線綜合案例
?腳本編輯
//把重新計(jì)算的圖像的坐標(biāo)和姿態(tài)值分別賦給輸出端的相應(yīng)的變量
mToolBlock.Outputs["ImageX_output"].Value=ImageX_output;mToolBlock.Outputs["ImageY_output"].Value=ImageY_output;mToolBlock.Outputs["ImageR_output"].Value=ImageR_output;//把分析的鋰電池長(zhǎng)度是否在公差范圍內(nèi)的判斷值賦給輸出端的Dis_OK變量值 mToolBlock.Outputs["Dis_OK"].Value=Dis_OK;returnfalse;}9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施2.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓?。梗┮龑?dǎo)計(jì)算?!耙龑?dǎo)計(jì)算”工具模式是“引導(dǎo)抓取”?!疤卣鲾?shù)據(jù)”為當(dāng)前圖像坐標(biāo)系下,偏移計(jì)算后的坐標(biāo)X/Y,和角度轉(zhuǎn)換后的R?!坝?xùn)練數(shù)據(jù)”為模板圖像坐標(biāo)系下,拿到移動(dòng)抓取標(biāo)準(zhǔn)位示教程序中保存到變量里的3個(gè)圖像坐標(biāo)(1TIX/1TIY/1TIR),以及在模板機(jī)械手坐標(biāo)下,3個(gè)機(jī)械軸坐標(biāo)軸1TRX/1TRY/1TRR。通過“特征數(shù)據(jù)”和“訓(xùn)練數(shù)據(jù)”,計(jì)算輸出軸的絕對(duì)抓取位置坐標(biāo)AbsoluteX、AbsoluteY、AbsoluteR。9.2機(jī)器視覺生產(chǎn)線綜合案例
?任務(wù)實(shí)施1.程序流程設(shè)計(jì)(5)移動(dòng)相機(jī)引導(dǎo)抓?。保埃懽兞?。將腳本計(jì)算的圖像X/Y/R、“引導(dǎo)計(jì)算”工具輸出的軸絕對(duì)抓取位置分別存入“變量管理”創(chuàng)建的六個(gè)變量(1Image_X/1Image_Y/1Image_R、1Robot_X/1Robot_Y/1Robot_R)中,以便后續(xù)組裝的引導(dǎo)計(jì)算進(jìn)行調(diào)用。將引導(dǎo)計(jì)算輸出的絕對(duì)XYR轉(zhuǎn)換為Real類型。將格式轉(zhuǎn)換后的三個(gè)值發(fā)送給PLC,XYR地址分別為D170、D172、D174,引導(dǎo)軸進(jìn)行抓取。以“特征抓取”ToolBlock工具輸出的成功與否作為判斷依據(jù)。成功則發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 部編版二年級(jí)語(yǔ)文下冊(cè)全冊(cè)教案附知識(shí)點(diǎn)總結(jié)與全套測(cè)試卷
- 《例會(huì)培訓(xùn)》課件
- 八年級(jí)英語(yǔ)NewspapersLanguage課件
- 孕期痔瘡的健康宣教
- JJF(陜) 091-2022 家用燃?xì)鈭?bào)警器性能測(cè)試規(guī)范
- JJF(陜) 045-2020 低溫卷繞試驗(yàn)機(jī)校準(zhǔn)規(guī)范
- 鍛煉身體倡議書范文-蓮山課件
- 《認(rèn)知心理學(xué)概述》課件
- 改善社區(qū)服務(wù)流程的創(chuàng)新計(jì)劃
- 班級(jí)體育活動(dòng)的計(jì)劃與執(zhí)行
- 塑料表面處理工藝
- 幼兒園中班下學(xué)期語(yǔ)言繪本-土土的鞋子
- 23J916-1:住宅排氣道(一)
- 小學(xué)語(yǔ)文二年級(jí)上冊(cè)第八單元說教材
- 教育學(xué)原理課后答案主編項(xiàng)賢明
- 幼兒園故事課件:《畫龍點(diǎn)睛》
- 音樂與人生-西南交通大學(xué)中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 用計(jì)算機(jī)計(jì)算圓周率-滬教版高中必修一數(shù)據(jù)與計(jì)算第三單位
- 《世界經(jīng)典神話與傳說故事》上試題及答案
- 多金屬?gòu)U料高效綜合回收利用產(chǎn)業(yè)升級(jí)項(xiàng)目環(huán)評(píng)報(bào)告書
- 石方開挖的環(huán)保措施
評(píng)論
0/150
提交評(píng)論