1问:如何触发计算机扬声器的声音?

答:编写如下C-Action:
#pragmacode("kernel32.dll");
BOOLBeep(DWORDdwFreq,DWORDdwDuration);
#pragmacode();
Beep(500,500);

2、问:如何通过C脚本来确定报警信息?
答:首先必须在画面中插入报警控件,可以用如下两种方式来确认信息:
(1)、确认单条信息
4版本和高于此版本的WinCC
BOOLOnBtnSinglAckn(char*lpszPictureName,char*lpszObjectName)
5版本和高于此版本的WinCC
BOOLAXC_OnBtnSinglAckn(char*lpszPictureName,char*lpszObjectName)

(2)、确认报警窗口所有可见的报警
4版本和低于此版本的WinCC
BOOLOnBtnVisibleAckn(char*lpszPictureName,char*lpszObjectName)

5版本和高于此版本的WinCC
BOOLAXC_OnBtnVisibleAckn(char*lpszPictureName,char*lpszObjectName)

3、问:如何在WinCC中读取系统时间?
答:通过如下C-Action:
#pragmacode("kernel32.dll");
VoidGetLocalTimes(SYSTEMTIME*lpst);
#pragmacode();
SYSTEMTIMEtime;
GetLocalTime(&time);
SetTagWord("Varname",time.wYear);
SetTagWord("Varname",time.wMonth);
SetTagWord("Varname",time.wDayOfWeek);
SetTagWord("Varname",time.wDay);
SetTagWord("Varname",time.wHour);
SetTagWord("Varname",time.wMinute);
SetTagWord("Varname",time.wSecond);
SetTagWord("Varname",time.wMilliseconds);

4、问:如何经Windows对话框设置日期时间?
答:通过调用Windows对话框实现。具体如下:
#include"apdefap.h"
voidonClick(char*lpszPictureName,char*lpszObjectName,
char*lpszPropertyName)
{ProgramExcute("c:\\win98\\control.exetimedate.cpl");}
其中执行的程序路径,需根据具体情况填写。

5、问:如何在WinCC中调用SQL语言?
答:1、创建一个SQL文件,此文件在ISQL中建立,文件内包含所要执行的SQL语句。Windows对话框实现。具体如下:
2、在WinCC中用CScript调用上述SQL文件,如下所示:
#include"apdefap.h"
voidOnLButtonDown(char*lpszPictureName,
char*lpszObjectName,
char*lpszPropertyName,
UINTnFlags,intx,inty)
{
char*a="c:\\siemens\\common\\SQLANY\\ISQL-q-b-c
UID=DBA;PWD=SQL;DBF=E:\\testsql\\testsqlRT.DB;
DBN=CC_testsql_99-12-03-12:48:26R;READ
E:testsql\\test.sql";
Printf("%s\r\n",a);
ProgramExcute(a);
}
下面是一个简单的SQL文件内容:
select*frompde#hd#t#test;
outputtoe:\\test2.txtFORMATascii
注意:文件名及路径中不要带空格。

6、问:如何整点启动归档?
答:在"GlobleScript"下的Projectfunction编写程序函数:cyclicarchive
BOOLcyclicarchive()
{
#pragmacode("kernel.dll");
voidGetLocalTime(SYSTEMTIME*lpsz);
#pragmacode();
SYSTEMTIMEtime;
Intt1;
GetLocalTime(&time);
T1=time.wMinute;
If(t1==00)
{
SetTagBit("startarchive",1);
Return(BOOL)(GetTagBit("startarchive"));
}
}
在Tagloging中的"Propertiesofprocesstag"中的"archivetag"Tab下的Archivetype选择Cycle-selective,在"Event"标签下的"StartEvent"内选择cyclicarchive函数。

7、问:HowcanIsetandresetaWinCCvariablebymouseclickwithCscript?
答:ThefollowingfunctionshowshowyoucanalternatelysetandresetaWinCCvariablebymouseclick.
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
BOOLz;
z=GetTagBit("MyBitVariable");
if(z==0)
SetTagBit("MyBitVariable",1);
else
SetTagBit("MyBitVariable",0);
}

8、问:HowcanIprogramawaitingfunction(Sleep)inWinCC?
答:Thefollowingsampleprogramshowshowthe"Sleep"isused.
#pragmacode("Kernel32.dll")
voidSleep(intmilliseconds);
#pragmacode()
Sleep(1000);//timespecificationinmilliseconds
Warning:
IfyouuseSleep(),processingtheCscriptisinterruptedforthetimeindicated.Requestsfortheinterruptedfunctioncannotbeprocessedduringthistime.

9、问:HowcanIoutputaSIMATICtimerminutesandsecondsinWinCC?
答:IfyouwanttooutputaSIMATICTimerinminutesandsecondsinWinCC,theninWinCCpleaseuseastatictextintheGraphicsDesignertowhichyouinterfacethefollowingaction:
char*_main(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
char*p;
DWORDhilf;
intmin,sec;
p=SysMalloc(10);
hilf=GetTagDWord("Time");
min=hilf/60000;
sec=hilf%60000/1000;
sprintf(p,"%dmin%dsec",min,sec);
returnp;
}
The"Time"variablelinkedtotheI/Ofieldmusthavethefollowingproperties:
?Datatype"32-bitvaluewithoutsign"
?Formatadaptation"DwordToSimaticBCDTimer"
?Address:dataarea"Times"andaddressing"Word"
10:快捷地切换画面
通常要将所有的设备都显示在一张画面里是不可能的,所以将设备按照处理工艺的功能步骤分级在多张画面内,以一个污水处理厂为例分为电泳线、前处理线、生化线、加药线等,之间的切换使用按钮的鼠标动作来实现。这对于用WinCC现成的鼠标动作来实现是很简单的,但是不是要在每张图上都使用相同数量且位置排列顺序一致的按钮呢?(出于对操作的一致性考虑,不能让操作人员在不同的图上,不同的位置找想要操作的按钮)这个问题的解决我们使用WinCC的脚本编程,在按钮动作中调用它的内部函数来实现。首先,组态一幅背景画面,其中包括要显示的静态文本、OLE(例如,时钟)、所有的图形切换按钮及推出关机按钮。第二,在背景画面中插入智能对象(SmartObject)中的画面窗口(PictureWindow),并且使其的尺寸与其分级画面相同。第三,在相应的切换按钮的属性->事件->鼠标动作中编写如下C语言脚本代码:
#include\"apdefap.h\"
voidonClick(char*lpszPictureName,
char*lpszObjectName,char*lpszPropertyName)
{
SetPictureName(\"背景画面\",\"画面窗口\",\"电泳处理线\");
}//\"背景画面\"即为始终显示地静态背景的属性名,\"画面窗口\"即为在背景画//面中插入地画面窗口(Picture
Window)属性名,\"电泳处理线\"即为分级画面//的名称

