WinCC OA-综合案例-数据库拉取信息并创建datapoint
案例背景
今天来一篇实战的内容,内容为我们为某水司制作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
码上关注 获取更多精彩
@@