diff -r 1b4b335e19ea -r b98d9e08231f etherlab/EthercatMaster.py --- a/etherlab/EthercatMaster.py Wed Nov 13 11:21:04 2019 +0100 +++ b/etherlab/EthercatMaster.py Mon Nov 25 08:10:45 2019 +0100 @@ -243,20 +243,20 @@ config_filepath = self.ConfigFileName() config_is_saved = False self.Config = None - if os.path.isfile(config_filepath): - config_xmlfile = open(config_filepath, 'r') - try: - self.Config, error = \ - EtherCATConfigParser.LoadXMLString(config_xmlfile.read()) - if error is None: - config_is_saved = True - except Exception as e: - error = str(e) - config_xmlfile.close() - - if error is not None: - self.GetCTRoot().logger.write_error( - _("Couldn't load %s network configuration file.") % self.CTNName()) + # if os.path.isfile(config_filepath): + # config_xmlfile = open(config_filepath, 'r') + # try: + # self.Config, error = \ + # EtherCATConfigParser.LoadXMLString(config_xmlfile.read()) + # if error is None: + # config_is_saved = True + # except Exception as e: + # error = str(e) + # config_xmlfile.close() + + # if error is not None: + # self.GetCTRoot().logger.write_error( + # _("Couldn't load %s network configuration file.") % self.CTNName()) if self.Config is None: self.Config = EtherCATConfigParser.CreateElement("EtherCATConfig") @@ -282,12 +282,28 @@ if self.ProcessVariables is None: self.ProcessVariables = ProcessVariablesParser.CreateElement("ProcessVariables") - if config_is_saved and process_is_saved: + #if config_is_saved and process_is_saved: + if process_is_saved: self.CreateBuffer(True) else: self.CreateBuffer(False) self.OnCTNSave() + if os.path.isfile(config_filepath): + config_xmlfile = open(config_filepath, 'r') + try: + self.Config, error = \ + EtherCATConfigParser.LoadXMLString(config_xmlfile.read()) + if error is None: + config_is_saved = True + except Exception, e: + error = e.message + config_xmlfile.close() + + if error is not None: + self.GetCTRoot().logger.write_error( + _("Couldn't load %s network configuration file.") % CTNName) + # ----------- call ethercat mng. function -------------- self.CommonMethod = _CommonSlave(self) @@ -306,7 +322,7 @@ type_infos = dialog.GetValueInfos() device, _module_extra_params = self.GetModuleInfos(type_infos) if device is not None: - if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers(): + if HAS_MCL and str(_EthercatCIA402SlaveCTN.NODE_PROFILE) in device.GetProfileNumbers(): ConfNodeType = "EthercatCIA402Slave" else: ConfNodeType = "EthercatSlave" @@ -577,14 +593,62 @@ return infos return None - def GetSlaveVariables(self, slave_pos=None, limits=None, device=None): + def GetSlaveVariables(self, slave_pos=None, limits=None, device=None, module=None): + # add jblee + files = os.listdir(self.CTNPath()) + moduleNames = [] + modulePos = 1 + for file in files: + filepath = os.path.join(self.CTNPath(), file) + if os.path.isdir(filepath): + MDPFilePath = os.path.join(filepath, "DataForMDP.txt") + CheckConfNodePath = os.path.join(filepath, "baseconfnode.xml") + + try : + moduleDataFile = open(MDPFilePath, 'r') + confNodeFile = open(CheckConfNodePath, 'r') + + lines = moduleDataFile.readlines() + checklines = confNodeFile.readlines() + + moduleDataFile.close() + confNodeFile.close() + + module_info = self.GetModuleEntryList() + # checklines(ex) : + # checklines[1].split() : [] + # checklines[1].split()[2] : IEC_Channel="0" + # checklines[1].split()[2].split("\"") = [IEC_Channel=, 0, ] + pos_check = int(checklines[1].split()[2].split("\"")[1]) + + if slave_pos != pos_check: + continue + + for line in lines: + if line == "\n": + continue + # module_name : ST-1214, ST-2314, ... + # if user add module => ST-1214 3EA, ST-2314 3EA + # each result_module_name : + # (ST-1214, Module 1), (ST-1214, Module 2), (ST-1214, Module 3) + # (ST-2314, Module 4), (ST-2314, Module 5), (ST-2314, Module 6) + module_name = line.split()[0] + result_module_name = module_name + ", Module %d" % modulePos + moduleNames.append(result_module_name) + modulePos += 1 + except : + pass + if device is None and slave_pos is not None: slave = self.GetSlave(slave_pos) if slave is not None: type_infos = slave.getType() device, _module_extra_params = self.GetModuleInfos(type_infos) if device is not None: + # Test OD entries = device.GetEntriesList(limits) + #entries = self.CTNParent.GetEntriesList() entries_list = entries.items() entries_list.sort() entries = [] @@ -602,6 +666,49 @@ current_entry["children"].append(entry) else: entries.append(entry) + + increment = self.CTNParent.GetModuleIncrement()[0] + count = 1 + #print module_info + # moduleNameAndPos : (ST-1214, Module 1), (ST-1214, Module 2), ... , + # moduleNameAndPos.split(",") : ["ST-1214", " Module 1"] + # moduleNameAndPos.split(",")[0] : "ST-1214" + for moduleNameAndPos in moduleNames: + moduleName = moduleNameAndPos.split(",")[0] + modulePosName = moduleNameAndPos.split(",")[1] + idx_increment = int(increment) * count + + for MDP_entry in module_info.get(moduleName): + LocalMDPEntry = [] + #print MDP_entry + local_idx = MDP_entry["Index"] + if ExtractHexDecValue(local_idx) == 0: #and local_idx[0] == "#": + temp_index = ExtractHexDecValue(local_idx) + else : + temp_index = ExtractHexDecValue(MDP_entry["Index"]) + idx_increment + #temp_index = ExtractHexDecValue(MDP_entry["Index"]) + idx_increment + entry_index = hex(temp_index) + entry_subidx = MDP_entry["SubIndex"] + entry_name = MDP_entry["Name"] + ", " + " " + \ + moduleName + " - " + modulePosName + entry_type = MDP_entry["Type"] + entry_bitsize = MDP_entry["BitSize"] + entry_access = MDP_entry["Access"] + mapping_type = MDP_entry["PDOMapping"] + + LocalMDPEntry.append({ + "Index": entry_index, + "SubIndex": entry_subidx, + "Name": entry_name, + "Type": entry_type, + "BitSize": entry_bitsize, + "Access": entry_access, + "PDOMapping": mapping_type, + "children": ""}) + entries.append(LocalMDPEntry[0]) + count += 1 + + #print entries return entries return [] @@ -634,6 +741,10 @@ def GetModuleInfos(self, type_infos): return self.CTNParent.GetModuleInfos(type_infos) + # add jblee + def GetModuleEntryList(self): + return self.CTNParent.GetModuleEntryList() + def GetSlaveTypesLibrary(self, profile_filter=None): return self.CTNParent.GetModulesLibrary(profile_filter) @@ -643,6 +754,53 @@ def GetDeviceLocationTree(self, slave_pos, current_location, device_name): slave = self.GetSlave(slave_pos) vars = [] + + # add jblee + files = os.listdir(self.CTNPath()) + moduleNames = [] + modulePos = 1 + for file in files: + filepath = os.path.join(self.CTNPath(), file) + if os.path.isdir(filepath): + MDPFilePath = os.path.join(filepath, "DataForMDP.txt") + CheckConfNodePath = os.path.join(filepath, "baseconfnode.xml") + + try : + moduleDataFile = open(MDPFilePath, 'r') + confNodeFile = open(CheckConfNodePath, 'r') + + lines = moduleDataFile.readlines() + checklines = confNodeFile.readlines() + + moduleDataFile.close() + confNodeFile.close() + + module_info = self.GetModuleEntryList() + # checklines(ex) : + # checklines[1].split() : [] + # checklines[1].split()[2] : IEC_Channel="0" + # checklines[1].split()[2].split("\"") = [IEC_Channel=, 0, ] + pos_check = int(checklines[1].split()[2].split("\"")[1]) + + if slave_pos != pos_check: + continue + + for line in lines: + if line == "\n": + continue + # module_name : ST-1214, ST-2314, ... + # if user add module => ST-1214 3EA, ST-2314 3EA + # each result_module_name : + # (ST-1214, Module 1), (ST-1214, Module 2), (ST-1214, Module 3) + # (ST-2314, Module 4), (ST-2314, Module 5), (ST-2314, Module 6) + module_name = line.split()[0] + result_module_name = module_name + ", Module %d" % modulePos + moduleNames.append(result_module_name) + modulePos += 1 + except : + pass + if slave is not None: type_infos = slave.getType() @@ -681,6 +839,39 @@ "children": [], }) + # add jblee for MDP + if not entries : + increment = self.CTNParent.GetModuleIncrement()[0] + count = 1 + for moduleNameAndPos in moduleNames: + moduleName = moduleNameAndPos.split(",")[0] + idx_increment = int(increment) * count + for MDP_entry in module_info.get(moduleName): + local_idx = MDP_entry["Index"] + if ExtractHexDecValue(local_idx) != 0 and local_idx[0] == "#": + index = ExtractHexDecValue(local_idx) + idx_increment + else : + index = ExtractHexDecValue(MDP_entry["Index"]) + subindex = int(MDP_entry["SubIndex"]) + var_class = VARCLASSCONVERSION.get(MDP_entry["PDOMapping"], None) + if var_class is not None: + if var_class == LOCATION_VAR_INPUT: + var_dir = "%I" + else: + var_dir = "%Q" + var_size = self.GetSizeOfType(MDP_entry["Type"]) + result_name = MDP_entry["Name"] + ", " + moduleNameAndPos + vars.append({"name": "0x%4.4x-0x%2.2x: %s" % (index, subindex, result_name), + "type": var_class, + "size": var_size, + "IEC_type": MDP_entry["Type"], + "var_name": "%s_%4.4x_%2.2x" % ("_".join(moduleName.split()), index, subindex), + "location": "%s%s%s"%(var_dir, var_size, ".".join(map(str, current_location + + (index, subindex)))), + "description": "", + "children": []}) + count += 1 + return vars def CTNTestModified(self): @@ -688,7 +879,6 @@ def OnCTNSave(self, from_project_path=None): config_filepath = self.ConfigFileName() - config_xmlfile = open(config_filepath, "w") config_xmlfile.write(etree.tostring( self.Config,