这样就能方便快捷地切换画面。

11:必须始终显示的报警记录,用画面颜色闪烁来提示操作者有故障发生,可以用同样的C语言脚本(当然不是加在鼠标动作中)在背景画面的底部留下一条类似Windows状态栏的报警栏,当出现故障报警的时候在报警栏显示最近一条报警记录,操作人员可以利用按钮切换到主报警记录画面了解故障的完全信息。

12:单个部件的组态
WinCC在其内部的图库里集成很多的图形对象,如水箱、电机、阀门等等,对于污水处理用的最多的是水池,搅拌机等等。为了使组态画面贴近实际,能够更好的反应现场工况,图库里的元素并不能满足要求。我们可以利用WinCC的画图工具自己绘制适应实际的图形元素,并且使用C脚本使其产生动画效果。

对于调节池,反应池等可以用矩形来表示,以图形的填充高度来示意其液位的高度。这里要注意的是一些数值地转化,由于一些仪表例如E+H的超声波液位计,是以4~20毫安的电流信号进入PLC,对于表的参数设定好以后4毫安就对应相应池子的液位最低点,而20毫安对应于池子的液位最高点。所以在显示数字高度的时候要将PLC相对4、20毫安的数值转化为实际池子的高度范围例如,0.5~5.5米。但是对于图形填充的时候是按照百分数来表示的所以还要将PLC数值转化为0~100%的度量范围。
搅拌机的组态可以使用C脚本使其产生动画,在其运行时产生视觉上的旋转。实际上搅拌机的图形是用两个部分椭圆组成的,在椭圆的属性->几何->半径中加入代码如下:
#include\"apdefap.h\"
long_main(char*lpszPictureName,char*lpszObjectName,char*
lpszPropertyName)
{
staticintx=25,y,z;//x为半径的初始值为25,y为切换变量,z为搅拌机运行状态变量
z=GetTagBit(\"202搅拌机运行\");//取得PLC搅拌机的运行状态
if(z!=0)
{
switch(y)
{
case0:
x=x-4;
if(x=25)
y=0;
break;
}
}
returnx;
}

13:语音报警的组态
在工业现场安全是极其重要的,无论从那个角度讲我们应该利用一切手段减少故障的发生。在故障已经发生的时候,应该在第一时间以多种方式通知操作人员有故障发生。现代微处理计算机的处理速度可以完全胜任对于图形,语音地同时处理。所以我们可以利用计算机的声卡和音箱在有故障发生的时候产生语言报警,但是问题是WinCC本身并不能产生语音的功能,而且其内部的上千个函数也没有提供处理声音的函数。解决这个问题的方法归功于微软开发的WinCC与操作系统地完美结合,因为在WinCC中可以直接调用Windows的API函数。实现的具体C脚本代码如下:
long_main(char*lpszPictureName,char*lpszObjectName,char*
lpszPropertyName)
{
#pragmacode(\"Winmm.dll\")
voidWINAPIPlaySoundA(char*pszSound,char*hmode,DWORDdwflay);
#pragmacode()
if(GetTagBit(\"112排泥备泵故障\"))
PlaySoundA(\"d:\\\\\\\\winnt\\\\\\\\media\\\\\\\\Mircosoftsound.wav\",NULL,8);
return1020;
}
有一个值得主意的问题是此段代码的加入点,通过反复多次的实践得出结论,即这个点必须加在始终显示于屏幕上的任何图形元素的属性中,这样才能达到语言报警的预期效果。
激情如火:引用加为好友发送留言2005-11-913:06:00

14:当为WinCC指定PC名时应注意什么?
解答:
计算机名不能包含特殊字符如空格、退格和下划线,并前13个字符必须是唯一的。
由于操作系统的原因,名字的长度不能超过15个字符。
因此推荐只使用atoz,AtoZ,0to9这些字符。必须以子母开头。
从SIMATICWinCCV6.0起,有如下限制:
计算机名可包含下划线。然而,当使用DNS主机名时,不能使用下划线。

15:和plc用S7通讯为什么产生连接错误代码:D801?
解答:
这个错误代码表示WinCC变量地址错误,检查每个变量的地址和通讯连接是否正确,如果变量的地址不属于控制器的地址范围,则会报这个错误代码。

16:和plc用S7通讯怎样清除错误代码8304?
解答:
WinCC运行时的画面不再更新,WinCC的日志文件中有错误代码8304,这个错误码表明WinCC和S7连接出现问题。
解决方法:
停止AS站的循环读服务,在"WinCCExplorer>变量管理>SIMATICS7PROTOCOLSUITE"
中。右键单击出现问题的S7连接,选择"系统参数",清除复选框“周期管理>通过PLC”的选择。

17:在动态值域对话框中怎样才能按逻辑连接两个因变量到一个结果?
解答:
由于在WinCC动态值域对话框中的布尔数学体系运算符,您可以根据C脚本惯例运用这些符号。
下面是符号及其意思的概括:
与位比较&
与表达式比较&&
或位比较|
或表达式比较||
非!
通过Object>Properties>Dynamic进入WinCC动态值域对话框,>>并右击"DynamicValueRangesdialog"按照需要输入表达式即可。

18:WinCC图形编辑器中是否存在通过鼠标点击达到增加/减少变量值的对象?
解答:
可以使用OCX“SpinButton”实现这个功能。下面描述了如何合并和联系这个对象。
在WinCC图形编辑器中,插入一个“Control”类型的小对象。在打开的窗口中选择进入MicrosoftForms2.0SpinButton并以OK来确认。
右击打开对象“SpinButton”的属性。在控制属性中使用您想要的变量来连接“Value”属性。
但要注意:
使用第三方的ActiveX控件会导致错误(例如内存丢失,性能降低,系统阻塞)。"软件应用者应该对由于使用第三方ActiveX控件而造成的任何问题负责。

ActiveX控件事件连接C脚本
如果连接C脚本到ActiveX控件事件,那么应该确认这个事件名至少5个字符长。如果这个事件名少于5个字符长,那么C脚本不被执行。

19:重新启动后,不使用登录窗口如何以一个缺省用户的身份自动登录?怎样确保运行期间有个缺省用户始终处于登入状态?即使另外一个用户已经预先退出。
解答:
重新启动以及在运行期间,您希望HMI系统达到最小的实用性而不使用登录窗口。然而,对于高级操作,登录功能应当保留。此外,如果没有用户登录,则有一个缺省的用户自动登录。缺省用户的权限可以在用户管理器中根据需要设定。
可使用下面的C脚本执行此项功能,请按照下列步骤进行:
将附件中的函数“Silentlogin.pas”复制到项目中的“PAS”子文件夹中。
在项目中选择GlobalScript>CEditor>Actions>GlobalActions并打开全局动作(GlobalAction)“Silentlogin.pas”。
在“PWRTSilentLogin(“Login”,“Password”);”一行中,用缺省的用户名替换用户“Login”,用缺省用户的口令代替“Password”。
编译和保存C脚本。
用变量@CurrentUser设置一个变量触发器,周期选择为“2s”。这确保了系统不会因脚本而负荷过重。在所述的例子中,变量@CurrentUser(包含当前登录的用户)每隔2秒钟被询问一次察看有无变化。只有当用户变化时才调用脚本,例如当前用户退出时。
确保已经在计算机的属性“Startup”选项卡上激活了“GlobalScriptRuntime”。
除此之外,SIMATICPCS7(SIMATICPCS7V6.0SP1及更高版本)用户还需执行下列步骤:
将系统画面@Welcome.pdl复制到一个安全的位置,以便可以恢复原始画面。
使用GraphicsDesigner打开画面@Welcome.pdl。
打开保存在选定画面中的C脚本,(右击)>Event>PictureObject>Miscellaneous>OpenPicture)。
注释掉“PASSLoginDialog(Screen);”一行,以//作为注释的前缀。编译C脚本。保存系统画面@Welcome.pdl。

20:如何进行WinCC和S7之间的时间同步?
回答:下面的方法只能进行时间设置而不能完成时间同步的功能。因为必须考虑到延迟,比如报文的处理时间,C脚本的运行时间等,因此这个方法在精度方面不如真正的时间同步精确。
1.创建一个数据块,其中有一个"DATE_AND_TIME"类型的变量和一个布尔变量。当元素"Flag"在WinCC中被置1,程序就调用系统函数SFC0"SET_CLK"。DB1中的触发变量"Flag"(DB1.DBX8.0)在WinCC脚本中被SetTagBitWait("DB1_FLAG",TRUE)置1。因此仅当此C脚本在WinCC中被调用时,时间才被设置。SFC0必须先添加到Step7程序的块文件夹中。在此段程序中,DB块中的各个时间变量被写到作为SFC0参数的"DATE_AND_TIME"类型的本地变量"DateAndTime"中。用"SET_CLK"设置完时钟后,触发变量"Flag"被复位。注意:在此段程序中,本地变量"DateAndTime"存储在以0为起始地址的本地数据堆栈中。如果不得已要把这个变量分配到别的地址,同时对传送指令参数化时,必须要考虑到地址分配的问题。
2.为“年”新建一个"Unsigned8-bitvalue"类型的变量,对其进行格式变换ByteToBCDByte,然后为其在DB块中选择相应的字节地址:在WinCC中创建剩下的变量。选择"Unsigned16-bitvalue"类型然后改变格式为WordToBCDByte,然后在DB块中选择实际的字节地址。
3.最后,在WinCC中创建一个C脚本来读取系统时间并进行拆分,然后把它们写到DB1中。S7PLC中的时钟设置是被脚本中的"DBI_FLAG"变量触发的。

1、 21:WINCC--如何在程序中动态修改用户密码
1、点击“开始”--》“设置”--》“控制面板”--》“管理工具”--》“数据源(ODBC)”,打开ODBC数据源管理器
2、在用户DSN页面的用户数据源中找到与当前项目所关联的一项,其名称为“CC_项目名_项目建立日期时间”,记下该项的名称
3、在脚本中加入以下代码:
#pragmacode("UseGen.dll")
#include"USEGENAP.H"
#pragmacode()
LPCMN_ERRORerr;//定义的LPCMN_ERROR型变量,在函数调用中需使用
if(PWGENConnect("CC_ass_04-09-21_16:35:22",err))//建立与数据库的联接,其中CC_ass_04-09-21_16:35:22用第二步中记下的名称取代
{
if(PWGENChangePassword(GetTagChar("user"),GetTagChar("oldpassword"),GetTagChar("password"),err))//修改密码,user,oldpassword,password分别为存贮用户名,原密码,新密码的内部变量,类型为文本变量8位字符集
{
//密码修改成功后的操作,如给用户提示等
}
}
PWGENDisconnect(err);//断开与数据库的联接
4、编译运行程序
5、工作完成
6、与用户管理相关的函数定义存贮在APPLIB目录下的USEGENAP.H文件中,可根据上面示例自行完成添加用户,修改权限等功能。

22:WinCC6.0中归档时和5.1版本为什么不同了?
WinCCV6.0的后台数据库采用了MSSQLServer2000,所以归档方式与V5.1有所不同,它的运行数据存放在数据片段(segment)当中,工程师可以根据尺寸需求组态最大容量或根据时间周期启动新的数据库归档片段。将归档数据连续的写入数据库,单个数据片段的尺寸到达或者时间界限到达时,系统会自动开启另一个数据片段进行归档。当数据片段的总体尺寸达到最大时,最早的数据片段就会被覆盖,重新开始新的归档。

23:WinCC6.0中如何设定归档周期?
WinCCV6.0版本中的快慢速归档的归档周期界限可以由用户自行设
定,该参数在快速归档属性的第三个标签项中设置。

24:如何计算慢速归档数据库的尺寸?
慢速归档时一条变量归档记录占用32字节的空间,每个变量以2分钟为归档周期,一周之内会产生5040条记录,若有5000个变量的归档,则单个数据片段的大小计算为:
32×5000×5040=806400000byte==>约等于800MB
考虑到留出20%的余量,设定单个数据片段为1G
所有数据归档期限是两个月,因此所有段的尺寸为单个片段尺寸乘以单个片段的个数,
即:1GB×9=9GB

25:如何计算快速速归档数据库的尺寸?
快速归档时一条变量归档记录占用3字节的空间,每个变量以2秒钟为归档周期,一周之内会产生302400条记录,若有50个变量的归档,则单个数据片段的大小计算为:
3×50×302400=45360000byte==>约等于46MB
考虑到留出20%的余量,设定单个数据片段为60MB
所有数据归档期限是两个月,因此所有段的尺寸为单个片段尺寸乘以单个片段的个数,即:60MB×9=540MB

26:所有的归档变量都可以计算出它占用的数据库大小吗?
只有周期连续归档的数据才能定量的计算其占用的数据库尺寸,因此当您对应设定的时间期限计算并设置数据库尺寸大小时,需要考虑其他数据归档类型的数据,留出相应的余量。

27:WinCCV5.1中文版的安装要求是什么?
1)WinCCV5.1亚洲版只有V5.1这一个版本,不再有后继版本,WinCCV5.1亚洲版应安装在Windows2000SP2操作系统上
2)WinCC的语言版本应和操作系统的语言版本相对应,不建议将中文WinCC装在英文操作系统上

28:有没有快捷的方法如何将WinCC的实时数据通过OPCDA记录到MSAccess、MSSQLServer和Oracle数据库中?
可以使用WinCCIndustrialDataBridge将WinCC的实时数据通过OPCDA记录到MSAccess、MSSQLServer和Oracle数据库中,但是需要授权,分为以128、512、2K和10K

29:WinCC能提供的最高变量刷新速度是多少?
对于一般的网络通讯方式来说,WinCC能提供的最高刷新速度是250毫秒,但WinCC采用RawData归档数据链接的方式可以实现对S7-400PLC的高速数据采集。

30:如何实现WinCC高速数据采集?
WinCC采用RawData归档数据链接的方式可以实现对S7-400PLC的高速数据采集。原理是PLC将每个循环周期所采集的过程值(或PLC以其他方式得到的数据或数据包)以一定的顺序存放在具有一定的格式的DB块中,当到达一定的数量后,PLC可以调用系统功能块SFB37(AR_Send)将这个DB块主动地发送给WinCC,然后WinCC会在后台自动调用标准化DLL来拆解数据,并将其按时间顺序保存在数据库中。在WinCC的过程画面中,可以使用在线趋势控件或在线表格控件来查看所采集的数据。
由于是批量传送,可以有效地提高通讯效率,使高速数据采集成为可能,而这时所谓的采集频率就取决于你对保存在DB块中的各过程值间的时间间隔的定义。可以定义的最小的时间间隔是1毫秒。但如果是PLC每个循环周期采样一次,那么定义的时间间隔应大于PLC循环周期。DB块的最大尺寸是16KB。
技巧:可以考虑使用多DB块进行缓冲并添加程序控制DB块的写入和发送顺序,能够实现连续的采集,但要充分考虑CPU的负载和循环周期。

31:WinCC高速数据采集的前提条件是什么?
1)WinCC的版本为V5.1或更高
2)S7-400系列CPU
3)WinCC站与S7400站建立S7连接(包括MPI,ProfiBus,TCP/IP,工业以太网都可以实现)

