|
中達電通股份有限公司上海機電業務處FAE 李 強
摘 要:某塑膠有限公司是專業生產手術等專用手套的億元年產值企業。整個工廠多達26tiaoshengchanxian。youyushengchanchanliangdoushiyikaorengongjinxingtongji,suoyizaishijicaozuoguochengzhong,chuxianchanpinqueshidaozhitourudeyuanliaolianghechanchudechengpinliangyanzhongshiheng,jixuduizhenggegongchangdechanliangjinxingzhunquedejiliang,yincixiangmujiyuxingjiabijigaodetaidaPLC和組態王界麵軟件成功的開發出產量監控查詢係統,得到了客戶的讚揚。 關 鍵 字:台達PLC 組態王 數據庫 數據的查詢打印 報表組態 1引言 產量監控查詢係統係統對整個工廠所有生產線進行實時監控,對每一條生產線的產量進行實時的存儲,存儲的數據通過組態王連接PLC,將PLC中掉電保持區的數據讀到組態王自定義的相應變量當中,每分鍾通過標準的SQL語言對數據進行存儲(每分鍾向SQLSERVER數據庫中存儲26條數據,即26條生產線的當前產量)。用戶可以通過:日期、時間、時間段、車間、生產線對任何車間、任何生產線進行產量的查詢;能夠對任何車間、renheshengchanxianjinxingyuechanliangdetongji。tongshizaizhaxunchumanzutiaojiandejiluhou,jiangjieguotongguobaobiaodezutaixianshizaixiangyingdebiaogedangzhong,keyiduigaijieguojinxingcunchuhedayin。

2 係統設計 2.1係統框圖
2.2設備選型設計

3 係統分析 3.1功能要求 可以任意查詢一車間、二車間任何生產線(共26條生產線)任何時段的產量。具體明 細如下: (1)每條生產線產量的數據至少能夠保存四個月的儲存期,以便對曆史數據進行查詢。 (2)要求能夠查詢每條生產線任意每月、任意每天、任意每小時、任意每分鍾的產量。 (3)要求能夠對任意每條生產線在任意時段的產量進行查詢。 (4)查詢出來的任何結果要以特定的格式在報表中進行組態,同時將結果打印。 (5)各生產線任意每月產量、任意每天產量、任意每小時產量、任意每分鍾產量可以在電腦上用柱狀圖、實時趨勢曲線的形式表現出來 3.2查詢方式 (1)能夠按照日期進行查詢(格式:Year/Month/Day) (2)能夠按照時間進行查詢(格式:Hour/Minute/Second) (3)能夠按照生產線進行查詢(一車間:1-1、1-2;2-1,2-2;3-1,3-2;4-1,4-2; 5-1,5-2;6-1,6-2;7-1,7-2;8-1,8-2 二車間:1-1,1-2;2-1,2-2;3-1,3-2;4-1,4-2,4-3,4-4) (4)能夠按照任意時間段進行查詢(格式:Year/Month/Day Hour/Minute/Second To Year/Month/Day/ Hour/Minute/Second) (5)能夠按照班次進行查詢(格式:早班,中班,晚班)早班:7:30―15:30 中班:15:30―23:30 晚班:23:30―7:30 (6)能夠查詢任意每月任意車間、任意生產線的產量 (7)能夠運用<1>――<5>的各種不同的排列組合進行複雜的查詢 4難點及實現方法 4.1 海量數據管理 兩個車間共26條生產線,每分鍾要有26條記錄生成,每分鍾向數據庫插入26條記錄。 該係統全天24小時工作,不允許停。所以一天的數據量為37440條記錄。每月的數據量為1160640條記錄。如果要存儲四個月,則數據量為4642260條記錄。數據量是相當龐大的。硬盤的數據存儲接近2-3G,不僅會造成在查詢時,係統資源嚴重被占用,同時普通的數據庫如ACCESS的表格沒有能力管理如此龐大的數據係統。ACCESS在(zai)管(guan)理(li)如(ru)此(ci)龐(pang)大(da)的(de)數(shu)據(ju)時(shi),不(bu)僅(jin)係(xi)統(tong)會(hui)造(zao)成(cheng)不(bu)穩(wen)定(ding),同(tong)時(shi)會(hui)出(chu)現(xian)不(bu)可(ke)預(yu)料(liao)的(de)情(qing)形(xing)。所(suo)以(yi)隻(zhi)能(neng)尋(xun)找(zhao)能(neng)夠(gou)管(guan)理(li)大(da)型(xing)數(shu)據(ju)係(xi)統(tong)的(de)數(shu)據(ju)庫(ku),因(yin)此(ci)可(ke)以(yi)選(xuan)擇(ze)SQLSERVER或Oracle。 4.2 基於WindowsXP創建SQL服務器的新數據源 組態王支持對標準的數據庫進行數據的插入、選擇、刪除等基本的操作。同時支持標準的SQL語言。靈活的運用組態王提供的SQL函數使組態王通過ODBC(開放性的數據源)配合標準的SQL語言對數據庫進行各種簡單和複雜的操作。 在Win2000/Winnt/Winxp等操作係統下,必須正確的進行設置:從控製麵板中 雙擊性能和維護,如圖3所示。以WindowsXP為例說明。 第一步:在控製麵板下選擇 管理工具->ODBC數據源,雙擊圖標出現圖2界麵。

