说明:
在WinCC全局C脚本中,有默认几个"GetTagMultiWait()"函数,用于读取多个WinCC变量:
- 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数据管理器的画面。这些函数参数的数量是变化的;取决于读取变量的个数。
参数:
函数包含以下参数:
- DWORD* pdwState (仅用于GetTagMultiStateWait() and GetTagMultiStateQCWait())
使用"GetTagMulti()"函数必须有数组对应DWORD变量(缓存)。数据区域第一个元素的指针被传递到"GetTagMulti()"函数。函数"GetTagMulti()"连续将WinCC变量读取的变量状态写到传送地址中。
- DWORD* pdwQC (仅用于GetTagMultiStateQCWait())
使用"GetTagMulti()"函数必须有数组对应DWORD变量(缓存)。数据区域第一个元素的指针被传递到"GetTagMulti()"函数。函数"GetTagMulti()"连续将WinCC变量读取的质量代码写到传送地址中。
- const char* pszFormat
使用"GetTagMulti()"函数必需一个字符串变量(缓存)并用读取WinCC变量的格式信息对其初始化。字符串第一个元素的指针被传递到"GetTagMulti()"函数。
- const char* pszTag
"pszTag"是一个包含读取WinCC变量名的字符串里第一个元素的指针。
使用"GetTagMulti()"函数必需为每一个读取的变量设定"pszTag"字符串。
- void* pvValue
"pvValue"是一个地址,是"GetTagMulti()"函数保存读取WinCC变量目录的地址。
使用"GetTagMulti()"函数必需为每一个读取的变量设定地址。
返回值:
当至少其中一个参数设定为"ZERO",函数"GetTagMulti()"返回值为"FALSE",否则返回值为"TRUE"。由于这个原因,不能使用返回值来检查读取WinCC变量是否成功。因此,需要使用"GetTagMultiStateWait()"或"GetTagMultiStateQCWait()"函数和变量状态、质量代码用于错误分析。
在WinCC帮助提供了WinCC变量质量的信息(变量状态和质量代码):
- "通讯 > 通讯 - 诊断 > 变量质量> 变量状态"
- "通讯 > 通讯 - 诊断> 变量质量> 变量质量代码"
在WinCC帮助提供了关于"GetTag()"函数例子的常规信息:
- "使用WinCC > 用于创建函数和动作的ANSI-C> ANSI-C function descriptions > Internal functions > tag > get > Functionality of the GetTag functions"
下表描述了格式行中可用的格式说明,可以与WinCC和C数据类型一起使用:
配置出错情况下的现象:
以下描述了选择配置错误情况下的现象:
- 访问在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访问失败") 。然而,变量状态和质量代码不包含了发生访问错误的信息。
纠正:
- 如果可能,确保不要设置WinCC无符号32位数的第31位。
- 如果32-位WinCC变量是外部变量,则在WinCC变量管理器可配置的上限为:2147483648 (十六进制0x80000000)。
变量状态和质量代码会显示超出上限配置。
使用函数"GetTagDWordXXX()"。
- 在变量管理中创建有符号32-位值WinCC变量,对于C变量使用"DWORD"。
- 有问题的格式结构
- 关于实际使用数据类型的格式说明是无效的
如果在格式行中使用格式规范,格式行不能是特殊数据类型,否则会返回无效值。在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - OLE访问失败") 。然而,变量状态和质量代码不包含了发生访问错误的信息。
例子:
例如,当以格式说明"%d"读取WinCC的文本变量,就会产生这种错误。
- 格式行包含了许多格式说明
如果在格式行中,没有给函数"GetTagMulti()" 设置格式规范必需的参数(pszTag, pvValue),则在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - 没有找到变量") 。变量状态和质量代码包含发生访问错误的信息。
注释:
如果给指定格式行设置了多余参数(pszTag, pvValue),则正确确定格式行所需值。不决定没有格式说明的值。变量状态和质量代码包含发生访问错误的信息。不会在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"。
配置实例:动态格式结构
如果用函数GetTagMulti()读取许多变量,格式行的结构就会变得不清楚。就不再能用肉眼快速看出是否在格式行有足够的格式规范,格式规范对于使用的数据类型是否有效。为了在格式行中避免结构错误,也可能在运行期间配置格式串。关于哪些变量可以用函数GetTagMulti()读取被保存到一个域中。这里,每一个域元素代表包含所需信息的结构(格式说明, 变量名和目标地址)。