32:为什么我无法从WinCC里调用STEP7变量?
从WinCC里调用STEP7变量的前提条件是,WinCC的项目文件必须是集成在STEP7项目中的。
在安装所有Simatic软件前,请查阅软件的安装注意事项,确定操作系统与软件的兼容性。该文档一般位于:CD\Documents\\InstallNotes.chm。
要使用WinCC与STEP7的集成功能,WinCC和STEP7必须安装在同一台计算机上,必须在安装WinCC之前安装STEP7。STEP7与WinCC的版本必须一致。

33:如何把现成的WinCC项目集成到STEP7项目中?
如果你在一台计算机上已经安装了兼容的WinCC和STEP7,并且有了一个单独使用的WinCC项目,想把它集成到一个已有的STEP7项目中去。那么,你必须先添加与集成相关的WinCC组件。把WinCC光盘放入光驱,并启动WinCC的安装程序。添加与集成相关的WinCC组件。
按如下步骤把已有WinCC项目文件插入STEP7项目文件
1.在STEP7项目文件中插入一个OS站,然后把它改名为已有的WinCC项目名称。
2.在STEP7项目里删除因仅插入OS站而产生的WinCC项目文件,其位置在STEP7项目文件夹里的wincproj文件夹下,例如:d:\siemens\STEP7\S7proj\STEP7_Integration\wincproj\'NameoftheOS'
3.最后在项目复制器里用’Saveas’把已有的WinCC项目文件存储到STEP7项目路径下。项目复制器位于开始菜单项"Start>SIMATIC>WinCC>Tools"。
注意:对于集成STEP7项目里的WinCC项目,你也可以使用压缩工具(Packer)来归档WinCC项目。
34:wincc怎样和s7plc-sim连接?
要访问PLCSIM模拟软件,必须按如下方法操作,按照以下的顺序来安装程序:
STEP7V5.x
PLCSIMV4.x以上
WinCCV5.x
选择用户自定义安装。对于SIMATICWinCCV5
SP1及以下版本的用户,在“通讯”组件下,必须选择“S7Dos”和“对象管理器”组件。
对于SIMATICWinCCV5
SP2及更高版本的用户,“S7Dos”是自动安装的。就是说不再需要在“用户自定义安装”下选择该选项。在PG/PC界面上做如下设置:在控制面板中双击“设置PG/PC界面”。在“应用程序的访问点”域中,选择“MPI
(WinCC)”。在“使用的界面参数”域中选择“”。启动应用程序STEP7:
启动SIMATIC管理器
启动PLCSIM
打开要模拟的项目或组态一个项目。
在项目中添加一个OS。
在PLCSIM中加载项目。
启动WinCC并创建一个新项目或打开已有的项目。
WinCC
添加“SIMATICS7PROTOCOLSUITE”到变量管理器。
在MPI下添加一个新连接。
右击该连接然后选择“属性”。
点击“属性”按钮。
在“连接”标签中指定MPI地址和已在STEP7中组态好的CPU的插槽。
确认所做的指定。
激活WinCC项目。
进入“开始>SIMATIC>WinCC>工具>通道诊断”。在“通道连接”下可以显示连接的状态。
如果连接没能设好:在WinCC资源管理器中的“系统参数-MPI>单元”中,启用选项“自动设置”。
在“系统参数-MPI>通道”中,取消“使用PLC的循环读取服务”选项。
wincc和西门子PLC仿真通讯需要PLCSIM,先将PLCSIM
运行,建立一个WINCC项目,使用MPI通讯即可,说白了跟MPI通讯一样,只是PLC是用PLCSIM在计算机上模拟的
但是有一点要注意的是,这种方式下不能使用输入区(I区),凡是有输入的地方都要用M区来代替
可以使用输入区(I区),只是有些特殊功能不能用。

