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

 

码上关注 获取更多精彩

 

 

@@

posted @ 2020-05-24 12:34  莱立佰  阅读(1648)  评论(0编辑  收藏  举报