前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用"GetTagMulti()"函数读取多个WinCC变量?

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

作者头像
科控物联
发布2022-03-29 19:26:41
3.3K0
发布2022-03-29 19:26:41
举报
文章被收录于专栏:科控自动化

说明: 在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()读取被保存到一个域中。这里,每一个域元素代表包含所需信息的结构(格式说明, 变量名和目标地址)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档