使用開源的CANopen for Python可以輕鬆的讀取EDS文件中的內容,在此以從零開始新建符合CiA DS301的對象字典EDS文件中創建的EDS文件作爲示例,加載後的效果如下圖所示:
因爲代碼非常簡單,在此僅貼出代碼而不作說明,代碼如下:
import canopen
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTreeView)
from PyQt5.QtCore import (QModelIndex, Qt, QVariant, pyqtSignal)
from PyQt5.QtGui import (QStandardItem, QStandardItemModel)
DATA_TYPE = {
0x1: 'BOOLEAN',
0x2: 'INTEGER8',
0x3: 'INTEGER16',
0x4: 'INTEGER32',
0x5: 'UNSIGNED8',
0x6: 'UNSIGNED16',
0x7: 'UNSIGNED32',
0x8: 'REAL32',
0x9: 'VISIBLE_STRING',
0xA: 'OCTET_STRING',
0xB: 'UNICODE_STRING',
0xF: 'DOMAIN',
0x11: 'REAL64',
0x15: 'INTEGER64',
0x1B: 'UNSIGNED64',
}
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow,self).__init__(parent)
treeView = QTreeView()
self.setCentralWidget(treeView)
standardModel = QStandardItemModel()
standardModel.setHorizontalHeaderLabels(('索引', '名稱', '數值', '最小值', '最大值', '數據類型', '訪問性'))
network = canopen.Network()
node = network.add_node(1, 'DS301.eds')
item = standardModel.invisibleRootItem()
for obj in node.object_dictionary.values():
tmp = [QStandardItem(hex(obj.index)),
QStandardItem(obj.name),
QStandardItem(str(obj.default) if hasattr(obj, 'default') else None),
QStandardItem(str(obj.min) if hasattr(obj, 'min') else None),
QStandardItem(str(obj.max) if hasattr(obj, 'max') else None),
QStandardItem(DATA_TYPE.get(obj.data_type if hasattr(obj, 'data_type') else None)),
QStandardItem(obj.access_type if hasattr(obj, 'access_type') else None),
]
item.appendRow(tmp)
if isinstance(obj, canopen.objectdictionary.Record):
for subobj in obj.values():
tmp[0].appendRow([QStandardItem(hex(subobj.subindex)),
QStandardItem(subobj.name),
QStandardItem(str(subobj.default)),
QStandardItem(str(subobj.min)),
QStandardItem(str(subobj.max)),
QStandardItem(DATA_TYPE.get(subobj.data_type)),
QStandardItem(subobj.access_type),
])
elif isinstance(obj, canopen.objectdictionary.Array):
tmp[0].appendRow(None)
treeView.setModel(standardModel)
treeView.expandAll()
if __name__ == '__main__':
a = QApplication(sys.argv)
w = MainWindow()
w.show()
a.exec_()