说明:
在WinCC全局C脚本中,有默认几个"GetTagMultiWait()"函数,用于读取多个WinCC变量:n
- BOOL GetTagMultiWait(const char* pszFormat, const char* pszTag, void* pvValue, ...)
- BOOL GetTagMultiStateWait(DWORD* pdwState, const char* pszFormat, const* pszTag, void* pvValue, ...)
- BOOL GetTagMultiStateQCWait(DWORD* pdwState, DWORD* pdwQC, const char* pszFormat, const* pszTag, void* pvValue, ...)
这些函数统称为"Wait"函数,也就是直接从PLC读取变量值,而不通过WinCC数据管理器的画面。这些函数参数的数量是变化的;取决于读取变量的个数。n
参数:
函数包含以下参数:n
- DWORD* pdwState (仅用于GetTagMultiStateWait() and GetTagMultiStateQCWait())
使用"GetTagMulti()"函数必须有数组对应DWORD变量(缓存)。数据区域第一个元素的指针被传递到"GetTagMulti()"函数。函数"GetTagMulti()"连续将WinCC变量读取的变量状态写到传送地址中。n - DWORD* pdwQC (仅用于GetTagMultiStateQCWait())
使用"GetTagMulti()"函数必须有数组对应DWORD变量(缓存)。数据区域第一个元素的指针被传递到"GetTagMulti()"函数。函数"GetTagMulti()"连续将WinCC变量读取的质量代码写到传送地址中。n - const char* pszFormat
使用"GetTagMulti()"函数必需一个字符串变量(缓存)并用读取WinCC变量的格式信息对其初始化。字符串第一个元素的指针被传递到"GetTagMulti()"函数。n - const char* pszTag
"pszTag"是一个包含读取WinCC变量名的字符串里第一个元素的指针。
使用"GetTagMulti()"函数必需为每一个读取的变量设定"pszTag"字符串。n - void* pvValue
"pvValue"是一个地址,是"GetTagMulti()"函数保存读取WinCC变量目录的地址。
使用"GetTagMulti()"函数必需为每一个读取的变量设定地址。
返回值:
当至少其中一个参数设定为"ZERO",函数"GetTagMulti()"返回值为"FALSE",否则返回值为"TRUE"。由于这个原因,不能使用返回值来检查读取WinCC变量是否成功。因此,需要使用"GetTagMultiStateWait()"或"GetTagMultiStateQCWait()"函数和变量状态、质量代码用于错误分析。n
在WinCC帮助提供了WinCC变量质量的信息(变量状态和质量代码):n
- "通讯 >通讯 -诊断 > 变量质量> 变量状态"n
- "通讯 >通讯 -诊断> 变量质量> 变量质量代码"
在WinCC帮助提供了关于"GetTag()"函数例子的常规信息:n
- "使用WinCC > 用于创建函数和动作的ANSI-C> ANSI-C function descriptions > Internal functions > tag > get > Functionality of the GetTag functions"
下表描述了格式行中可用的格式说明,可以与WinCC和C数据类型一起使用:
格式 | WinCC 数据类型 | C 数据类型 |
"%d" | 整型WinCC 变量 n
|
32-位变量(4 字节) 格式说明 "%d"用于将WinCC整型变量写入到C变量。不考虑WinCC变量的尺寸,必须要保留4字节存储空间,因为使用"%d"格式时,函数GetTagMulti()是向目标地址写入32位 (4 字节) 值。条目 ID: 26710239描述了如何确定 C变量存储尺寸。可用的数据类型包括: n
例子:
警告! |
"%f" | 浮点型WinCC变量 n
|
"双精度型"变量 格式说明 "%f" 用于将WinCC浮点型变量写入到C变量。必须要保留8字节存储空间,因为使用"%f"格式时,函数GetTagMulti()是向目标地址写入64位 (8 字节) 值。必须使用"双精度"数据类型。 n 例子: |
"%s" | 文本WinCC变量 n
|
"char*"字符型变量 (字符指针) 例子: |
配置出错情况下的现象:
以下描述了选择配置错误情况下的现象:n
- 访问在WinCC变量管理中没有创建的变量
如果使用"GetTagMultiStateWait()"或"GetTagMultiStateQCWait()"函数访问在WinCC变量管理中没有创建的变量,则会在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - 没有找到变量") 。变量状态和质量代码包含了发生访问错误的信息。警告!
在这种情况下,函数"GetTagMultiWait()"不会在全局脚本诊断窗口或"APDIAG"输出窗口产生"OnErrorExecute"错误消息。 - 使用C数据类型"float"读取WinCC浮点数
如果WinCC浮点数32位IEEE754类型变量写入C语言"float"型变量,函数"GetTagMulti()"返回浮点数"0.0"。函数"GetTagMultiWait()"不会在全局脚本诊断窗口或"APDIAG"输出窗口产生错误消息。变量状态和质量代码不包含产生错误的访问信息。 - 使用C小于4个存储字节的数据类型读取WinCC整数
如果使用占用小于4字节 (如 BYTE, WORD, char 或short)的C 变量来读取WinCC整数,会导致未定义的系统动作,因为在这种情况下,不支持函数GetTagMulti()写入存储区。 - 访问无符号32-位WinCC值,其最高位(Bit 31)被设定
如果WinCC无符号32位数("DWORD") 类型变量写入C语言"DWORD"型变量,函数"GetTagMulti()"返回整数值"0" (十六进制0x00000000)。在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - OLE访问失败") 。然而,变量状态和质量代码不包含了发生访问错误的信息。纠正: n
- 关于实际使用数据类型的格式说明是无效的
如果在格式行中使用格式规范,格式行不能是特殊数据类型,否则会返回无效值。在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - OLE访问失败") 。然而,变量状态和质量代码不包含了发生访问错误的信息。例子:
例如,当以格式说明"%d"读取WinCC的文本变量,就会产生这种错误。 - 格式行包含了许多格式说明
如果在格式行中,没有给函数"GetTagMulti()" 设置格式规范必需的参数(pszTag, pvValue),则在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - 没有找到变量") 。变量状态和质量代码包含发生访问错误的信息。注释:
如果给指定格式行设置了多余参数(pszTag, pvValue),则正确确定格式行所需值。不决定没有格式说明的值。变量状态和质量代码包含发生访问错误的信息。不会在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"。
配置实例:动态格式结构
如果用函数GetTagMulti()读取许多变量,格式行的结构就会变得不清楚。就不再能用肉眼快速看出是否在格式行有足够的格式规范,格式规范对于使用的数据类型是否有效。为了在格式行中避免结构错误,也可能在运行期间配置格式串。关于哪些变量可以用函数GetTagMulti()读取被保存到一个域中。这里,每一个域元素代表包含所需信息的结构(格式说明, 变量名和目标地址)。
以下可下载的脚本(PDF和文本文件)为样例程序。
WinCC_GetTagMulti_c.zip ( 1 KB )
WinCC_GetTagMulti_c.pdf ( 10 KB )
以下两图显示了WinCC变量管理中的外部变量和内部变量,在样例脚本中通过函数"GetTagMultiStateQCWait()"读取。
脚本可以在画面里调用C动作(例如,按钮的鼠标单击事件)。
下图为WinCC变量运行时的内容。在画面中通过直接链接变量到I/O域的"输出值"属性来显示WinCC变量。同时,诊断工具"APDIAG"的输出窗口显示了读取的变量值。
注释:
此脚本创建于WinCC V6.2。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc336666.html