1 引言
尽管组态软件已经具备了很强的功能,但是在很多场合都有直接使用第三方代码的要求。例如用户需要将组态软件采集的实时数据传送到自己开发的vb程序中做更复杂的数据分析或者是将世纪星采集的数据做特定的处理之后再传送给世纪星,这都需要有一种数据交换机制。
当然实现这种交换机制有很多传统的方法,如使用文件共享数据、使用dde数据交换机制。传统的方法虽然能够达到数据交换的目的,但其使用方法较为烦琐,使用文件共享数据就需要在组态软件和外部程序内部进行文件读取操作,这样不但麻烦而且处理速度也相对较慢,在要求实时性较好的工程中就显得力不从心。为了让第三方程序方便地读写世纪星数据,世纪星提供了基于activex技术的ocx控件,此控件可以在大多的开发环境中使用(如vc++6.0、vb6.0),它就是dbcomm。
2 dbcomm 世纪星数据交换标准控件
世纪星提供标准控件 dbcomm.ocx 与外部第三方程序进行数据交换,数据交换内容包括:
2.1 实时数据交换
外部程序可以读取世纪星的系统变量(包括系统离散、系统整数、系统实数和系统信息)、内存变量(包括内存离散、内存整数、内存实数和内存信息)和io变量(包括io离散、io整数、io实数和io信息);还可以改写世纪星的内存变量和io变量。
相关函数:
discvalue=tagreaddisc(tagname) 读取世纪星离散变量的当前值
intvalue=tagreadint(tagname) 读取世纪星整数变量的当前值
floatvalue=tagreadfloat(tagname) 读取世纪星实数变量的当前值
messvalue=tagreadmess(tagname) 读取世纪星信息变量的当前值
tagwritedisc(tagname, discvalue) 改写世纪星离散变量的当前值
tagwriteint(tagname, intvalue) 改写世纪星整数变量的当前值
tagwritefloat(tagname, floatvalue) 改写世纪星实数变量的当前值
tagwritemess(tagname, string) 改写世纪星信息变量的当前值
initcomm() dbcomm初始化函数
2.2 历史数据读取
外部程序可以按时间和变量名称读取世纪星的历史数据。
timeuint=converttime(year, month, day, hour, minute, second)
时间转换函数
discresult=gethistorydata(tagname,starttime,endtime,dataarray,sizeofarray, interval)
根据指定的起止日期时间和世纪星的变量名称读取世纪星的历史数据。
3 dbcomm在vb6.0中的应用
vb工程和世纪星工程数据交换示意图:
http://blog.gkong.com/uploadfile3/20091125111848346.jpg
下面是一个应用vb程序在外部计算pid输出功率的一个简单实验:
需要硬件:三菱fx2n系列plc、fx2n-4ad-tc、加热器、s分度热电偶(tc)、固态继电器(ssr)。
需要软件:世纪星组态软件7.22、vb6.0。
如下图所示为电器原理图:
http://blog.gkong.com/uploadfile3/20091125111911585.jpg
如上图所示是一个加热控制系统。plc主模块负责控制继电器的通断(pid输出),tc模块负责温度采集(pid输入),上位机世纪星部分负责温度设定、采集下位机信号、曲线显示、数据记录、数据检索等功能,上位机vb部分负责从世纪星获取设定温度sv、测量温度pv、计算pid输出(固态继电器的通断时间)。
3.1 世纪星监控程序
将控制电路配置好,将上位机连接到plc。开发世纪星监控程序,配置相应的串口驱动、串口参数,创建的监控画面如下:
http://blog.gkong.com/uploadfile3/20091125111944764.jpg
3.2 vb外挂程序开发
* 创建一个vb标准工程。
* projiec—components—dbcomm activex control moudle。
* 初试化dbcomm
dbcomm_pid.initcomm
* 从世纪星组态软件读取温度设定和实际值
sv= dbcomm_pid.tagreadfloat (sv)
pv= dbcomm_pid.tagreadfloat (pv)
* y0输出时间计算函数(根据p=0.5,i=0.5,d=0)
private function pidcalc(pp as pid, byval nextpoint as double) as double
dim derror as double
dim error as double
error = pp.setpoint - nextpoint
pp.sumerror = pp.sumerror + error
derror = pp.lasterror - pp.preverror
pp.preverror = pp.lasterror
pp.lasterror = error
pidcalc = pp.p * error + pp.i * pp.sumerror + pp.d * derror
end function
3.3 加热输出控制
根据2中计算的加热时间(时间百分比,x%*1s),对plc的y0 进行输出控制。
y0 on/off:tagwritedisc (y0,1)/ tagwritedisc (y0,0),y0脉宽调制如下图所示:
http://blog.gkong.com/uploadfile3/20091125112016141.jpg
3.4实验结果
本工程利用世纪星组态软件采集温度实际值(从plc),在组态软件中设定温度的目标值,在vb6.0程序中计算输出功率的百分比,vb再将加热时间(y0时间)传递给组态软件,组态软件再传给plc,plc控制加热。
由于采用了粗糙的pid,所以控温精度在正负1度以内(精度不在本文研究范围内),但是vb通过dbcomm和世纪星组态软件实时交换数据功能良好。
4 总结
综上所述,世纪星所提供的dbcomm 控件使用方便,为第三方程序提供了完备的数据交换接口。另外dbcomm 控件还可以访问世纪星组态软件的历史数据库,本篇暂不详述。
----------------------------------------------
此篇文章从博客转发
原文地址:
Http://blog.gkong.com/more.asp?id=106197&Name=chncla