35:WINCC-如何使用自定义的对话框实现用户登录?
在登录按钮中加处以下脚本:
#pragmacode("useadmin.dll")
#include"PWRT_API.H"
#pragmacode()
if(PWRTSilentLogin("username","PassWord"))
{
//登录成功后的处理
}

其中"USERNAME","PASSWORD"可以用存储用户名和密码的变量替换.如:
PWRTSilentLogin(GetTagChar("user"),GetTagChar("PassWord"))
当登录成功时,函数返回值为真;如登录失败,则返回值为假。

36:WINCC-如何使用自定义的对话框实现用户退出?
实现登陆:
#pragmacode(""useadmin.dll)
#include"PWRT_api.h"
#Pragmacode()
PWRTlogin('1');
实现退出:
#pragmacode(""useadmin.dll)
#include"PWRT_api.h"
#Pragmacode()
PWRTlogout();

37:如何把GIF图片放到wincc中?
首先插入aniGIF.ocx这个ole控件,然后双击它,在GIF属性中选择您需要显示的GIF图片就可以了。

38:如何将低版本创建的项目移植到WinCCV6.0中?
将项目移植到WinCCV6.0的工作步骤:
WinCCV6.0与其以前的版本相比在数据组织方面有着显著的不同。为了使在WinCCV5.0ServicePack2或WinCCV5.1中创建的项目在WinCCV6.0中也能工作,项目数据必须首先通过移植作相应的调整。为此,WinCCV6.0提供了一个项目移植器,用于自动移植项目的组态数据、运行系统数据和归档数据在移植之前,建议为原版本的项目做一个备份。与此有关的信息参见WinCC信息系统中的主题“使用WinCC”>“使用项目”>“复制和归档项目”。
已归档的文件:如果必须访问先前版本的归档数据,则必须将归档移植到WinCCV6.0。请使用项目移植器移植归档数据和dBASEIII归档。
多用户项目:为了使利用WinCCV5.0SP2或V5.1所创建的多用户项目在WinCCV6.0中能够正常工作,可进行如下操作:
移植系统中所有服务器上的单个多用户项目。如果原来的项目使用了多客户机,则分别单独移植多客户机的项目数据。正常操作中的冗余系统,不用取消激活操作就可在冗余系统中对项目进行升级。此时,将按规定的次序升级服务器、客户机和多客户机。章节“在正常操作中升级冗余系统”中提供了有关的详细说明。
警惕:为了不影响系统操作,必须遵守所描述的步骤次序,且完成所有步骤时不能有任何长时间的中断。
早于WinCCV5.0ServicePack2的WinCC版本:对于早于WinCCV5.0SP2的WinCC版本所创建的项目,必须一步一步地进行移植,将系统先升级到WinCCV5.1,并移植项目。安装WinCCV6.0,并使用项目移植器移植项目。

