Wincc中变量参数的设定

2012-04-29 05:12:52徐刚
电脑知识与技术 2012年5期
关键词:变量

徐刚

摘要:WINCC通过类C语言编程实现画面和声音的报警,但变量值需频繁设定且易丢失;通过VB编程设定初始化文件中的变量,能彻底解决之,并给出了相应程序。

关键词:VB;WINCC;变量

中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)05-1102-03

1概述

从面市伊始,用户就对SIMATICWinCC印象深刻。一方面,是其高水平的创新,它使用户在早期就认识到即将到来的发展趋势并予以实现;另一方面,是其基于标准的长期产品策略,可确保用户的投资利益。凭籍这种战略思想,WinCC,这一运行于Microsoft Windows 2000和XP下的Windows控制中心,已发展成为欧洲市场中的领导者,乃至业界遵循的标准。如果你想使设备和机器最优化运行,如果你想最大程度地提高工厂的可用性和生产效率,WinCC当是上乘之选。

水厂生产自动化中控室使用西门子的自动化监控软件WINCC6.0,在编程代码支持类c的语言代码。在厂区检测图中,对于出厂水压力、出厂水压力、加药量等模拟量的关键数据在wincc编程中不仅在画面上报警,指示灯颜色又绿色变成红色,而且提供了声音的报警。

图1

2编程原理

2.1 VBScript和ANSI-C——编写脚本的最佳选择

通常,画面、操作逻辑和动画都是通过简单的对话框组态的。如果有必要,也可以使用脚本如VBScript或ANSI-C,例如用来转换数值、启动报表或生成操作员消息。VBScript有其自己的用户友好、带调试支持的编辑器。脚本本身能访问所有WinCC图形对象的属性和方法,以及ActiveX控件和其它制造商的应用程序对象模型。这使你能控制对象的动态性能,方便地建立与其它制造商应用程序的连接,例如与Microsoft Excel和SQL数据库的连接。

2.2开放性编程接口——C-API

由于有API接口,WinCC功能模块是开放的,通过它可以访问组态和运行时系统的数据和功能。这意味着,可在你的脚本中使用WinCC组态和运行时功能,甚至可以开发独立的应用程序,直接对WinCC进行访问。这样更多的应用程序可以自已开发。

3程序设计

该程序的关键工艺参数设定需要专业的编程人员,很容易想到用变量来对应这些工艺参数的上下限报警值,,如果在报警设置的上限和下限中与变量连接,虽然在运行中可以起到报警的作用,但是一旦遇到系统关闭或者机器死机重启之后,这些变量都会归零。现在需要解决的问题就是即使在重启之后这些变量也能恢复设置时的值,用ini文件比较方便,以下给出了初始化文件的范例。

API函数

#pragma code ("kernel32.dll")

VOID WINAPI GetPrivateProfileStringA (char * lpApplicationName , char * lpKeyName, char * lpDefault , char lpReturnedString[256] , long int nsize , char * lpFileName);

VOID WINAPI WritePrivateProfileStringA (char * lpApplicationName, char * lpKeyName,char * lpString, char * lpFileName);

#pragma code()

两个函数分别实现读和写数据。或者使用c语言的fprintf和fscanf函数,自己定义文本文件格式实现,我不推荐。

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

写入.ini

Private Sub cmdbqzm_Click()

Dim success As Long

Frmmain.txtcjsw = "4.3"

Frmmain.txtjfl = "0.8"

Frmmain.txtjll = "0.44"

success = WritePrivateProfileString("MyApp", "长江水位", Frmmain.txtcjsw.Text, "c:aa.ini")

success = WritePrivateProfileString("MyApp", "加矾量", Frmmain.txtjfl.Text, "c:aa.ini")

success = WritePrivateProfileString("MyApp", "加氯量", Frmmain.txtjll.Text, "c:aa.ini")

End Sub

此时c:aa.ini文件中的内容如下:

[Myapp]

长江水位=4.3

加矾量=0.8

加氯量=0.44

调用.ini

Private Sub Form_Load()

Dim ret As Long

Dim buff As String

buff = String(255, 0)

