如何使用”GetTagMulti()”函数读取多个WinCC变量?

说明:
在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

  • 二进制变量n
  • 有符号8位数n
  • 有符号8位数n
  • 无符号8位数n
  • 无符号16位数n
  • 有符号32位数n
  • 无符号32位数
32-位变量(4 字节)
格式说明 "%d"用于将WinCC整型变量写入到C变量。不考虑WinCC变量的尺寸,必须要保留4字节存储空间,因为使用"%d"格式时,函数GetTagMulti()是向目标地址写入32位 (4 字节) 值。条目 ID: 26710239描述了如何确定 C变量存储尺寸。可用的数据类型包括: n

  • BOOLn
  • DWORDn
  • intn
  • long

例子:

  • 为了读取WinCC无符号8位数值,可以创建C变量类型为DWORD,对于函数"GetTagMulti()"传送变量地址。n
  • 为了读取WinCC有符号8位数值,可以创建C变量类型为int或 long,对于函数"GetTagMulti()"传送变量地址。

警告!
在使用WinCC"无符号32位数" (DWORD)数据类型,对于最高位(31位),函数GetTagMulti()生成转换错误并返回0值。

"%f"浮点型WinCC变量 n

  • 浮点数32位IEEE 754n
  • 浮点数64位IEEE 754
"双精度型"变量
格式说明 "%f" 用于将WinCC浮点型变量写入到C变量。必须要保留8字节存储空间,因为使用"%f"格式时,函数GetTagMulti()是向目标地址写入64位 (8 字节) 值。必须使用"双精度"数据类型。 n

例子:
为了读取WinCC浮点数32位IEEE754 数值,可以创建C变量类型为"double",对于函数"GetTagMulti()"传送变量地址。

"%s"文本WinCC变量 n

  • 文本变量8位字符集n
  • 文本变量16位字符集n
  • 文本参考

"char*"字符型变量 (字符指针)
格式说明"%s" 用于将WinCC文本或文本参考变量写入到C变量。必须要保留"char" 指针存储,指针地址传送给函数GetTagMulti()。必须使用"双精度"数据类型。 函数GetTagMulti() 保留足够存储空间用于WinCC文本变量的内容,在保留的存储空间保存WinCC文本变量的内容,将传送地址写入预留存储地址。n

例子:
为了读取WinCC文本值,可以创建C变量类型为"char*" (指针),对于函数"GetTagMulti()"传送变量地址(一个指针接一个指针传送)。

配置出错情况下的现象:
以下描述了选择配置错误情况下的现象: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

    • 如果可能,确保不要设置WinCC无符号32位数的第31位。n
    • 如果32-位WinCC变量是外部变量,则在WinCC变量管理器可配置的上限为:2147483648 (十六进制0x80000000)。

      如何使用"GetTagMulti()"函数读取多个WinCC变量?
      图 01

      变量状态和质量代码会显示超出上限配置。

    • 使用函数"GetTagDWordXXX()"。n
    • 在变量管理中创建有符号32-位值WinCC变量,对于C变量使用"DWORD"。
  • 有问题的格式结构 n
    • 关于实际使用数据类型的格式说明是无效的
      如果在格式行中使用格式规范,格式行不能是特殊数据类型,否则会返回无效值。在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - OLE访问失败") 。然而,变量状态和质量代码包含了发生访问错误的信息。

      例子:
      例如,当以格式说明"%d"读取WinCC的文本变量,就会产生这种错误。

    • 格式行包含了许多格式说明
      如果在格式行中,没有给函数"GetTagMulti()" 设置格式规范必需的参数(pszTag, pvValue),则在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"("未知变量, 超时或访问失败 - 没有找到变量") 。变量状态和质量代码包含发生访问错误的信息。

      注释:
      如果给指定格式行设置了多余参数(pszTag, pvValue),则正确确定格式行所需值。不决定没有格式说明的值。变量状态和质量代码包含发生访问错误的信息。不会在全局脚本诊断窗口或"APDIAG"输出窗口出现错误消息"OnErrorExecute"。

配置实例:动态格式结构
如果用函数GetTagMulti()读取许多变量,格式行的结构就会变得不清楚。就不再能用肉眼快速看出是否在格式行有足够的格式规范,格式规范对于使用的数据类型是否有效。为了在格式行中避免结构错误,也可能在运行期间配置格式串。关于哪些变量可以用函数GetTagMulti()读取被保存到一个域中。这里,每一个域元素代表包含所需信息的结构(格式说明, 变量名和目标地址)。

以下可下载的脚本(PDF和文本文件)为样例程序。

如何使用"GetTagMulti()"函数读取多个WinCC变量? WinCC_GetTagMulti_c.zip ( 1 KB )

如何使用"GetTagMulti()"函数读取多个WinCC变量? WinCC_GetTagMulti_c.pdf ( 10 KB )

以下两图显示了WinCC变量管理中的外部变量和内部变量,在样例脚本中通过函数"GetTagMultiStateQCWait()"读取。

如何使用"GetTagMulti()"函数读取多个WinCC变量?
图 02

如何使用"GetTagMulti()"函数读取多个WinCC变量?
图 03

脚本可以在画面里调用C动作(例如,按钮的鼠标单击事件)。
下图为WinCC变量运行时的内容。在画面中通过直接链接变量到I/O域的"输出值"属性来显示WinCC变量。同时,诊断工具"APDIAG"的输出窗口显示了读取的变量值。

如何使用"GetTagMulti()"函数读取多个WinCC变量?
图 04

注释:
此脚本创建于WinCC V6.2。

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc336666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论