第二步:在用戶DSN 選項卡片上,單擊添加按鈕,出現 創建新數據源 對話框,選擇SQL Server(圖3)。

第三步:單擊第二步的完成按鈕,出現創建到SQL Server的新數據源。如圖4所示。

輸入數據源名稱、數據源描述和SQL Server 所在的服務器名稱或者IP地址。服務器名稱可以是SQL Server所在的機器名稱,也可以是IP地址。單擊下一步按鈕。 第四步:選擇登錄SQL Server時的身份驗證方式。並輸入登錄SQL Server時所用到的用戶名和密碼。如圖5所示。

這裏的用戶名和密碼是在SQL Server中建立的。在SQL Server數據庫中選擇 安全性->登錄,新建用戶,如圖6所示。

第五步:一定要選擇"更新默認的數據庫為"選項,否則默認數據庫是master。然後選擇您想要連接的數據庫。其餘的按默認設置,如圖7所示。然後單擊下一步按鈕。

第六步:按默認設置,單擊完成按鈕(圖8)。

第七步:圖9給出了數據庫連接的摘要信息,如果想測試一下是否能夠連接到數據庫,可以單擊“測試數據源”按鈕,會出現測試結果。

單擊確定完成連接。接下來的工作就是在組態王王建立記錄體、表格模板。其中連接數據庫的時候,一定要輸入和剛才數據源名稱一致的DSN。如 dsn = wuhandsn. 4.3 表格名稱創新 即使使用大型的數據庫,SQL Server或Oracle,由於每天的數據量多達37440條記錄, ruguojiangyigeyue,shenzhishisigeyuedejiluquanbuxierutongyigeshujukudetongyigebiaoge,zesuoyoudeshujuliangdadejiangshibiaogebengkui,jishishujukunenggouguanli,zhaxundesuduyeshikexiangerzhide。jianghuifeichangdeman。jingguozuozhefanfudesisuo,xiangchuleyigeqiaomiaodebanfa,jiushiyixitongderiqizuoweidangtiandebiaogemingcheng。dangxitongshijianwei00:00:00時刻時,新建一個表格,通過SQLCreateTable( DeviceID, "TableName", "TemplateName" )函數建立不同的表格。因為組態王支持字符串函數,如下所示: StrASCII( Char );// 此函數返回某一指定的文字變量首字符的ASCII值 StrChar( ASCII );// 此函數返回某一指定ASCII碼所對應的字符 StrFromInt( Integer, Base );// 此函數將一整數值轉換為另一進製下的字符串表示 StrFromReal( Real, Precision, Type );// 此函數將一實數值轉換成字符串形式 StrFromTime( SecsSince1-1-70, StringType );// 此函數將一個時間值轉換為字符串 StrInStr( Text, SearchFor, StartPos, CaseSens );// 此函數用於查找文本 StrLeft( Text, Chars );// 此函數返回指定文字變量的開始(或最左的)若幹個字符 StrLen( Text );// 此函數返回某一指定的文字變量的長度 StrLower( Text );// 此函數將指定文字中的所有大寫字母轉換為小寫字母 StrMid( Text, StartChar, Chars );// 此函數從指定的位置開始,從一個文字變量中返回指定個數的字符 StrReplace( Text, SearchFor, ReplaceWith, CaseSens, NumToReplace, MatchWholeWords ); //此函數替換或改變所提供字符串的指定部分 StrRight( Text, Chars );// 此函數返回指定文字變量的最末端(或最右)若幹個字符 StrSpace( NumSpaces );// 此函數在文字變量中或表達式中產生一個空格串 StrToInt( Text );// 此函數在文字變量中或表達式中產生一個空格串 StrToReal( Text );// 此函數將一個由數字組成的字符串轉換成一個能用於數字計算的實數值 StrTrim( Text, TrimType );// 此函數刪除文字變量中無用的空格 StrType( Text, TestType );// 此函數檢測文字變量的首字符以確定其是否為某一類型 StrUpper( Text );// 此函數將一指定文字變量中所有的小寫字符轉換成大寫字符 在組態王中建立內存型字符變量NameTable="A"+StrFromInt( \\本站點\$年, 10)+StrFromInt( \\本站點\$月, 10)+StrFromInt( \\本站點\$日, 10);NameTable的構成為字母A+係統日期。將係統提供的整型變量轉換成字符型變量。這樣可以在數據庫中建立每天的表格。每當係統日期由23:59:59跳變到00:00:00時,執行SQLCreateTable()函數,建立當天的表格,如圖10所示,在SQL Server中組態王建立了A2006619日的表格。

