对于C脚本的创建和编辑,WinCC提供了两个不同的编辑器:一个是图形编辑器中的动作编辑器,用于在对象处创建C动作;另一个是全局脚本编辑器,用于创建项目函数和全局动作。脚本语言的语法与采用ANSI的标准C语言相一致。
在WinCC中,编程语言C的另一个应用领域是关于动态向导的创建,关于动态向导的应用已在第5章中详细阐述,此处不再赘述。
1.C动作编辑器
在图形编辑器中,可以通过C动作使对象属性动态化。同样,也可以使用C动作来响应对象事件。
对于C动作的组态,可以使用动作编辑器来实现。此编辑器可以在对象属性对话框中通过以下方法打开,即单击鼠标右键,选中期望的属性或事件,然后从弹出的菜单中选择C动作。已经存在的C动作在属性或事件处用绿色箭头标记,如图10-7所示。
图10-7 对象属性对话框
如图10-8所示,在动作编辑器中,可以编写C动作。对于属性的C动作,必须定义触发器;对于事件的C动作,由于事件本身就是触发器,所以不必再定义。完成的C动作必须进行编译,如果编译程序没有检测到错误,则可以通过单击“确定”按钮退出动作编辑器。
图10-8 动作编辑器
(1)C动作的结构
通常,一个C动作相当于C中的一个函数。C动作有两种不同的类型:为属性创建的动作和为事件创建的动作。通常,属性的C动作用于根据不同的环境条件控制此属性的值(例如变量的值)。对于这种类型的C动作,必须定义触发器来控制其执行,而事件的C动作用来响应此事件。
1)属性的C动作
图10-9所示实例是一个典型的属性的C动作。各部分的含义描述如下:
图10-9 属性C动作实例
①标题(黑底):黑底字段显示的两行构成C动作的标题,该标题自动生成并且不能更改。除返回值类型之外,所有属性的函数标题都完全相同。
在C动作标题的第一行内,包含文件apdefap.h。通过该文件向C动作预告所有的项目函数、校准函数以及内部函数。
C动作标题的第二部分为函数标题。该函数标题提供有关C动作的返回值和可以在C动作中使用的传送参数的信息。这里将三个参数传递给C动作,即画面名称(lpszPictureName)、对象名(lpszObjectName)和属性名(lpszPropertyName)。
C动作标题的第三部分是开始花括弧,此花括弧不能删除。在该开始大括弧和结束大括弧之间编写C动作的实际代码。
②编译器设置(1):#pragma option用来设置编译器,mbcs指的是多字节字符集。因此,本实例中语句#pragma option(mbcs)表示设置WINCC的C脚本编译器,使其支持多字节字符集。
③变量声明(2):在可以编辑的第一个代码段中声明使用的变量。在本实例代码中,指的是一个char*型的变量。
④数值计算(3):在本段中,执行属性值的计算。在本实例代码中,读入一个字符串型变量的值。
⑤数值返回(4):将计算得到的属性值赋给C动作对应的属性。这通过return命令来完成。
⑥其他自动生成的代码:包括两个注释块。若要使交叉索引编辑器可以访问C动作的内部信息,则需要这两个块,要允许C动作中语句重新排列也需要这两个块。如果这些选项都不用,则也可以删除这两个注释块。
第一个注释块用于定义C动作中所使用的WinCC变量。在程序代码中,必须使用所定义的变量名称而不是实际的变量名称。
第二个注释块用于定义C动作中使用的WinCC画面。在程序代码中也必须使用定义的画面名称而不是实际的画面名称。
另外,注意到图中黑底方框处显示EventName(时间名称)默认选项为Default trigger。如图10-10所示,该属性事件按照2s的“Standard cycle(标准周期)”周期性地执行。
图10-10 “Change trigger”对话框
事实上,属性动作的触发信号共分为四类:Tag(变量)、Standard cycle(标准周期)、Picture cycle(图形周期)和Window cycle(窗口周期)。用户可根据需要自行选择。
2)事件的C动作
图10-11所示实例是一个典型的事件的C动作。各部分的含义描述如下:
图10-11 事件C动作实例
①标题(黑底):黑底字段显示的两行构成C动作的标题。OnClick表示该动作对应事件为“鼠标动作”,该标题自动生成并且不能更改。但与属性动作相反,对于不同类型的事件,其函数标题也不相同,例如OnRButtonDown代表“右击鼠标”事件,OnLButtonDown代表“左击鼠标”事件。将参数画面名称(lpszPictureName)、对象名(lpszObjectName)和属性名(lpszPropertyName)传递给C动作。参数lpszPropertyName只包含与响应属性变化相关的信息。可以传送附加的事件指定的参数。
②变量声明(1):在可以编辑的第一个代码段中声明使用的变量。在本实例代码中,指的是一个char*型的变量。
③数值计算(2):在本段中,读入一个字符串型变量的值。
④事件处理(3):在本段中,执行响应事件的动作。在本实例代码中,读入一个WinCC变量的数值,该数值作为“名称”分配给自己的对象,本例中将变量字符串pro中的内容设置为Button对象的名称。事件C动作的返回值为Void型,也就是说不需要返回值。
(2)组态C动作
表10-5描述了组态C脚本动作的步骤。
表10-5 组态C脚本动作的步骤
(续)
2.全局脚本C编辑器
项目函数、标准函数和动作是过程动态化的基础,WinCC通过全局脚本编辑器(这里特指C脚本编辑器,与VBS相区别,本小节中简称为全局脚本C编辑器)可支持函数和动作的创建与编辑。
全局脚本编辑器可以在WinCC项目管理器中通过以下方法打开:
如图10-12所示,在浏览窗口中选择“Global Script”中的“C-Editor”,右键单击选择菜单中的“Open(打开)”选项或直接双击打开全局脚本C编辑器,如图10-13所示。
图10-12 打开全局脚本编辑器
图10-13 全局脚本C编辑器
(1)菜单栏
菜单栏选项根据当前所编辑内容的不同而变化。它始终可见。
(2)工具栏
全局脚本具有两个工具栏,需要时可使其可见,并可用鼠标拖动到画面的任何地方。
(3)编辑窗口
函数和动作均在编辑窗口中进行写入和编辑,只有为编辑而打开函数或动作时才显示编辑窗口。每个函数或动作都单独在编辑窗口打开,可同时打开多个编辑窗口。
说明:函数或动作所包含的字符,包括空格在内,不能超过32767个字符。
(4)浏览窗口
浏览窗口用于选择将要编辑或插入到编辑窗口中光标位置处的函数和动作。浏览器窗口中的函数和动作均按组的多层体系进行组织。其中,函数以其函数名显示;对于动作,显示文件名。
WinCC在浏览窗口中提供了一些列的标准函数,这些Standard Functions(标准函数)主要提供了以下功能:
1)Alarm组包含与WinCC报警相关的函数。
2)Graphics组包含用于图形系统编程的函数。
3)Report组包含用来启动打印作业的打印预览或打印输出的函数。
4)UserArc组包含访问和操作WinCC用户归档的函数。
5)WinCC组包含WinCC系统的函数。
6)Windows组仅包含Program Execute函数。
WinCC内部函数提供的主要功能如下:
1)Allocate组包含分配和释放内存的函数。
2)C_bib组包含来自C库的C函数。
3)Graphics组中的函数可以读取或设置WinCC图形对象的属性。
4)Tag组的函数可以读取或设置WinCC变量。
5)WinCC组的函数可以在运行系统中定义各种设置。
此外,C脚本还提供了丰富的扩展功能:
1)调用WindowsAPI函数。例如,使用GetOpenFileName实现打开选择文件对话框的功能。
2)调用C函数。例如,使用SetXGinaValue()锁定/释放Windows组合键。
3)WinCC还允许用户使用自定义的DLL。例如,使用自定义的DLL实现与第三方设备通信。
调用动态链接库时,在函数或动作前需要添加如下代码:
#pragmacode("<Name>.dll")
<Typeofreturnedvalue><Function_namen>(...);
……
#pragmacode()
注意:使用VB创建的DLL不能被加载。
(5)输出窗口
函数在“文件中查找”或“编译所有函数”的结果将显示在输出窗口中。默认状态下它是可见的,但也可将其隐藏。
1)在文件中查找
搜索的结果按每找到一个搜索术语显示一行的方式显示在输出窗口中。每行均有一个行号,并会显示路径和文件名以及找到的搜索术语所在行的行号和文本。
通过双击显示在输出窗口中的行可打开相关的文件,光标将放置在找到搜索术语的行中。
2)编译所有函数
必要时,编译器将输出每个编译函数的警告及出错消息,下一行将显示已编译函数的路径和文件名以及编译器的摘要消息。
(6)状态栏
状态栏位于全局C脚本窗口的下边缘,可以显示或隐藏。它包含了与编辑器窗口中光标位置以及键盘设置等有关的信息。此外,状态栏可显示当前所选全局脚本函数的简短描述,也可显示其提示信息。(www.xing528.com)
1)函数相关操作
①使用函数
如果在多个动作中必须执行同样的计算,只是具有不同的起始值,则最好编写函数来执行该计算,然后在动作中用当前参数方便调用该函数。如图10-14所示。
图10-14 动作和函数的使用
这种方法具有许多优势:
a只编写一次代码。
b只需在一个地方,即在函数中作修改,而不需在每个动作中修改。
c动作代码更简短,因而也更明了。
②查找函数
为了访问已存在的函数或创建新的函数,用户既可使用全局脚本浏览窗口中的“File”菜单,也可单击工具栏中相应的按钮。
③创建新的函数
对于项目函数和标准函数,该过程是一样的。在浏览窗口中,指定类型(项目函数或标准函数),对于标准函数,则指定组,例如“graphics”。这样也就指定了文件将被保存的地方。
全局脚本将为新函数建议一个默认名称,例如“new_function_3”,这也是函数的文件名。为了确保函数名是唯一的,建议的名称包括顺序的编号。
作为规则,应使用一个可提供更多信息的函数名来代替默认名称。第一次保存重命名的函数时也可以改变该文件名。
创建新函数的步骤如下:
a在全局脚本C编辑器的浏览窗口中,打开期望的组的快捷菜单。
b选择“New(新建)”命令,弹出C编辑器的编辑窗口。如果创建了新的函数,则关联编辑窗口中的第一行代码包含返回值类型和新函数的默认名称。在下面的括号中,可以根据需要输入形式参数。在括号内输入函数代码。
全局脚本还将为函数添加下列信息:创建日期、修改日期和版本。这些信息都可以在属性“对话框”中进行查看。在同一对话框中,还可以分配口令以防止函数被未经授权的人员修改或查看。要打开对话框,有三种方法:
a单击工具栏中按钮。
b单击菜单栏中“Edit”→“Info”。
c快捷键<Ctrl>+<I>。
注意:函数名中只能使用确定的字符:字符(除了某些特定语言字符以外)、数字和下划线。
④编辑函数
在编辑窗口中编写函数的函数代码,编辑语言采用ANSI-C。
任何项目或标准函数的代码均可调用其他函数。所调用的函数可以是项目函数、标准函数。
在“Internal functions”的浏览窗口中,C函数库将作为“C_lib”来使用。
代码的第一行包含返回值的类型和新函数的默认名称。通过将其输入随后的括号中,可传递参数。
在括号内输入函数代码。
编辑函数代码的步骤如下:
a双击浏览窗口中的函数,以便在编辑窗口中将其打开。
b将光标放置在希望开始编写代码的地方。
c输入期望的代码。
另外,还可按以下方法打开函数:
在浏览窗口中,打开期望的动作的快捷菜单并单击“Open”或“File\Open…”。也可单击标准工具栏中的按钮或使用相应的组合键。
⑤编译函数
函数完成后,单击工具栏按钮进行编译。输出窗口在运行编译之后将显示编译器的消息,这些消息可能是警告或出错消息。在每种情况下,都将输出警告和出错消息的总数。
⑥保存函数
单击工具栏按钮进行保存。
如果保存尚未正确编译的函数,则浏览窗口中将显示符号。
如果保存尚未编译的没有错误的函数,则浏览窗口中将显示符号。
2)创建和编译函数
系统会区分项目、标准函数和内部函数。WinCC带有可供广泛选择的标准函数和内部函数,用户可以创建自己的项目函数和标准函数或修改标准函数。但需要注意,重新安装WinCC时,WinCC包括的标准函数将被重写,所以任何函数的修改都会丢失。内部函数不能创建或编辑。
上述内容对函数的创建、编辑、查找、编译等操作已作了详细的说明。下面给出创建和编辑项目函数的步骤作为总结。见表10-6。
表10-6 创建和编辑项目函数的步骤
(续)
注:项目创建和编辑项目函数的步骤同样适用于标准函数。
3)动作相关操作
①查找动作
可以创建新动作,且可以通过全局脚本浏览窗口访问现有动作。
动作存储在如下文件系统中:
②创建动作
系统区分全局动作和局部动作。虽然两者的使用范围不同,但创建和编辑两种动作类型的过程完全相同。
创建新动作的步骤如下:
a在浏览窗口中,打开期望的动作类型的快捷菜单,选择全局动作或局部动作。
b右键单击选中动作类型,从弹出的菜单中选择“New(新建)”命令,打开动作编辑窗口。
对于新动作全局脚本建议使用默认名称。新创建的动作已包含指令“include apdefap.h”。因此,所有函数都在该动作中注册。在第三行中可以找到动作的名称。前三行既不能被删除也不能被修改。也就是说,不需要特殊的方法,就可以从每一个动作中调用任意函数。而且,每个动作都具有“int”类型的返回值,且被设置为0。动作的返回值可与GSC运行系统联合使用,以达到诊断目的。
动作代码从注释形式的代码框架开始。如果按照编码规则填充编码框架,变量和画面名称将由交叉引用识别。
③编辑动作
与函数一样,在自己的编辑窗口中编辑动作,只有前三行不能进行编辑。
动作必须有返回值。返回值为“int”,且预置为0。动作的返回值可进行修改,且可用于与GSC运行系统连接,以达到诊断目的。不能改变返回值的类型。
为了在运行系统中执行动作,动作必须有触发器。
编辑动作的步骤为:
a)双击浏览窗口中动作,以便在编辑窗口中将其打开。
b)编辑动作代码。
另外,还可按以下方法打开动作:
在浏览窗口中,打开期望的动作的快捷菜单并单击“Open”或“File\Open…”。也可单击标准工具栏中的按钮或使用相应的组合键。
注意:局部变量(动作代码的括号内定义的变量)的最大可用内存为32KB。
④编译和保存动作
为了使用动作,首先必须进行编译动作。只编译活动编辑窗口中的动作。
编译器所报告的任何错误都将显示在窗口的下面部分。每条消息都将显示在单独的行中。该行包括源代码中产生错误地方处的行号、十六进制码的错误代码以及错误描述。
双击此行即可查看错误处的源代码行。
建议检查所列出的第一个出错消息,因为后续的消息可能是一个消息引发的错误。如果纠正了第一个错误,则在下次编译之后,其他错误可能消失。
编译动作的步骤为:
a单击编辑工具栏中按钮。
b检查编辑窗口下面部分中的编译器消息。
c如果编译器报告了错误,则必须修改动作的源代码。完成此操作后,回到步骤a再次启动。
d如果编译器发出警告,则可能需要修改动作的源代码。修改完代码后,回到步骤a再次启动,否则按步骤e继续操作。
e单击标准工具栏中的按钮或者从“文件”菜单中选择“保存”或使用相应的组合键。
另外,编译过程也可按照下列方式启动:
从编辑菜单中选择编译,或从编辑窗口的快捷菜单中选择编译选项,也可使用相应的键盘快捷键。
⑤显示动作
如果存储了一个语法不正确的动作,则它将在全局脚本浏览窗口中显示,且其左侧会显示图标。
如果存储了一个没有触发器的语法上正确的动作,则它将在全局脚本浏览窗口中显示,且其左侧会显示图标。
如果存储了一个带有触发器的语法上正确的动作,则它将在全局脚本浏览窗口中显示,且其左侧会显示图标。
4)创建和编辑动作
上述内容对动作的创建、编辑、查找、编译等操作已作了详细的说明。下面给出创建和编辑全局动作的总体步骤作为总结。见表10-7。
表10-7 创建和编辑全局动作的步骤
注:项目创建和编辑全局动作的步骤同样适用于局部动作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。