39:wincc6.0中支持abplc的驱动吗?
WinCCV6.0将不再提供下列通讯通道:
AllenBradleyDHDH+DH485
AllenBradleySerialDF1
ApplicomMultiProtocolInterface
GEFanucSNPSNPX
MitsubishiFX
ModbusProtocolSuite
ModbusSerial
SIMATICS5PMCEthernet
SIMATICS5PMCProfibus
SIPART
可以用OPC来替代。某些通道需附加件的支持。
40:WINCC的授权坏了,显示“AuthorizationSIK/SIMATICWINCCRT128PowerTagsisfaulty.”,重新安装显示已经存在此授权,请问要怎么处理?
可以询问原来的销售商索要一个激活码,可以在authorsw中manageauthorization中右键单击选择“recoverautrorization”输入激活码激活授权即可。

41:用C编程解决授权点数不够用的问题(acsun提供)

当需要的工艺参数超过WinCC版本限制的Tag数目,可以用C语言编程实现多个工艺参数打包成一个Tag传送.例如某个配料称重系统有146个参数超过了WinCC的128个Tag的限制就可以用C语言编程决这一问题而不需要购买更高的授权.
基本思想就是把多个参数在下位机内存中连续排列然后在WinCC中定义一个Tag它的长度是多个参数之和取得这个Tag后编程将其分成多个参数
例如下位机有两个参数LTN44001和LTN44023都是16位整数分别存放在DD99.DW146和DD99.DW148
在WinCC中定义一个外部Tag命名为PackageTag类型为32位整数并联地址为DD99.DBD146再定义两个内部tag名为LTN44001和LTN44023在GlobalScript全局脚本中C语言编程如下
Union
{
LongDword
IntWord[2]
}union
Union.Dword=GetTagDword("PackageTag")
SetTagWord("LTN44001",Union.Word[0])
SetTagWord("LTN44023",Union.Word[0])
这样两个参数LTN44001和LTN44023就通过一个Tag传送上来了理论上只要下位机内存足够可以传送任意数量的参数而不受WinCC版本外部Tag数目的限制.

