WinCC OA-綜合案例-數據庫拉取信息並創建datapoint


案例背景

今天來一篇實戰的內容,內容為我們為某水司制作OA系統時實際遇到的情況,

某個水司的管轄范圍內會有多個泵站(少則幾百多則幾千),這種泵站大體的數據模型都是相同的,

水司很有可能之前已經搭建了部分信息系統比如站點ID及名稱的錄入,我們可以充分利用這些信息來搭建我們的OA系統,

避免手工錄入,手工錄入的出錯率還是蠻高的

 

准備工作

數據源

我們在MySQL 數據庫中新建了一張表 pump_station,並錄入了一些信息

image

 

DataType創建

在para中創建PumpStation 數據類型(這里簡單的掛載了幾個變量)

image

使用腳本添加datapoint

 

連接數據庫

請參考[WinCC OA-CTRL-操作MySQL數據庫] 這篇文章來處理數據庫連接

編碼

我們這里直接新建一個pnl ,添加一個按鈕 加入代碼

image

代碼詳情

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 點擊按鈕進行測試

image

可以看到 datapoint 如我們所願 添加成功  同時也將每個datapoint的tag變量賦值成功

 

高級控件應用

有了這些數據 我們稍微擴展下 使用一個高級控件做點文章

添加list控件

image

 

編寫控件的initialize event

image

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);
}

保存 測試一下

image

站點信息取出成功

編寫Item 雙擊事件

有的時候我們需要對List中的每個item 選中的時候進行一些操作,比如讀取數值,

我們接着實現一下

image

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);

}

測試

image

一切盡在掌握 o(∩_∩)o

 

碼上關注 獲取更多精彩

 

 

@@


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM