组态王软件的应用与分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hefei University
组态王软件的应用与分析
专业及班级:自动化(1)班
姓名:微尘
学号: 0905075014 授课老师: 丁健
完成时间: 2012-11-13
组态王软件的应用与分析
摘要:组态王软件是完成数据采集与过程控制的专用软件,它是在自动控制系统监控层一级的软件平台和开发环境,使用灵活的组态方式,为用户提供快速构建工业控制系统。同时组态王软件开发的监控系统软件以标准的工业计算机软、硬件平台构成的开放式系
统取代传统的封闭式系统,它能充分利用Windows的图形编辑功能,方便地构成监控
画面,并以动画方式显示控制设备的状态。本文通过介绍组态王的特点、基本功能及
单片机与组态王的应用实例,详细直观的把组态王软件的特性展示出来。
关键词:组态王控制系统监控系统单片机通讯系统
一、组态王软件简介
组态王软件是利用系统软件提供的工具,用户通过简单的形象组织组合工作,即可实现所需的软件功能。工业过程控制系统中,常常要求有如下功能:数据采集与数据处理功能、数据存储功能、包括数据查询、数据管理和数据显示等系统故障或事故报警、现场动态图形功能、显示现场生产过程或实时状态、自动或召唤出实时和历史报表功能或数据曲线显示功能、友好的人机界面等。
过去在开发控制系统软件时开发者要选择一种程序设计语言来实现上述功能。往往软件的编程量很大软件开发成本高、开发周期长、软件的维护量大组态软件就是在这当种需求下产生。组态软件将士主常用功能组合在一起形成一个新的软件平台用户只须在这个软件平台下进行二次开发,系统所需的软件即可。组态软件正在代替各种计算机语言的软件开发。其优点有:提高系统的成功率和可靠性、缩短项目开发周期、减少开发费用
组态王组态软件是在流行的微机上建立工业控制对象的人机接口的一种智能软件包。它是以windows98/windowsnt4.0中文操作系统为其操作平台。充分利用了windows的图形功能完备、界面一致性好、易学易用的特点。它使采用微机开发的系统工程比以往的使用专用机开发的工业控制系统更有通用性,大大地减少了工控软件开发者的重复性工作并可运用微机丰富的软件资源进行开发。
二、组态王的特点
它具有适应性强、开放性好、易于扩展、经济、开发周期短等优点。通常可
以把这样的系统划分为控制层、监控层、管理层三个层次结构。其中监控层对下连接控制层,对上连接管理层,它不但实现对现场的实时监测与控制,且在自动控制系统中完成上传下达、组态开发的重要作用。尤其考虑三方面问题:画面、数据、动画。通过对监控系统要求及实现功能的分析,采用组态王对监控系统进行设计。组态软件也为试验者提供了可视化监控画面,有利于试验者实时现场监控。而且,它能充分利用Windows的图形编辑功能,方便地构成监控画面,并以动画方式显示控制设备的状态,具有报警窗口、实时趋势曲线等,可便利的生成各种报表。它还具有丰富的设备驱动程序和灵活的组态方式、数据链接功能。三、组态王功能简介
组态王软件是真正的32位程序支持多任务、多线程、运行于windows98等操作系统。充分利用面向对象的技术和控件动态连接技术如:棒图控件、温度曲线控件、窗口类控件、多媒体控件等。它提供良好的显示画面和编程环境,从而方便灵活地实现多任务操作。这就是组态王的多任务的软件运行环境。
组态王也有强大的通讯能力和良好的开发性,它可以与一些常用I/O设备直接进行通讯,I/O设备包括:可编程控制器PLC、智能模块、板卡、智能仪表等等。组态王的驱动程序采用ActiveX技术,使通讯程序和组态王构成一个完整的系统,保证运行系统的高效率。为了方便用户使用组态王中增加了设备配置向导,用户只需要按照安装向导的提示就可以完成I/O 设备的配置工作。在系统运行的过程中组态王通过内嵌的设备管理程序负责与I/O设备的实时数据交换。配置的I/O设备在工程浏览器的设备节点中分类列出用户可以随时查询和修改。
组态王可运行在基于EtherNET网络结构和TCP\IP网络协议网上。在此网络中直接参与现场控制的PC机作为网络服务器。其它站点作为网络客户机,它可共享服务器中的数据,这就是组态王优化的网络功能。
四、单片机与组态王的通讯实例
1、单片机与组态王的通信
组态王(kingView)内置了通用单片机通信模块,这样,我们自己开发的单片机仪表就可以挂接在KingView上了。因为这样,所以对这个东西有了些兴趣,做了些研究。
(1)研究环境
组态王6.53,免费下载,Keil软件,Porteus,这些就不多说了。
Virtual Serial Ports Driver XP 5.1 虚拟串口软件,用此软件可以生成一对相互联接的虚拟串口,这样,初期的研究工作就在电脑上完成了,省得用硬件电路板了。
(2)资料
KingView提供了一份简单的说明材料,就在下载后的解压缩文件包中。具体的位置是:Value Pack\技术资料\常用协议\单片机ASCII码通讯协议(3)电路搭建
注意单片机的TXD与虚拟串口的TXD,单片机的RXD与虚拟串口的RXD是连在一起的,不要交叉。这个虚拟串口元件的设置如下图所示:
说明:这里选COM2,是因为事先用Vspd生成了一对虚拟串口,com2和com4,至于其他参数则应该选得和kingview中的一致,这个到下面再说。
找元件位置如下图。
(4)VSPD的使用
现如今的电脑很少有两个串口的了,人呢也是越来越懒了,虽然手边的电路板是现成的,写片子是容易的,但是仍然还是嫌麻烦的,所以就发动狗狗搜一搜,找到了这个VSPD,当然它是很容易用的
在first后面选一个串口名,然后在Second后面再选一个串口名,然后点一下Add Pair 就行啦。怎么选都可以,就算是选com1也是可以的,虽然com1是真实存在的物理串口,但是这个VSPD照样把它给虚拟了。这里我选的是com2和com4,大家可以看到在左侧的窗口中出现了这样一对互联的串口了,也就是说,我从串口2发数据,然后串口4就能收到。同样,我从串口4发数据,串口2就能收到。
(5)组态王置
根据自己屏幕选择演示项目中的一个
找到设备->DDE,双击“新建...”
选择:智能模块(上面的图中看不到)->单片机->通用单片机ASCII->串口
起个名字,然后选择串口号,我们选择com4
这一步选择地址,需要为自己的单片机设备确定一个地址,这有点麻烦。需要看一看地址帮助,这里简单说明一下。如果在同一个串口上连接多个单片机设
备,那么就需要确定究竟与哪一个设备通信,这就需要有个地址,这是上面我取的地址2.0中的2的由来,而小数点后面可取0/1,按kingview的介绍是打包还是不打包。我还没有理解打包是什么,所以先取0.
现在“设备”下面多出来了com4,并且在右侧多出了一个“我的单片机”的图标,这是我为自己的单片机设备起的名字。右击该图标,在弹出的快捷菜单中选择“测试我的单片机”,打开对话框。
在这里选择通信参数,为简单起见,我们将校验选为“无”,其他按图上选择,然后单击“设备测试”进入到设备测试页面。
增加一个寄存器,寄存器X后面加个0,数据类型选择“BYTE,SHORT,FLOAT”三者之一。我们选择BYTE,选择添加。
OK,至此kingview也设置好了。下面就是编程了。
1.通讯口设置:
通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
字节数据格式:由单片机决定。
注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致
2.在组态王中定义设备地址的格式
格式:##.#
前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由
单片机中的程序决定;
后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。
3.在组态王中定义的寄存器格式
斜体字dd代表数据地址,此地址与单片机的数据地址相对应。
注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。
3.组态王与单片机通讯的命令格式:
读写格式(除字头、字尾外所有字节均为ASCII码)
说明;
字头:1字节1个ASCII码,40H
设备地址:1字节2个ASCII码,0—255(即0---0x0ffH)
标志:1字节2个ASCII码,bit0~bit7,
bit0= 0:读,bit0= 1:写。
b it1= 0:不打包。
bit3bit2 = 00,数据类型为字节。
bit3bit2 = 01,数据类型为字。
bit3bit2 = 1x,数据类型为浮点数。
数据地址:2字节4个ASCII码,0x0000~0xffff
数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。
数据…:为实际的数据转换为ASCII码,个数为字节数乘2。
异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码
CR:0x0d。
----------------------------------------------------------
有了这些资料,程序就不难编写了。
先测试一下。
到proteus中,全速运行,这就打开了串口窗口。
在kingview中单击“读取”(见上一篇的最后一个图),可以看到如下字串:
@02E000000176
这个数据字串与地址,数据类型等有关,解读如下:
如果切换成HEX显示,则可以看到字头和字
如:@02A400010274
HEX显示为:
40 30 32 41 34 30 30 30 31 30 32 37 34 0D
其中取异或的,不包括字头40H,即从30H开始的10个字符,异或算出来后,转换成ASCII码成为其后的2个字符,即0D前的两个字符。以上面的数字为例,异或算出来为74H,转换成ASCII码为37H和34H。
五、总结
通过以上介绍与实例分析了解到组态王软件具有适应性强、开放性好、易于扩展、经济及开发周期短等优点。组态王强大及方便的功能还在随着科技的发展更加完善,认真学习组态王的应用将使我们在以后的工作中更加左右逢源。
参考文献
[1] 廖常初:《西门子人机界面(触摸屏)组态与应用技术(第2版)》机械工业出版社2006年3月;
[2] 紫金桥:《基于紫金桥的牵引变电所计算机监控》2006年8月;
[3] 上海超高压输变电公司:《变电所自动化与监控(第三册)》中国电力出版社 2006.年7月;
[4] 姚卫丰:《楼宇设备监控及组态》机械工业出版社 2008年6月。
附件:实例程序:
#include "reg52.h"
/*11.0592M
19200 bps
*/
typedef unsigned char uchar;
typedef unsigned int uint;
/*定时器2的波特率:fosc/32*(65536-(rcap2h rcap2l))
按此,可得波特率是19。2时,要求65536-(rcap2h rcap2l)=18
即(rcap2h rcap2l)=65518
*/
void serial_init () {
SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */
C_T2=0; /*Timer2 runing in Timer mode*/
RCLK="1";
TCLK="1";
RCAP2H=0xff;
RCAP2L=0xee;
TR2=1; /*enable Timer2 run */
ES = 1; REN="1"; EA="1"; SM2=1; /*SM2=1时收到的第9位为1才置位RI标志*/
}
/*通过串行口发送数据 */
void UartSend(uchar Dat)
{ SBUF=Dat;
for(;;)
{ if(TI)
break;
}
TI=0;
}
uchar RecBuf[12];
bit RecOk="0"; //一次接收工作结束
void Recive() interrupt 4
{
static bit StartRec="0"; //如果收到的首个字符是40H,则该值取0 static uchar Count="0"; //计数器
uchar RecDat;
RecDat=SBUF; //取得SBUF中的数据
if(!StartRec) //新的一次接收开始
{
if(RecDat==0x40) //首字符正确
{
StartRec=1; //开始新的一次接收工作
}
}
else
{
RecBuf[Count]=RecDat;
Count++;
if(RecDat==0x0d)
{
StartRec=0; //准备下一次接收
Count=0; //计数器清零
RecOk=1; //一次接收正确
}
}
RI=0;
}
void UartSends(uchar Buff[],uchar Len)
{ uchar i;
for(i=0;i { UartSend(Buff[i]); } } void mDelay(uint DelayTim) { uchar i; for(;DelayTim>0;DelayTim--) { for(i=0;i<123;i++); } } uchar SendBuf[10]={0x40,0x30,0x33,0x30,0x31,0x36,0x35,0x30,0x31,0x0d}; void main() { uchar i; uchar RecCount="0"; uchar SendCount="0"; uchar xorDat; uchar cTmp1,cTmp2;uchar cTmp; uchar SendDat="1";//这个是程序中准备传递给kingview的,可以自行更改。 serial_init (); //定时器,串口初始化 for(;;){ if(RecOk) //一次完整的接收 { RecOk=0; //本次接收后的应答处理完毕 xorDat=RecBuf[0]; for(i=1;i<10;i++) { xorDat^=RecBuf[i]; //异或 } cTmp1=xorDat&0xf0; //取高4位 cTmp1>>=4; //右移4次移到低4位 cTmp1+=0x30; cTmp2=xorDat&0x0f; //取低4位 cTmp2+=0x30; if((cTmp1==RecBuf[10])&&(cTmp2==RecBuf[11])) { SendBuf[1]=RecBuf[0];SendBuf[2]=RecBuf[1]; //地址与接收到的地址相同 //SendBuf[3]= SendBuf[4]= //发送的字节数 cTmp=SendDat;cTmp&=0xf0; //取高4位 cTmp>>=4; //右移4位 SendBuf[5]=0x30+cTmp; cTmp=SendDat;cTmp&=0x0f; SendBuf[6]=0x30+cTmp;//发送的值 //////以下计算异或码 xorDat=SendBuf[1]; for(i=2;i<7;i++) { xorDat^=SendBuf[i]; } cTmp1=xorDat&0xf0; //取高4位 cTmp1>>=4; cTmp1+=0x30; cTmp2=xorDat&0x0f; //取低4位 cTmp2+=0x30; SendBuf[7]=cTmp1;SendBuf[8]=cTmp2; //做异或运算 UartSends(SendBuf,10); } } } }