我正在尝试比较扩展对象字段的实时值。但我不知道要比较哪个字段,除非运行程序,即要比较的字段名称来自 Excel 文件。
我的类结构如下图所示,我可以从我的服务器正确读取数据,该服务器是一个可以测量压力的PLC。
从 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
字段如下图
上面的测试用例显示为
Check READ_PCM_PR_I9_INFO.physicalData.readingMBar
位于 range 0 to 25
中。
因此,我必须在运行时迭代复合结构
sPressureSensorInfo
并到达嵌套结构的 readingMBar
字段并获取实时读数,然后将其与 excel 文件中给出的值进行比较。
有没有办法动态实现这一点,即基于作为字符串提供的标签
accessing the composite structure's inner field
?
参考以下链接
我设法首先分割
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
维护类型列表,键为标识符字符串。