案例背景
今天來一篇實戰的內容,內容為我們為某水司制作OA系統時實際遇到的情況,
某個水司的管轄范圍內會有多個泵站(少則幾百多則幾千),這種泵站大體的數據模型都是相同的,
水司很有可能之前已經搭建了部分信息系統比如站點ID及名稱的錄入,我們可以充分利用這些信息來搭建我們的OA系統,
避免手工錄入,手工錄入的出錯率還是蠻高的
准備工作
數據源
我們在MySQL 數據庫中新建了一張表 pump_station,並錄入了一些信息
DataType創建
在para中創建PumpStation 數據類型(這里簡單的掛載了幾個變量)
使用腳本添加datapoint
連接數據庫
請參考[WinCC OA-CTRL-操作MySQL數據庫] 這篇文章來處理數據庫連接
編碼
我們這里直接新建一個pnl ,添加一個按鈕 加入代碼
代碼詳情
main(mapping event) { //數據庫連接 int rc; dbConnection conn; string conStr = "DSN=WINCCOA;UID=eric;PWD=123456;"; rc = dbOpenConnection(conStr,conn); string queryStr = "SELECT * FROM pump_station"; dbRecordset rs; //讀取內容 rc = dbOpenRecordset (conn, queryStr, rs); if (!rc) { //遍歷結果集 打印取出結果 while (!rc && !dbEOF (rs)) { string id,name; rc = dbGetField (rs, 1, id); rc = dbGetField (rs, 2, name); //重點**** if (!dpExists(id)) { //使用ID創建站點 dpCreate(id,"PumpStation"); //設置datapoint 中的tag dpSet(id+".tag",name); } rc = dbMoveNext (rs); } dbCloseRecordset (rs); } //關閉數據庫 dbCloseConnection(conn); }
請注意代碼中的重點內容,OK
測試
運行 pnl 點擊按鈕進行測試
可以看到 datapoint 如我們所願 添加成功 同時也將每個datapoint的tag變量賦值成功
高級控件應用
有了這些數據 我們稍微擴展下 使用一個高級控件做點文章
添加list控件
編寫控件的initialize event
main() { dyn_string stations; string tag; //定義全局變量gStationMap addGlobal("gStationMap",MAPPING_VAR); stations=dpNames("System1:*.tag"); for(int i=1;i<=stations.count();i++){ // 獲取站點名稱 dpGet(stations[i],tag); // 添加站點名稱至 list this.appendItem(tag); // tag 信息 添加至 gStationMap gStationMap[tag]=stations[i]; } DebugN(gStationMap); }
保存 測試一下
站點信息取出成功
編寫Item 雙擊事件
有的時候我們需要對List中的每個item 選中的時候進行一些操作,比如讀取數值,
我們接着實現一下
main(mapping event) { //獲取選中的items dyn_string items = this.selectedItems(); //取第一個 string stationName=items[1]; //取datapoint tag string tag = gStationMap[stationName]; strreplace(tag,".tag","");DebugN(tag);
//下面就是你的實際業務 ,這里只是簡單獲取 輸入流量inFlux
double value;
dpGet(tag+".inFlux",value);
DebugN(value);}
測試
一切盡在掌握 o(∩_∩)o
碼上關注 獲取更多精彩
@@