42:如何在WinCC里用C语言调用SQL语言?
1、创建一个SQL文件。
此文件在ISQL中创建,文件内容是所希望执行的SQL语句。
2、在WinCC的CScript中编写程序调用此SQL文件,如以下程序所示:
#include"apdefap.h"
voidOnLButtonDown(char*lpszPictureName,
char*lpszObjectName,
char*lpszPropertyName,
UINTnFlags,intx,inty)
{
char*a="C:\\SIEMENS\\Common\\SQLANY\\ISQL-q-b-c
UID=DBA;PWD=SQL;DBF=E:\\testsql\\testsqlRT.DB;
DBN=CC_testsql_99-12-03_12:48:26R;
READ
E:\\testsql\\test.sql";
printf("%s\r\n",a);
ProgramExecute(a);
}
下面是一个简单的SQL文件内容:
select*frompde#hd#t#test;
outputtoE:\\test2.txtFORMATascii
注意:文件名及路径中不要带空格。

43:如何整点启动归档?
在"GlobalScript"下的Projectfunctions编写函数:cyclicarchive
BOOLcyclicarchive()
{
#pragmacode("kernel32.dll");
voidGetLocalTime(SYSTEMTIME*lpst);
#pragmacode();
SYSTEMTIMEtime;
Intt1;
GetLocalTime(&time);
t1=time.wMinute;
if(t1==00)
{
SetTagBit("startarchive",1);
return(BOOL)(GetTagBit("startarchive"));
}
}
在Tagloging中的"Propertiesofprocesstag"中的"ArchiveTag"tab下的Archivingtype选择Cycle-selective,在"Event"标签下的"StartEvent"内选择cyclicarchive函数。

44:如何在按键组合被禁用的情况下,从WinCC运行环境进入WinCCControlCenter?
最好是做一个按钮,该按钮需要用用户权限保护,在该钮中编写如下C-action:
低于WinCC5.0版本:
#pragmacode("user32.dll");
BOOLSetForegroundWindow(HWND);
#pragmacode();
HWNDhandle;
handle=FindWindow("MCPFrameWndClass",NULL);
If(!SetForegroundWindow(handle))
Printf("\r\nSetForegroundfails");
WinCC5.0版本以及更高的版本:
#pragmacode("user32.dll");
BOOLSetForegroundWindow(HWND);
#pragmacode();
HWNDhandle;
handle=FindWindow("WinCCExplorerFrameWndClass",NULL);
If(!SetForegroundWindow(handle))
Printf("\r\nSetForegroundfails");

45:WinCC如何实现鼠标OnMouseOVer事件?
用WINDOWAPI函数GetCusorPos获取当前鼠标位置,用GetWindowRect函数获取窗口位置,两值相减得鼠标在WINCCframe上的相对位置。用全局脚本(设定为1s定时刷新),然后获取要OnMouseOver事件的物体的位置,并与鼠标位置相比较,如一致则触发自己定义的动作。
#include"apdefap.h"
intgscAction(void)
{
#pragmacode("user32.dll");
BOOLGetCusorPos(POINTlpPoint);//获取鼠标的位置(绝对位置-对应屏幕分辨率)
BOOLGetWindowRect(HWNDhwnd,LPRECTlpRect);//获取窗体


位置
#pragmacode();
POINTpPos;
RECTrRec;
HWNDhwnd;
BOOLbRet,bRet2;
longlLeft,lTop,lWidth,lHeight;
longlX,lY;
charszStr[100];

hwnd=FindWindow(NULL,"WinCC-Runtime-");//如语言为中文应为"WinCC运行系统-"

if(hwnd==0){printf("\r\nError!WinCcHandleis%d",hwnd);gotoover;}

bRet=GetCursorPos(&pPos);
if(bRet==0)gotoover;

bRet2=GetWindowRect(hwnd,&rRec);
if(bRet2==0)gotoover;
lX=pPos.x-rRec.left;//鼠标对{置
lY=pPos.y-rRec.top;//鼠标位置
//如果为非全屏模式,需将上述数值中的高height判断减去标题栏的宽度
//printf("TheCurrentCusorPosisx:%d,y:%d\r\n",pPos.x,pPos.y);
//printf("TheCusorPosinWindowisx:%d,y:%d\r\n",pPos.x-lLeft2,pPos.y-lTop2);
lLeft=GetLeft("NewPdl0.Pdl","Text1");//Return-Type:longint
lTop=GetTop("NewPdl0.Pdl","Text1");//Return-Type:longint
lWidth=GetWidth("NewPdl0.Pdl","Text1");//Return-Type:longint
lHeight=GetHeight("NewPdl0.Pdl","Text1");//Return-Type:longint
if((lX>=lLeft)&&(lY>=lTop)&&(lX<=lLeft+lWidth)&&(lY<=lTop+lHeight)){
sprintf(szStr,"%d,%d",lX,lY);
SetText("NewPdl0.Pdl","Text1",szStr);//Return-Type:char*
}
//printf("TheText1Posisx:%d,y:%d\r\n",lLeft2,lTop-lTop2);
over:
return0;
}

