使用 python opcua 在运行时查询扩展对象字段(当字段名称以字符串形式提供时)

问题描述 投票:0回答:1

我正在尝试比较扩展对象字段的实时值。但我不知道要比较哪个字段,除非运行程序,即要比较的字段名称来自 Excel 文件。

我的类结构如下图所示,我可以从我的服务器正确读取数据,该服务器是一个可以测量压力的PLC。

enter image description here

从 PLC 读取的变量是

READ_PCM_PR_I9_INFO
,它是
sPressureSensorInfo
类型结构,又由另一个结构
physicalData
组成,它具有实际读取字段
readingMBar

由于我可以读取节点并使用

ExtensionObject
解析
 typeDefinitions = client.load_type_definitions()
,因此我在填充实时传感器读数时没有任何问题。

我试图解决的问题是比较来自

excel
文件的字段,该文件将字段名称读取为
string
并标记为
READ_PCM_PR_I9_INFO.physicalData.readingMBar 
,这意味着从变量
readingMBar 读取 
READ_PCM_PR_I9_INFO
 字段
如下图

enter image description here

上面的测试用例显示为

Check READ_PCM_PR_I9_INFO.physicalData.readingMBar
位于
range 0 to 25
中。

因此,我必须在运行时迭代复合结构

sPressureSensorInfo
并到达嵌套结构的
readingMBar
字段并获取实时读数,然后将其与 excel 文件中给出的值进行比较。

有没有办法动态实现这一点,即基于作为字符串提供的标签

accessing the composite structure's inner field

python-3.x opc-ua
1个回答
0
投票

参考以下链接

如何在Python中动态组合和访问类属性? [重复]

从字符串到类型的词法转换

获取类的属性

我设法首先分割

READ_PCM_PR_I9_INFO.physicalData.readingMBar
的不同字段,如下所示:

parameterFields = cmd.api.split('.')

在 csv 文件读取期间,

cmd.api
获取
READ_PCM_PR_I9_INFO.physicalData.readingMBar string

然后单独获取

inner attributes
如下所示,给我嵌套字段的值

 innerField = getattr(plcKeyValueList[parameterFields[0]], parameterFields[1])

 for i in range(2, len(parameterFields)):
   innerField = getattr(innerField, parameterFields[i])
 

其中

plcKeyValueList[parameterFields[0]]
返回基于
parameterFields[0] node identifier
的对象。在本例中,它是
READ_PCM_PR_I9_INFO
,它是
sPressureSensorInfo
类型的对象。

plcKeyValueList
是我创建的一个字典,用于获取所有变量节点的实时值(来自plc的所有值),键是节点标识符字符串。

我们还可以探测字段的类型:

structureType = type(plcKeyValueList[parameterFields[0]])
                

附加信息,如果我们想编写复合结构,我们可以将 dataValue 创建为:

container = type(plcKeyValueList[parameterFields[0]])()
container.physicalData.readingMBar = 75
datavalue = ua.DataValue(ua.Variant(container, HALTypeDict[parameterFields[0]]))

其中

HALTypeDict
维护类型列表,键为标识符字符串。

© www.soinside.com 2019 - 2024. All rights reserved.