ret = GetPrivateProfileString("Myapp", "长江水位", "4.5", buff, 256, "c:aa.ini")

txtname.Text =buff

ret = GetPrivateProfileString("Myapp", "加矾量", "0.85", buff, 256, "c:aa.ini")

txtage.Text =buff

ret = GetPrivateProfileString("Myapp", "加氯量", "0.5", buff, 256, "c:aa.ini")

txtsex.Text =buff

上面程序中长江水位“4.5”是默认值,加矾量、加氯量也是如此。使用INI文件保存配置信息是很方便的,它最大的优点就是用户可以手工去就改它,它通常用来保存一些不是至关重要的数据。它的缺点就是不适合保存结构比较复杂的数据,而且文件容易被破坏。

4程序

附声音报警的程序alarm.pas

#include "apdefap.h"

int gscAction( void )

{int i;

char* pszToken;

#pragma code("Winmm.dll")

BOOL WINAPI sndPlaySoundA(char* szWave,DWORD dwFlag);

#pragma code()

DWORD SND_ASYNC=0x0001;

DWORD SND_LOOP=0x0008;

BOOL n1;

SetTagBit("ALARM_5",(GetTagFloat("lf_out_water_nephelo2")>7));

//SetTagBit("reset_5",(GetTagFloat("lf_out_water_nephelo2")<5));//Return - Type :BOOL

SetTagBit("ALARM_6",(GetTagFloat("lf_cszd_3")>7)); //Return - Type :BOOL

//SetTagBit("reset_6",(GetTagFloat("lf_cszd_3")<5));//Return - Type :BOOL

//清水库(西)水位

SetTagBit("ALARM_7",(GetTagFloat("lf_cszd_4")>7));

//SetTagBit("reset_7",(GetTagFloat("lf_cszd_4")<5));//Return - Type :BOOL

SetTagBit("ALARM_8",GetTagBit("monitor"));

tTagBit("ALARM_9",(GetTagFloat("2pf_gen_press")<250));

//SetTagBit("ALARM_10",(GetTagFloat("2pf_neopelo")>0.3));

/SetTagBit("ALARM_11",(GetTagFloat("2pf_over_ch")>1)|(GetTagFloat("2pf_over_ch")<0.3));

SetTagBit("ALARM_12",(GetTagFloat("lf_drug")<0.05)|(GetTagFloat("lf_jyl")<0.05));

//SetTagBit("ALARM_13",(GetTagFloat("lc_p1")<4)|(GetTagFloat("lc_p2")<4));

SetTagBit("ALARMZ",GetTagBit("ALARM_1") | GetTagBit("ALARM_2")| GetTagBit("ALARM_3")| GetTagBit("ALARM_4")| GetTag? Bit("ALARM_5") | GetTagBit("ALARM_6") | GetTagBit("ALARM_7") | GetTagBit("ALARM_8") | GetTagBit("ALARM_9") | GetTag? Bit("ALARM_12"));

if (! GetTagBit("ALARMZ"))

SetTagBit("resetz",1);

//SetTagBit("resetz",GetTagBit("reset_1") & GetTagBit("reset_2")& GetTagBit("reset_3")& GetTagBit("reset_4") & GetTagBit("reset_ 5") & GetTagBit("reset_6") & GetTagBit("reset_7"));

n1=GetTagBit("ALARMZ")&GetTagBit("resetz");

//Return - Type :short int

//Return - Type :short int

//Return - Type :BOOL

if (n1)

sndPlaySoundA("D:\AWAV\alarm1.WAV",SND_ASYNC|SND_LOOP);

else

sndPlaySoundA(NULL,SND_ASYNC);

//sndPlaySoundA("C:\windows\media\office97\laser.wav",SND_ASYNC|SND_LOOP);

SetTagFloat("cjsw",GetTagFloat("cj_water_level"));

//}

return 1; }

参考文献:

[1]深入浅出西门子WINCC V6[Z].

猜你喜欢
变量
抓住不变量解题
也谈分离变量
素变量混合幂丢番图逼近
SL(3,3n)和SU(3,3n)的第一Cartan不变量
分离变量法:常见的通性通法
变中抓“不变量”等7则