diff --git a/pyLSV2/client.py b/pyLSV2/client.py index 46b019a..afe91fe 100644 --- a/pyLSV2/client.py +++ b/pyLSV2/client.py @@ -208,7 +208,7 @@ def _send_recive( self._logger.debug("no response expected") return False - self._logger.warning("received unexpected response %s", self._llcom.last_response) + self._logger.info("received unexpected response %s", self._llcom.last_response) return False def _send_recive_block( @@ -264,7 +264,7 @@ def _send_recive_block( lsv_content = self._llcom.telegram(command=lc.RSP.T_OK) return response_buffer - self._logger.warning( + self._logger.info( "received unexpected response %s, with data %s", self._llcom.last_response, lsv_content, @@ -419,7 +419,7 @@ def _read_parameters(self, force: bool = False) -> ld.SystemParameters: raise LSV2DataException("expected boolean") self._sys_par.turbo_mode_active = data else: - self._logger.warning("an error occurred while querying system information on turbo mode") + self._logger.debug("could not read system information on turbo mode") payload = struct.pack("!L", lc.ParRCI.DNC_ALLOWED) result = self._send_recive(lc.CMD.R_CI, payload, lc.RSP.S_CI) @@ -429,14 +429,14 @@ def _read_parameters(self, force: bool = False) -> ld.SystemParameters: raise LSV2DataException("expected boolean") self._sys_par.dnc_mode_allowed = data else: - self._logger.warning("an error occurred while querying system information on dnc mode") + self._logger.debug("could not read system information on dnc mode") payload = struct.pack("!L", lc.ParRCI.AXES_SAMPLING_RATE) result = self._send_recive(lc.CMD.R_CI, payload, lc.RSP.S_CI) if isinstance(result, (bytearray,)) and len(result) > 0: self._sys_par.axes_sampling_rate = lm.decode_system_information(result) else: - self._logger.warning("an error occurred while querying system information on axes samling rate") + self._logger.debug("could not read system information on axes samling rate") return self._sys_par def _read_version(self, force: bool = False) -> ld.VersionInfo: @@ -616,13 +616,19 @@ def change_directory(self, remote_directory: str) -> bool: return False dir_path = remote_directory.replace("/", lc.PATH_SEP) + payload = lm.ustr_to_ba(dir_path) result = self._send_recive(lc.CMD.C_DC, payload, lc.RSP.T_OK) if isinstance(result, (bool,)) and result is True: self._logger.debug("changed working directory to %s", dir_path) return True - self._logger.warning("an error occurred while changing directory") + + if remote_directory == self.directory_info().path: + self._logger.info("control responded as if the dir change did not work but path is still correct...") + return True + + self._logger.warning("an error occurred while changing directory to %s", dir_path) return False def file_info(self, remote_file_path: str) -> Union[ld.FileEntry, None]: @@ -690,6 +696,8 @@ def drive_info(self) -> List[ld.DriveEntry]: """ Read info all drives and partitions from the control. Requires access level ``FILETRANSFER`` to work. + + Might not work on older controls or on old windows programming stations? """ if not self.login(lc.Login.FILETRANSFER): @@ -703,7 +711,7 @@ def drive_info(self) -> List[ld.DriveEntry]: for entry in result: drives_list.extend(lm.decode_drive_info(entry)) - self._logger.debug( + self._logger.debug( "successfully received %d packages for drive information %s", len(result), drives_list, @@ -713,6 +721,10 @@ def drive_info(self) -> List[ld.DriveEntry]: "an error occurred while reading drive info: '%s'", lt.get_error_text(self.last_error), ) + + if "TNC:" not in [d.name for d in drives_list]: + self._logger.warning("an error occured while parsing drive info. this might be either a problem with the decoding or the control does not support this function!") + return [] return drives_list def make_directory(self, dir_path: str) -> bool: @@ -1037,7 +1049,7 @@ def send_file( else: #if len(result) == 2: - self._logger.warning( + self._logger.info( "could not send data, received unexpected response '%s' with data 0x%s", self._llcom.last_response, result.hex() @@ -1572,8 +1584,9 @@ def _walk_dir(self, descend: bool = True) -> List[str]: self._logger.warning("clould not log in as user FILE") return [] - current_path = self.directory_info().path + current_path = self.directory_info().path.replace("/", lc.PATH_SEP) content: List[str] = [] + for entry in self.directory_content(): if entry.name == "." or entry.name == ".." or entry.name.endswith(":"): continue @@ -1600,9 +1613,9 @@ def get_file_list(self, path: str = "", descend: bool = True, pattern: str = "") return [] if self.change_directory(path) is False: - self._logger.warning("could not change to directory") + self._logger.warning("could not change to directory %s" % path) return [] - + if len(pattern) == 0: file_list = self._walk_dir(descend) else: diff --git a/pyLSV2/scripts/demo.py b/pyLSV2/scripts/demo.py index d20a64e..da955f9 100644 --- a/pyLSV2/scripts/demo.py +++ b/pyLSV2/scripts/demo.py @@ -47,6 +47,7 @@ def comprehensive_demo(): print("Basics:") print("# Connected to a '{:s}' running software version '{:s}'".format(con.versions.control, con.versions.nc_sw)) + print("# Version as numeric values base:{:d} type:{:d} version:{:d} service pack:{:d}".format(con.versions.nc_sw_base, con.versions.nc_sw_type, con.versions.nc_sw_version, con.versions.nc_sw_service_pack)) print( "# Using LSV2 version '{:d}' with version flags '0x{:02x}' and '0x{:02x}'".format( con.parameters.lsv2_version, @@ -58,12 +59,15 @@ def comprehensive_demo(): print("# Time and date: {:}".format(con.get_remote_datetime())) # read error messages via LSV2, works only on iTNC controls - print("# read error messages, only available on iTNC530") + print("# read error messages, only available on some iTNC530 versions") if con.versions.is_itnc(): - e_m = con.get_error_messages() - print("## Number of currently active error messages: {:d}".format(len(e_m))) - for i, msg in enumerate(e_m): - print("### Error {:d} : {:s}".format(i, str(msg))) + if con.versions.nc_sw_base == 340490 and con.versions.nc_sw_version <= 2: + print("### control is iTNC but does not support this function") + else: + e_m = con.get_error_messages() + print("## Number of currently active error messages: {:d}".format(len(e_m))) + for i, msg in enumerate(e_m): + print("### Error {:d} : {:s}".format(i, str(msg))) else: print("## function 'get_error_messages()' not suportet for this control") @@ -94,20 +98,26 @@ def comprehensive_demo(): print("## input: {}".format(con.read_plc_memory(0, MemoryType.INPUT, 5))) print("## output: {}".format(con.read_plc_memory(0, MemoryType.OUTPUT_WORD, 5))) - print("# data values via data path, only available on iTNC530") + print("# data values via data path, only available on some iTNC530") if con.versions.is_itnc(): - print("## marker 0: {}".format(con.read_data_path("/PLC/memory/M/0"))) - print("## marker 1: {}".format(con.read_data_path("/PLC/memory/M/1"))) - print("## string 0: {}".format(con.read_data_path("/PLC/memory/S/0"))) - print("## word 10908: {}".format(con.read_data_path("/PLC/memory/W/10908"))) + if con.versions.nc_sw_base == 340490 and con.versions.nc_sw_version <= 2: + print("### control is iTNC but does not support this function") + else: + print("## marker 0: {}".format(con.read_data_path("/PLC/memory/M/0"))) + print("## marker 1: {}".format(con.read_data_path("/PLC/memory/M/1"))) + print("## string 0: {}".format(con.read_data_path("/PLC/memory/S/0"))) + print("## word 10908: {}".format(con.read_data_path("/PLC/memory/W/10908"))) else: print("## function 'read_data_path()' not suportet for this control") - print("# table values via data path, only available on iTNC530") + print("# table values via data path, only available on some iTNC530") if con.versions.is_itnc(): - print("## values from tool table for tool T1:") - print("## DOC column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/DOC"))) - print("## L column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/L"))) - print("## R column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/R"))) + if con.versions.nc_sw_base == 340490 and con.versions.nc_sw_version <= 2: + print("### control is iTNC but does not support this function") + else: + print("## values from tool table for tool T1:") + print("## DOC column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/DOC"))) + print("## L column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/L"))) + print("## R column: {}".format(con.read_data_path("/TABLE/TOOL/T/1/R"))) else: print("## function 'read_data_path()' not suportet for this control") @@ -123,7 +133,7 @@ def comprehensive_demo(): if con.versions.is_tnc7(): print("UI Interface test not available on TNC7?") else: - print("UI Interface") + print("UI Interface:") print("# switch to mode manual") con.set_keyboard_access(False) con.send_key_code(pyLSV2.KeyCode.MODE_MANUAL) @@ -135,7 +145,7 @@ def comprehensive_demo(): con.send_key_code(pyLSV2.KeyCode.MODE_PGM_EDIT) con.set_keyboard_access(True) - print("File access") + print("File access:") drv_info = con.drive_info() print("# names of disk drives: {:s}".format(", ".join([drv.name for drv in drv_info]))) dir_info = con.directory_info() @@ -153,9 +163,13 @@ def comprehensive_demo(): for file_entry in only_dir: print("## directory name: {:s}, date {:}".format(file_entry.name, file_entry.timestamp)) + #con.change_directory("TNC:/smartNC") + #print([c.name for c in con.directory_content()]) + print("# file search") h_files = con.get_file_list(path="TNC:", pattern=r"[\$A-Za-z0-9_-]*\.[hH]$") print("## found {:d} klartext programs on TNC drive".format(len(h_files))) + print([f for f in h_files]) i_files = con.get_file_list(path="TNC:", pattern=r"[\$A-Za-z0-9_-]*\.[iI]$") print("## found {:d} ISO programs on TNC drive".format(len(i_files)))