beremiz

Dirty fix for error '_object_has_no_attribute_'getSlave' in EtherCAT extension

traceback:
File "/home/developer/WorkData/PLC/beremiz/beremiz/IDEFrame.py", line 1433, in OnPouSelectedChanged
window.RefreshView()
File "/home/developer/WorkData/PLC/beremiz/beremiz/etherlab/ConfigEditor.py", line 837, in RefreshView
self.RefreshProcessVariables()
File "/home/developer/WorkData/PLC/beremiz/beremiz/etherlab/ConfigEditor.py", line 886, in RefreshProcessVariables
slaves = self.Controler.GetSlaves(**self.CurrentNodesFilter)
File "/home/developer/WorkData/PLC/beremiz/beremiz/etherlab/EthercatMaster.py", line 341, in GetSlaves
for slave in self.Config.getConfig().getSlave():
:_'lxml.etree._Element'_object_has_no_attribute_'getSlave'

Steps to reproduce problem:

- Add new EtherCAT master
- Add new EthercatNode to the master
- double click on


this is looks like dirty hack to fix strange problem with initial[0]
changing its type after returning from _init_ method to lxml.etree._Element
As a result all methods generated by class factory are lost.

For example, in function initMethod initial[0].__class__ points to
xmlclass.xmlclass.Config. After map(self.append, initial)
self.Config.__class__ is 'xmlclass.xmlclass.Config' as well.
But after returning from initMethod (_init) in CreateElement
self.Config.__class__ has changed to lxml.etree._Element.


I've noticed similar behavior if copy/deepcopy is used for any child
of etree.ElementBase. See simple example below.
[-------------------------------------------------------------]
#!/usr/bin/python

from __future__ import print_function
from lxml import etree
import copy

class DefaultElementClass(etree.ElementBase):
def getLocalTag(self):
return etree.QName(self.tag).localname


def printInformation(x):
print(x, x.__class__, "getLocalTag" in dir(x))


a = DefaultElementClass()
printInformation(a)

#
printInformation(copy.copy(a))
printInformation(copy.deepcopy(a))
[-------------------------------------------------------------]
/*
Stylesheet used to list EtherCat dictionnary entries.
Copyright (C) 2011-2014: Laurent BESSARD
Distributed under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See COPYING file for copyrights details.
*/
include yslt.yml2
estylesheet xmlns:ns="entries_list_ns"
extension-element-prefixes="ns"
exclude-result-prefixes="ns" {
param "min_index";
param "max_index";
template "text()";
template "Device" {
apply "Profile/Dictionary/Objects/Object";
foreach "RxPdo" {
call "pdo_entries" with "direction", "'Receive'";
}
foreach "TxPdo" {
call "pdo_entries" with "direction", "'Transmit'";
}
}
template "Object" {
variable "index" > «ns:HexDecValue(Index/text())»
variable "entry_name" > «ns:EntryName(Name)»
choose {
when "$index >= $min_index and $index <= $max_index" {
variable "datatype_name" > «Type/text()»
choose {
when "ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]" {
apply "ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]" {
with "index" > «$index»
with "entry_name" > «$entry_name»
}
}
otherwise {
variable "subindex" > 0
variable "entry" {
> «ns:AddEntry($index, $subindex, $entry_name, $datatype_name, BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())»
}
}
}
}
}
}
template "DataType" {
param "index";
param "entry_name";
foreach "SubItem" {
variable "subindex" > «ns:HexDecValue(SubIdx/text())»
variable "subentry_name" > «$entry_name» - «ns:EntryName(DisplayName, Name/text())»
variable "entry" {
> «ns:AddEntry($index, $subindex, $subentry_name, Type/text(), BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())»
}
}
}
function "pdo_entries" {
param "direction";
variable "pdo_index" > «ns:HexDecValue(Index/text())»
variable "pdo_name" > «ns:EntryName(Name)»
foreach "Entry" {
variable "index" > «ns:HexDecValue(Index/text())»
choose {
when "$index >= $min_index and $index <= $max_index" {
variable "subindex" > «ns:HexDecValue(SubIndex/text())»
variable "subentry_name" > «ns:EntryName(Name)»
variable "access" {
choose {
when "$direction='Transmit'" > ro
otherwise > wo
}
}
variable "pdo_mapping" {
choose {
when "$direction='Transmit'" > T
otherwise > R
}
}
variable "entry" {
> «ns:AddEntry($index, $subindex, $subentry_name, DataType/text(), BitLen/text(), $access, $pdo_mapping, $pdo_index, $pdo_name, $direction)»
}
}
}
}
}
}