46:如何实现ASP与WinCCV6数据库sqlserver2000的连接?
WinCCV6用ODK获取DSN名,{后生成网址字符串,再用shellExecuteA函数打开网页
//----------------------------------------------------------------------------------
#pragmacode("shell32.dll")
longShellExecuteA(HWND,LPCTSTR,LPCTSTR,LPCTSTR,LPCTSTR,int);
#pragmacode()

chardsnStr[100];
HWNDhwnd;
sprintf(dsnStr,"http://dcount/test.asp?dsnStr=%s",GetDSN(1));//Return-Type:LPCTSTR
printf("\r\n%s",dsnStr);
hwnd=FindWindow(NULL,"WinCC-Runtime");
ShellExecuteA(hwnd,"open",dsnStr,NULL,"C:\\",SW_SHOWNORMAL);
//-------------------------------------------------------------------------------------

ASP方面需要注意的是连接字符串的形式与普通acessODBC不太一样,而且需要用户名和密码
由于WINCC封装的sa用户的密码暂时不知道,所以必须用SQLServerEnterPriseManager建立自己的用户,添加systemAdministrator权限就可以了!否则会出现错误提示
MicrosoftOLEDBProviderforSQLServer错误'80040e4d'
Loginfailedforuser'sa'.

'--------------------------------------------------------------------------------------
dsnStr=request("dsnStr")
setconn=server.createobject("adodb.connection")
setrs=server.createobject("adodb.recordset")
conn.Provider="sqloledb"
conn.open"Server=DCOUNT\WINCC;Database="&dsnStr&";UID=dcount;pwd=;"
rs.open"select*fromtest",conn,1,1
response.writers.recordcount
dowhilenotrs.eof
response.writers("f1")&"---"&rs("f2")&"---"&rs("f3")
rs.movenext
loop
rs.close
conn.close

47:如何在退出WINCC监控时直接关闭电脑?
1.利用动态向导
2.在脚本中加入DMExitWinCCEx(DM_SDMODE_SYSTEM);也可以

48:如何通过WINCCAPI函数读出当前报警消息?
1、使用GMsgFunction中读出当前报警信息的ID(dwMsgNr);
2、使用MSRTGetMsgCSData函数读出该报警信息ID对应文本库TEXTLIB中的文本ID(dwTextID1);
3、使用MSRTGetMsgText函数读出该文本ID的文本。
信息到达处理:如果读取文本成功,则置文本变量MSG。
信息离去处理:如果MsgNr与上一次相同,则复位MSG,如果不是,则继续保持信息。
具体函数说明请看ODK文档
BOOLGMsgFunction(char*pszMsgData)
{
#pragmacode("msrtcli.dll")
#include"msrtapi.h"
#pragmacode();

MSG_TEXT_STRUCTtMeld;
MSG_CSDATA_STRUCTsM;
CMN_ERRORerr;
BOOLbRet;
DWORDdwTextID1;
DWORDdwMsgNum;
charszMsg[255];
#defineTAG_MSG"MSG"

MSG_RTDATA_STRUCTmRT;
memset(&mRT,0,sizeof(MSG_RTDATA_STRUCT));

if(pszMsgData!=NULL)
{

printf("Meldung:%s\r\n",pszMsgData);
sscanf(pszMsgData,"%ld,%ld,%04d.%02d.%02d,%02d:%02d:%02d:%03d,%ld,%ld,%ld,%d,%d",
&mRT.dwMsgNr,//Meldungsnummer
&mRT.dwMsgState,//StatusMSG_STATE_COME,.._GO,.._QUIT,.._QUIT_SYSTEM
&mRT.stMsgTime.wYear,//Tag
&mRT.stMsgTime.wMonth,//Monat
&mRT.stMsgTime.wDay,//Jahr
&mRT.stMsgTime.wHour,//Stunde
&mRT.stMsgTime.wMinute,//Minute
&mRT.stMsgTime.wSecond,//Sekunde
&mRT.stMsgTime.wMilliseconds,//Millisekunde
&mRT.dwTimeDiff,//ZeitdauerderanstehendenMeldung
&mRT.dwCounter,//InternerMeldungsz?hler
&mRT.dwFlags,//Flags(intern)
&mRT.wPValueUsed,
&mRT.wTextValueUsed);

//**************************************************************************************codefordcount
if(mRT.dwMsgState==MSG_STATE_COME)//信息到达处理
{
dwMsgNum=mRT.dwMsgNr;
printf("\r\nTheAlarmMessageNois%d!\r\n",dwMsgNum);
bRet=MSRTGetMsgCSData(dwMsgNum,&sM,&err);
if(bRet==TRUE)
{
dwTextID1=sM.dwTextID[0];
printf("\r\nTheTextIDofTheMessageNr%dis%d!\r\n",dwMsgNum,dwTextID1);
bRet=MSRTGetMsgText(1,dwTextID1,&tMeld,&err);
if(bRet==TRUE)
{
sprintf(szMsg,"%s",tMeld.szText);
printf("\r\nTheTextofTextID%dis%s!\r\n",dwTextID1,szMsg);
}

}

}
if(mRT.dwMsgState==MSG_STATE_GO)//信息离去处理
{
dwMsgNum=mRT.dwMsgNr;
if(dwMsgNum==GetTagDWord(TAG_MSG_NR))SetTagChar(TAG_MSG,"");

}
//**************************************************************************************codefordcount

//Meldungsdateneinlesen

//Prozesswertelesen,fallsgew???????§???1nscht
}

printf("Nr:%d,St:%x,%d-%d-%d%d:%d:%d.%d,Dur:%d,Cnt%d,Fl%d\r\n",
mRT.dwMsgNr,mRT.dwMsgState,mRT.stMsgTime.wDay,mRT.stMsgTime.wMonth,mRT.stMsgTime.wYear,
mRT.stMsgTime.wHour,mRT.stMsgTime.wMinute,mRT.stMsgTime.wSecond,mRT.stMsgTime.wMilliseconds,mRT.dwTimeDiff,
mRT.dwCounter,mRT.dwFlags);

SetTagChar(TAG_MSG,szMsg);

return(TRUE);
}

49:如何实现用户登陆日志(wincc中用c脚本实现?)(柳树成林原创)
用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控软件)

#include"apdefap.h"

