登录
首页 工控软件 工控软件
回帖 发帖
正文

主题:某类国产组态(pc hmi)软件数据库访问和X-Y曲线实现实例

点击:2476 回复:4

写在前面: 虽然所写题目受众比较小, 但也有人问起这些, 所以把最近两个实例总结了一下, 放到这里, 希望能有点提示效果. 又鉴于浮躁网络习惯, 所以要短小, 分成3段(某类国产组态(pc hmi)软件数据库访问和X-Y曲线实现实例(本文), 某类国产组态(pc hmi)软件数据库访问和X-Y曲线最小二乘直线化数据拟合实例, modbus工具软件和excel结合的IO源为组态软件提供大量数据采集模拟), 也算是滥竽充数.
实例(坛友真实项目)所做的目的之一, 是组态软件通过和机器连接, 数据采集后, 保存到excel或者access这样的数据表里, 然后通过X-Y曲线(折线)方式, 呈现到人机界面, 有利于分析判断. 虽然组态软件也有历史记录功能, 但往往还是有用excel等收集数据的要求; 另外组态软件也有常用的历史/实时曲线功能, 但一般是参数对时间的曲线, 双变量的曲线还是要用到特殊的控件; 再就是, 那客官有言既然数据在excel里,用excel做X-Y曲线, 岂不更香? 是的! 但集成在组态软件的画面, 还是比较瘦身的, 所以也有人有这种需求.
1. 组态软件采集数据和数据库表的关联
组态软件的数据点, 要想存进数据表或从数据表读出来, 需要一个叫记录体的东东.
记录体的字段, 对应表格的字段(列名称), 变量名是组态软件的数据点, 对应着字段, 那读写每个记录(行)的数据就直接在/进数据点.
如图:
附件 捕获1.jpg
2. 数据库的连接
稍微离开组态软件. 这个用到odbc. 在电脑的”管理工具”里面, 最好用32位ODBC设置.
选择系统dsn, 添加一个数据源, 选excel驱动或者access驱动, 然后选择数据表文件.xls或者.mdb. 记住数据源名称, 一会连接它要用, 此处是”dnsexc”. 其它暂不要设置密码之类.
如图:
附件 捕获2.jpg
3. 数据采集
一般有3种方式:
1) 定时: 在程序运行的周期里, 把数据往数据表(库)里面放(存).
2) 事件: 数据变化. 对模拟量比较不友好.
3) 人为: 在画面做一个按钮, 按一下存一下.
组态软件数据保存的代码(此处假设数据表格已经建好, 新建数据(库)文件用excel/access完成, 新建表格可以用组态软件完成, 不在此处详述):
\\local\dateu=\\local\$Date;
\\local\timeu=\\local\$Time;
SQLConnect( \\local\deviceid, "dsn=dsnexc;uid=;pwd=");  //dsn要等于上面建立的数据源名称.
\\local\pres=\\local\presu001;
\\local\disp=\\local\dispu001;
SQLInsert(  \\local\deviceid, "[sheet1$]", "r1"  );  //r1就是上面的记录体, 可以看到把采集的presu001给了和数据表关联的变量点.
\\local\pres=\\local\presu002;
\\local\disp=\\local\dispu002;
SQLInsert(  \\local\deviceid, "[sheet1$]", "r1"  );
SQLDisconnect( \\local\deviceid);
4. 组态软件X-Y曲线控件的建立和数据关联
(1)在组态软件的画面上面, 插入”通用控件”—“ChartXY”控件, 设置名字, 此处假设”Ctrl0”.
右键”控件属性”, 设置好线数量, 颜色, 坐标等等.
如图:
附件 捕获3.jpg
(2)从保存数据的数据表读出数据用于显示
Ctrl0.ClearAll();  //此处清楚以前的线, Ctrl0就是控件名字
long i;
long rows;
SQLConnect( \\local\deviceid, "dsn=dsnexc;uid=;pwd=");  //连接数据
string we="serno='"+\\local\serno+"'";  //条件选择
SQLSelect( \\local\deviceid, "[sheet1$]", "r1", we,"");  //查询数据, 对应记录体r1
\\local\rows1=SQLNumRows(\\local\deviceid );  //看看读了几条
rows=\\local\rows1;
while ( i<(rows/2) )
{
    i=i+1;
  SQLGetRecord( \\local\deviceid, i );  //读出的某行
   Ctrl0.AddNewPoint(\\local\pres, \\local\disp, 0);  //对应的变量作为X-Y点
   Ctrl0.AddNewPoint(\\local\pres, i, 3);   //此处忽略, 为别的用的, 下文讨论
}
while ( i {
   i=i+1;
  SQLGetRecord( \\local\deviceid, i );
   Ctrl0.AddNewPoint(\\local\pres, \\local\disp, 1);
   Ctrl0.AddNewPoint(\\local\pres, i, 4);
}
SQLDisconnect( \\local\deviceid);
(3)折线效果, 如图:
附件 捕获4.jpg
为方便理解计, 把组态软件访问数据库框图放下:
附件 捕获5.jpg
声明: 本文(包括图表)为本人切身原创, 所用数据如有涉商业利益, 请告知.
20-06-18 13:15
不好意思,第2有错误,dsnexc写成了dnsexc,因为图片里面也有,不好修改,在此标记.这里是根据回忆重新建立再截图的,所以实际再测试发现错误后,只改了odbc设置,没有改文字和图片.
20-06-18 13:22
以后工程项目可能会用到,我先收藏起来慢慢消化,谢谢版主
最后修改:2020/6/18 14:23:50
20-06-18 14:22
大佬应该多分享点组态软件到数据库之类的干货,包括数据库报表。顶你一下
20-12-19 19:52

引用 273708367 在 2020/12/19 19:52:44 发言【内容省略】

愿闻其详!
20-12-19 20:18

工控新闻

更多新闻资讯