4.4 基於Active控件的組態王條件查詢 為了完成如此複雜的查詢,使用了Active控(kong)件(jian),因(yin)為(wei)組(zu)態(tai)王(wang)支(zhi)持(chi)第(di)三(san)方(fang)控(kong)件(jian),將(jiang)所(suo)有(you)的(de)條(tiao)件(jian)羅(luo)列(lie)出(chu)來(lai)進(jin)行(xing)排(pai)列(lie)組(zu)合(he),將(jiang)每(mei)一(yi)種(zhong)情(qing)況(kuang)都(dou)考(kao)慮(lv)在(zai)內(nei)。然(ran)後(hou)通(tong)過(guo)程(cheng)序(xu)來(lai)實(shi)現(xian)選(xuan)擇(ze)條(tiao)件(jian)轉(zhuan)換(huan)成(cheng)SQLSELECT()函數工作的條件。 (1)任意查詢任意生產線在任意時段的產量。因為工藝要求能夠任意查詢任意生產線在任意時段的產量,為了能夠實現該功能,新建\\本站點\CX_Hour,\\本站點\CX_Minute,\\本站點\CX_Hour1,\\本站點\CX_Minute1bianliang。zaiyishijianduanjinxingzhaxunshi,xianjiangyiqianlianggebianliangshurudeshijianzuoweitiaojianjinxingzhaxun,jiangzhaxunchujiludeshujufugeizaiguochengzhongzidingyidezhongjianbianliang。ranhouzaiyihoulianggebianliangshurudeshijianweitiaojianjinxingzhaxun,jiangzhaxunchudejieguotongyangfugeizidingyidezhongjianbianliang。jiangliangcizhaxundejieguoqiucharanhou,jiangriqi,shijian,chejian,shengchanxian,chanliangtongguobaobiaodezutaitiandaobiaogedangzhong。 (2)對於月產量的查詢。需要判斷輸入的月份有幾天,然後從該月的第一天開始到最後一天進行查詢,查詢的時刻為每一天的23:59fenshigeshengchanxiandechanliang。ranhouduizhaxunchudeshujujinxingleijia,zhidaogaiyuedezuihouyitian,ranhouanzhaotedingdegeshijiangshujutianxiedaobaobiaodangzhong。zaigaiguochengzhongxuyaolinghuodeyunyongxunhuanyuju:While{}以及深刻的體會組態王的變量與數據庫進行數據交換的過程。 查(zha)詢(xun)的(de)條(tiao)件(jian)比(bi)較(jiao)複(fu)雜(za),有(you)些(xie)條(tiao)件(jian)不(bu)能(neng)同(tong)時(shi)成(cheng)立(li),因(yin)此(ci)在(zai)選(xuan)擇(ze)條(tiao)件(jian)時(shi),應(ying)該(gai)要(yao)互(hu)相(xiang)限(xian)製(zhi),以(yi)避(bi)免(mian)出(chu)現(xian)混(hun)亂(luan)的(de)現(xian)象(xiang)。具(ju)體(ti)的(de)程(cheng)序(xu)在(zai)應(ying)用(yong)程(cheng)序(xu)命(ming)令(ling)語(yu)言(yan)運(yun)行(xing)時(shi)寫(xie)如(ru)下(xia)程(cheng)序(xu): //String Systime=StrFromInt(\\本站點\$時,10 )+":"+StrFromInt(\\本站點\$分,10 ); //===================判斷 早班,中班,晚班和查詢的時段=================================== String Timestr=StrFromInt( \\本站點\$時, 10 )+StrFromInt( \\本站點\$分, 10 ); Long Timereal=StrToInt( Timestr ); if(Timereal>=730) { if(Timereal<=1530) \\本站點\班次1="早班"; } if(Timereal>1530) { if(Timereal<=2330) \\本站點\班次1="中班"; } if(Timereal>2330) { if(Timereal<=2359) \\本站點\班次1="晚班"; } if(Timereal>=0) { if(Timereal<730) \\本站點\班次1="晚班"; }
\\本站點\日期=\\本站點\$日期; \\本站點\時間=StrFromReal( \\本站點\$時, 0, "f" )+":"+StrFromReal( \\本站點\$分, 0, "f" ); if(CommFine1) { CommText1="通訊失敗!";} else { CommText1="通訊正常!";} if(CommFine2) { CommText2="通訊失敗!";} else { CommText2="通訊正常!";}
//===================統計月產量時,查詢報表的個數計算==================== if(\\本站點\MonthInput==1){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==2){ \\本站點\DayNumber=28;} if(\\本站點\MonthInput==3){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==4){ \\本站點\DayNumber=30;} if(\\本站點\MonthInput==5){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==6){ \\本站點\DayNumber=30;} if(\\本站點\MonthInput==7){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==8){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==9){ \\本站點\DayNumber=30;} if(\\本站點\MonthInput==10){ \\本站點\DayNumber=31;} if(\\本站點\MonthInput==11){ \\本站點\DayNumber=30;} if(\\本站點\MonthInput==12){ \\本站點\DayNumber=31;} //=================月產量查詢的條件限定=================== if(Check6) { Check1=0;Check2=0;Check3=0;Check4=0;Check5=0;} //==================查詢時間和時間段不能同時有效=================== if(\\本站點\Check2) {\\本站點\Check3=0;Check1=1;} if(\\本站點\Check3) {\\本站點\Check2=0;Check1=1;Check6=0;}
//====================插入表格的名稱====================== NameTable="A"+StrFromInt( \\本站點\$年, 10)+StrFromInt( \\本站點\$月, 10)+StrFromInt( \\本站點\$日, 10);
<7>.工藝要求能夠查詢任意生產線每分鍾的產量,所以通過事件發生命令語言實現。每當係統時間的秒等於59時,觸發執行如下程序。該部分的程序如下: //==========================向數據庫插入數據============================ long ih=1; 車間=1; //SQLInsertPrepare( DeviceID, NameTable, "bind", SQLHandle);
while(ih<=16) { if(ih==1) {產量=Fir_NO1;生產線="1-1";} if(ih==2) {產量=Fir_NO2;生產線="1-2";} if(ih==3){產量=Fir_NO3;生產線="2-1";} if(ih==4) {產量=Fir_NO4;生產線="2-2";} if(ih==5) {產量=Fir_NO5;生產線="3-1";} if(ih==6){產量=Fir_NO6;生產線="3-2";} if(ih==7) {產量=Fir_NO7;生產線="4-1";} if(ih==8) {產量=Fir_NO8;生產線="4-2";} if(ih==9){產量=Fir_NO9;生產線="5-1";} if(ih==10) {產量=Fir_NO10;生產線="5-2";} if(ih==11) {產量=Fir_NO11;生產線="6-1";} if(ih==12){產量=Fir_NO12;生產線="6-2";} if(ih==13) {產量=Fir_NO13;生產線="7-1";} if(ih==14) {產量=Fir_NO14;生產線="7-2";} if(ih==15){產量=Fir_NO15;生產線="8-1";} if(ih==16) {產量=Fir_NO16;生產線="8-2";} // \\本站點\序號=\\本站點\序號+1; SQLInsert( DeviceID,NameTable, "bind" ); //SQLInsertExecute( DeviceID, "bind", SQLHandle); ih=ih+1; }
long jh=1; 車間=2; while(jh<=10) { if(jh==1) {產量=Sec_NO1;生產線="1-1";} if(jh==2) {產量=Sec_NO2;生產線="1-2";} if(jh==3){產量=Sec_NO3;生產線="2-1";} if(jh==4) {產量=Sec_NO4;生產線="2-2";} if(jh==5) {產量=Sec_NO5;生產線="3-1";} if(jh==6){產量=Sec_NO6;生產線="3-2";} if(jh==7) {產量=Sec_NO7;生產線="4-1";} if(jh==8) {產量=Sec_NO8;生產線="4-2";} if(jh==9){產量=Sec_NO9;生產線="4-3";} if(jh==10) {產量=Sec_NO10;生產線="4-4";} //\\本站點\序號=\\本站點\序號+1; SQLInsert( DeviceID,NameTable, "bind" ); //SQLInsertExecute( DeviceID, "bind", SQLHandle); jh=jh+1; } //SQLInsertEnd( DeviceID, SQLHandle);
(3)在係統時間等於00:00:00時刻時,在事件命令語言中建立如下程序,以得到需要新建表格的名稱,同時將PLC中累計產量的寄存器清零,重新開始對該日的產量進行累計。 5 調試過程 因為兩個車間之間的距離在300m左右,而從第一個車間到監控室的距離有500m左(zuo)右(you),距(ju)離(li)比(bi)較(jiao)遠(yuan),為(wei)了(le)遏(e)製(zhi)信(xin)號(hao)的(de)衰(shuai)減(jian),將(jiang)信(xin)號(hao)線(xian)用(yong)網(wang)線(xian)代(dai)替(ti),同(tong)時(shi)加(jia)中(zhong)繼(ji)器(qi),將(jiang)信(xin)號(hao)放(fang)大(da)。保(bao)證(zheng)數(shu)據(ju)傳(chuan)輸(shu)的(de)安(an)全(quan)性(xing)。要(yao)求(qiu)現(xian)場(chang)布(bu)線(xian)時(shi)嚴(yan)格(ge)按(an)照(zhao)電(dian)氣(qi)規(gui)範(fan)施(shi)工(gong)。保(bao)證(zheng)安(an)裝(zhuang)的(de)合(he)格(ge)。正(zheng)確(que)的(de)設(she)置(zhi)操(cao)作(zuo)係(xi)統(tong)中(zhong)數(shu)據(ju)源(yuan)ODBC的選項,以保證組態王能夠通過ODBC與數據庫SQL Server連(lian)接(jie)。在(zai)組(zu)態(tai)王(wang)運(yun)行(xing)係(xi)統(tong)中(zhong)執(zhi)行(xing)任(ren)何(he)操(cao)作(zuo)時(shi),觀(guan)察(cha)運(yun)行(xing)反(fan)饋(kui)信(xin)息(xi),以(yi)得(de)到(dao)相(xiang)關(guan)的(de)錯(cuo)誤(wu)信(xin)息(xi)。根(gen)據(ju)提(ti)示(shi)的(de)錯(cuo)誤(wu)信(xin)息(xi)檢(jian)查(zha)程(cheng)序(xu)。報(bao)表(biao)的(de)組(zu)態(tai)非(fei)常(chang)靈(ling)活(huo),可(ke)以(yi)通(tong)過(guo)While{}循環語句,將查詢結果按照順序填寫到報表中。靈活的運用While{}語句同時能夠將程序簡化,減少組態王後台運行程序的時間。靈活的運用應用程序命令語言、數據改變命令語言、事件命令語言、熱鍵命令語言、按鈕的彈起、按住、anxiaminglingyuyanjinxingbiancheng。zaichengxuliangfeichangdadexiangmuzhong,yangchenglianghaodebianchengxiguan。dingyibianliangshizuihaoshiyongyingwen,zheyangnenggouzengjiachengxudekeduxing。tongshiduichengxujinxingbiaozhu。 程序畫麵設計參見圖11、圖12、圖13。



7 結束語 盡管台達的PLC屬於小型PLC,但可靠的性能,支持485通訊等特點,同樣能夠完成集中控製的功能。同時配合組態軟件,一樣能夠實現複雜的工廠監控、數據查詢、打印、報表等DCS係統的功能。篇幅有限,歡迎讀者聯係作者深入交流。
|