intgscAction(void)
{
#pragmacode("kernel32.dll")
VOIDGetLocalTime(LPSYSTEMTIMElpSystemTime);
#pragmacode()

char*username;
charbuf[128];
staticcharpreuser[128];
unsigneda,b,c,d,e,f;
FILE*fp;
SYSTEMTIMEsysTime;

//读取系统时间,并且复制给变量a,b,c,d,e,f
GetLocalTime(&sysTime);

a=sysTime.wHour;
b=sysTime.wMinute;
c=sysTime.wSecond;
f=sysTime.wYear;
e=sysTime.wMonth;
d=sysTime.wDay;

//得到当前用户名称
username=GetTagChar("@CurrentUser");
fp=fopen("c:\\wincclog.txt","a+");
if(strcmp(username,preuser)!=0)//如果当前用户名称和前一个用户名不同
{
if((strcmp(username,"")!=0)&&(strcmp(preuser,"")==0))//如果当前用户名称不空同时前一个用户名为空

{
sprintf(buf,"用户:%s\t登陆时间是:\t%d-%d-%d,%d-%d-%d\n",username,a,b,c,d,e,f);
fputs(buf,fp);
}
else
{
if((strcmp(username,"")==0)&&(strcmp(preuser,"")!=0))//如果当前用户名称为空同时前一个用户名不空

{
sprintf(buf,"用户:%s\t退出时间是:\t%d-%d-%d,%d-%d-%d\n",preuser,a,b,c,d,e,f);
fputs(buf,fp);
}

else
{
sprintf(buf,"用户:%s\t退出时间是:\t%d-%d-%d,%d-%d-%d\n",preuser,a,b,c,d,e,f);
fputs(buf,fp);
sprintf(buf,"用户:%s\t登陆时间是:\t%d-%d-%d,%d-%d-%d\n",username,a,b,c,d,e,f);
fputs(buf,fp);
}
}
}

strcpy(preuser,username);
fclose(fp);

return0;
}

50:在wincc画面编辑器里注册的OCX控件,由于开发时没有考虑到wincc标准控件中具备层次哪个属性!所以不能够通过画面编辑器里的菜单进行设置OCX控件的层次关系!

建议不要把wincc中注册的OCX控件和wincc本身的标准控件重叠放置,否则wincc本身的标准控件将被覆盖!

转自:http://ningling002002.blog.163.com/blog/static/64029202008228104341310/

WINCC 常见问题相关推荐

  1. WinCC flexible Smart V3 SP2软件安装具体方法和步骤_常见问题处理

    WinCC flexible Smart V3 SP2软件安装具体方法和步骤_常见问题处理 官方网站提供 WinCC flexible Smart V3 SP2软件下载的地址: 点击下载软件 安装之前 ...

  2. 博途plc连接电脑_西门子CP2431通过SIMATIC NET连接WinCC

    CP243-1作为S7-200的以太网模块,除IT功能外,只支持西门子私有的S7协议,理论上只能通过OPC的方式和上位机组态软件通信,OPC服务器可以是S7-200专用的PC ACCESS软件,也可以 ...

  3. 西门子博途v16系统要求_【技成周报30期】西门子系列常见问题答疑汇总

    更多精彩,请点击上方蓝字关注我们!西门子S7-200SMART PLC问题▲▲▲ 问:STEP 7-MicroWIN SMART编程软件当中符号表地址I0.0下面红色波浪线是什么原因? 答:说明该地址 ...

  4. 博图程序需要手动同步_西门子S7-200SMART PLC 常见问题

    西门子S7-200SMART PLC 常见问题 问:西门子S7-200SMART PLC编程软件输入触点为啥输入错误,一直是问号,是哪里错误了? 答:输入触点完之后,按一下回车键,或者点击空白处即可. ...

  5. 200 smart和博图wincc做项目

    200 smart 软件下载:有PC Access和GSD文件.还有文档帮助信息 https://new.siemens.com//cn/zh/products/automation/systems/ ...

  6. Wincc RT Professional第三讲-两台电脑通信

     ̄ 3 ̄博图软件安装下载教程(点我) ̄ε  ̄ Wincc RT Professional第一讲-组态 Wincc RT Professional第二讲-本地通信 Wincc RT Profession ...

  7. llvm常见问题 (FAQ)

    llvm常见问题 (FAQ) License 可以修改 LLVM 源代码并重新分发修改后的源代码吗? 可以修改 LLVM 源代码并重新分发基于二进制文件或其它工具,而无需重新分发源代码吗? 源代码 L ...

  8. 深度学习常见问题解析

    深度学习常见问题解析 计算机视觉与自动驾驶 今天 一.为什么深层神经网络难以训练? 1.梯度消失.梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习 ...

  9. oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题

    常见问题:如何使用AWR报告来诊断数据库性能问题 (Doc ID 1523048.1) Last updated on FEBRUARY 03, 2019 适用于: Oracle Database - ...

最新文章

  1. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续2篇-模板导出综合示例)...
  2. struts实战--添加功能(重点文件上传)
  3. 惠普服务器显示灯闪红灯,惠普打印机指示灯闪烁什么意思? 惠普2130打印机故障灯大全图解...
  4. UIGestureRecognizer与UIButton Action在同一界面冲突的问题
  5. php无刷新跳转,用#号实现web页面的无刷新跳转
  6. 用Remastersys定制自己的Ubuntu安装光盘
  7. Oracle virtual box 安装系统黑屏问题
  8. 19.软件生命周期(2)
  9. Arcgis将圆任意等分思路(附python实现代码)
  10. 3. 一元函数积分学
  11. 硬件基础-开尔文电桥法
  12. 《关键对话——掌握关键对话》读书笔记(二)
  13. http post muti form
  14. JavaFX 边框背景
  15. 荐书 | 手牵手一步两步望着天,看星星一颗两颗连成线
  16. C语言如何制作dIL文件,C语言怎么加循环
  17. 使用pgloader迁移MySQL至openGauss
  18. 简单分析为什么知识要付费
  19. 子午圈和卯酉圈的定义
  20. 计算机网络——PPP协议与HDLC协议

热门文章

  1. win10的cmd显示颜色更换为绿色的方法
  2. 无法卸载vue2.x提示up to date
  3. 鸿蒙OS应用(HarmonyOS Application)开发常见示例源码
  4. 任务调度:全网最全 xxl-job任务触发流程
  5. 使用 this.$parent 子组件调用父组件方法
  6. IOS端 vux中scroll滚动自动回弹到顶部或者左侧的解决办法
  7. css中如何使div元素居中垂直水平居中
  8. MySQL8.0 OCP最新版1Z0-908认证考试题库整理-004
  9. H3C CAS 5.0 虚拟机备份与还原
  10. 4个易打动人的营销技巧