diff --git a/source/dev_LaminaController.py b/source/dev_LaminaController.py index 14f58f5..3cf128f 100644 --- a/source/dev_LaminaController.py +++ b/source/dev_LaminaController.py @@ -1,10 +1,13 @@ import time +from math import ceil +from tqdm import tqdm from pathlib import Path from serial import Serial from datetime import datetime +from tenacity import retry, stop_after_attempt, wait_fixed from tools.ByteConv import trans_list_to_str from tools.IntelHex import file_Bin_to_IntelHex -from func_frame import make_frame_modbus, check_frame_modbus +from func_frame_re import make_frame_modbus, check_frame_modbus, print_display from func_upgrade import GenerateImage_DLSP001_p280039, GeneratePackage_DLSP001_p280039 modbus_map = { @@ -14,6 +17,7 @@ modbus_map = { # 4 - str # 5 - addr # 6 - float + # 7 - numberList 0x0B: ["事件标志", 1], 0x0C: ["告警字1", 1], 0x0D: ["告警字2", 1], @@ -23,24 +27,24 @@ modbus_map = { 0x11: ["Boost1工作状态" , 1], 0x12: ["Boost2工作状态" , 1], 0x13: ["开关机状态" , 1], - 0x14: ["光伏组串1输入电压" , 2], - 0x15: ["光伏组串2输入电压" , 2], - 0x16: ["Boost1电感电流" , 2], - 0x17: ["Boost2电感电流" , 2], - 0x18: ["Boost输出电压" , 2], - 0x19: ["Boost输出总电流" , 2], - 0x1A: ["Boost1功率" , 3], - 0x1C: ["Boost2功率" , 3], - 0x1E: ["输入总功率" , 3], - 0x20: ["LLC输出电压" , 2], - 0x21: ["端口输出电压" , 2], - 0x22: ["LLC输出电流均值" , 2], - 0x23: ["LLC输出电流峰值" , 2], - 0x24: ["绝缘检测电压" , 2], - 0x25: ["散热片温度" , 2], - 0x26: ["腔体1温度" , 2], - 0x27: ["腔体2温度" , 2], - 0x28: ["设备温度" , 2], + 0x14: ["光伏组串1输入电压" , 2, 10], + 0x15: ["光伏组串2输入电压" , 2, 10], + 0x16: ["Boost1电感电流" , 2, 100], + 0x17: ["Boost2电感电流" , 2, 100], + 0x18: ["Boost输出电压" , 2, 10], + 0x19: ["Boost输出总电流" , 2, 100], + 0x1A: ["Boost1功率" , 3, 1000], + 0x1C: ["Boost2功率" , 3, 1000], + 0x1E: ["输入总功率" , 3, 1000], + 0x20: ["LLC输出电压" , 2, 10], + 0x21: ["端口输出电压" , 2, 10], + 0x22: ["LLC输出电流均值" , 2, 100], + 0x23: ["LLC输出电流峰值" , 2, 100], + 0x24: ["绝缘检测电压" , 2, 10], + 0x25: ["散热片温度" , 2, 10], + 0x26: ["腔体1温度" , 2, 10], + 0x27: ["腔体2温度" , 2, 10], + 0x28: ["设备温度" , 2, 10], 0x50: ["启停控制命令" , 2], 0x51: ["故障清除命令" , 2], @@ -52,44 +56,44 @@ modbus_map = { 0x57: ["时间配置命令" , 7, 3], 0x60: ["整机运行使能", 1], - 0x61: ["最小启动允许输入电压", 2], - 0x62: ["最大启动允许输入电压", 2], - 0x63: ["最小停机输入电压", 2], - 0x64: ["最大停机输入电压", 2], - 0x65: ["最小启动允许输出电压", 2], - 0x66: ["最大启动允许输出电压", 2], - 0x67: ["最小停止允许输出电压", 2], - 0x68: ["最大停止允许输出电压", 2], - 0x69: ["最小MPPT电流限值", 2], - 0x6A: ["最大MPPT电流限值", 2], + 0x61: ["最小启动允许输入电压", 2, 10], + 0x62: ["最大启动允许输入电压", 2, 10], + 0x63: ["最小停机输入电压", 2, 10], + 0x64: ["最大停机输入电压", 2, 10], + 0x65: ["最小启动允许输出电压", 2, 10], + 0x66: ["最大启动允许输出电压", 2, 10], + 0x67: ["最小停止允许输出电压", 2, 10], + 0x68: ["最大停止允许输出电压", 2, 10], + 0x69: ["最小MPPT电流限值", 2, 100], + 0x6A: ["最大MPPT电流限值", 2, 100], 0x6B: ["保留数据项", 2], - 0x6C: ["最大功率限值", 3], - 0x6E: ["最大功率限值存储值", 3], - 0x70: ["Boost输入过压保护值", 2], - 0x71: ["Boost输出过压保护值", 2], - 0x72: ["LLC输出过压保护值", 2], - 0x73: ["LLC输出欠压保护值", 2], - 0x74: ["Boost电感过流保护值", 2], - 0x75: ["LLC输出电流均值保护值", 2], - 0x76: ["LLC输出电流峰值保护值", 2], + 0x6C: ["最大功率限值", 3, 1000], + 0x6E: ["最大功率限值存储值", 3, 1000], + 0x70: ["Boost输入过压保护值", 2, 10], + 0x71: ["Boost输出过压保护值", 2, 10], + 0x72: ["LLC输出过压保护值", 2, 10], + 0x73: ["LLC输出欠压保护值", 2, 10], + 0x74: ["Boost电感过流保护值", 2, 100], + 0x75: ["LLC输出电流均值保护值", 2, 100], + 0x76: ["LLC输出电流峰值保护值", 2, 100], 0x77: ["保留数据项", 2], - 0x78: ["过载保护值", 3], - 0x7A: ["过温故障值", 2], - 0x7B: ["过温告警值", 2], - 0x7C: ["过温恢复值", 2], - 0x7D: ["输出继电器故障判断差值", 2], - 0x7E: ["LLC输出电压给定值", 2], - 0x7F: ["Boost输出电压给定值", 2], - 0x80: ["三点法中间阈值", 2], - 0x81: ["浮充电压", 2], - 0x82: ["恒压充电电压", 2], - 0x83: ["llc软起开始电压", 2], - 0x84: ["boost开始运行电压", 2], - 0x85: ["boost停止运行电压", 2], + 0x78: ["过载保护值", 3, 1000], + 0x7A: ["过温故障值", 2, 10], + 0x7B: ["过温告警值", 2, 10], + 0x7C: ["过温恢复值", 2, 10], + 0x7D: ["输出继电器故障判断差值", 2, 10], + 0x7E: ["LLC输出电压给定值", 2, 10], + 0x7F: ["Boost输出电压给定值", 2, 10], + 0x80: ["三点法中间阈值", 2, 10], + 0x81: ["浮充电压", 2, 10], + 0x82: ["恒压充电电压", 2, 10], + 0x83: ["llc软起开始电压", 2, 10], + 0x84: ["boost开始运行电压", 2, 10], + 0x85: ["boost停止运行电压", 2, 10], 0x86: ["绝缘检测正阻抗限值", 3], 0x88: ["绝缘检测负阻抗限值", 3], - 0x8A: ["保留地址项", 2], - 0x8B: ["保留地址项", 2], + 0x8A: ["抖动频率下限", 2, 10], + 0x8B: ["抖动频率上限", 2, 10], 0x8C: ["保留地址项", 2], 0x8D: ["保留地址项", 2], 0x8E: ["保留地址项", 2], @@ -118,14 +122,14 @@ class LaminaController: com_config['parity'] = kwargs['parity'] if 'parity' in kwargs.keys() else 'N' com_config['bytesize'] = kwargs['bytesize'] if 'bytesize' in kwargs.keys() else 8 com_config['stopbits'] = kwargs['stopbits'] if 'stopbits' in kwargs.keys() else 1 - self.__com = Serial(com_name, **com_config) + self.__com = Serial(com_name, timeout=0, **com_config) else: - self.__com =None + self.__com = None self.flag_print = 'frame_print' in kwargs.keys() self.time_out = kwargs['time_out'] if 'time_out' in kwargs.keys() else 1 + self.time_gap = kwargs['time_gap'] if 'time_gap' in kwargs.keys() else 0.01 self.retry = kwargs['retry'] if 'retry' in kwargs.keys() else 1 - self.retry_sub = kwargs['retry_sub'] if 'retry_sub' in kwargs.keys() else 1 self.block = { 'addr' : addr_645, @@ -135,44 +139,75 @@ class LaminaController: 'data_define': modbus_map, }, } + self.output = { + 'result': False, + 'code_func': 0x00, + } + self.log = { + 'send': 0, + 'read': 0, + 'keep-fail': 0, + 'record': { + 'config': None, + 'data': None, + }, + } - def __transfer_data(self, frame): - """ 报文数据传输 """ + def __read_frame(self) -> bool: + """ 使用帧字节超时策略读报文帧, 并进行解析数据, 打印异常 """ + frame_recv = b'' + time_start, time_current, flag_frame = time.time(), time.time(), False + while (time_current - time_start) < self.time_out: + time.sleep(self.time_gap) + bytes_read = self.__com.read_all() + time_current = time.time() + if flag_frame and len(bytes_read) == 0: + break + elif len(bytes_read): + flag_frame = True + frame_recv += bytes_read + try: + self.output = check_frame_modbus(frame_recv, self.block['data']) + if self.flag_print: + print("Read Frame: ", trans_list_to_str(frame_recv)) + except Exception as ex: + print("Error Info: ", ex) + if self.flag_print and frame_recv: + print("Fail Data: " , trans_list_to_str(frame_recv)) + self.output['result'] = False + return self.output['result'] + def __transfer_data(self, frame: bytes) -> bool: + """ 串口收发报文, 包含重试逻辑与数据打印 """ if self.__com is None: print(trans_list_to_str(frame)) return False - cnt = 0 - while cnt < self.retry: - self.__com.read_all() - self.__com.write(bytearray(frame)) + fail_count = 0 + while fail_count < self.retry: + frame_discard = self.__com.read_all() + self.__com.write(frame) + self.log['send'] += 1 - cnt_sub = 0 - frame_recv = None - while not frame_recv: - time.sleep(self.time_out) - frame_recv = self.__com.read_all() - cnt_sub += 1 - if cnt_sub >= self.retry_sub: - break + if self.flag_print and frame_discard: + print("Discard Data: " , frame_discard) + if self.flag_print: + print("Send Frame: ", trans_list_to_str(frame)) - try: - output_text = check_frame_modbus(frame_recv, self.block['data']) - except Exception as e: - print(e) - cnt += 1 - continue - print(output_text) - break + if self.__read_frame(): + if 'Regs' in self.output.keys(): + print_display(self.output['Regs']) + self.log['read'] += 1 + break + else: + fail_count += 1 + if fail_count >= self.log['keep-fail']: + self.log['keep-fail'] = fail_count + time.sleep(2*self.time_out) - if self.flag_print: - print(trans_list_to_str(frame)) - print(trans_list_to_str(frame_recv)) + return fail_count < self.retry - return cnt < self.retry - - def frame_read(self, daddr=0x60, dlen=0x30): + def frame_read(self, daddr=0x60, dlen=0x30) -> bool: self.block['data']['type'] = 'read' self.block['data']['data_addr'] = daddr self.block['data']['data_len'] = dlen @@ -180,23 +215,25 @@ class LaminaController: return self.__transfer_data(frame) - def frame_write_one(self, daddr=0x85, dval=-900): + def frame_write_one(self, daddr=0x85, dval=-900) -> bool: self.block['data']['type'] = 'write_one' self.block['data']['data_addr'] = daddr - self.block['data']['data_val'] = dval + item_coff = self.block['data']['data_define'][daddr][2] if len(self.block['data']['data_define'][daddr]) > 2 else 1 + self.block['data']['data_val'] = int(dval * item_coff) frame = make_frame_modbus(self.block['data']) return self.__transfer_data(frame) - def frame_write_dual(self, daddr=0x91, dval=600): + def frame_write_dual(self, daddr=0x91, dval=600) -> bool: self.block['data']['type'] = 'write_dual' self.block['data']['data_addr'] = daddr - self.block['data']['data_val'] = dval + item_coff = self.block['data']['data_define'][daddr][2] if len(self.block['data']['data_define'][daddr]) > 2 else 1 + self.block['data']['data_val'] = int(dval * item_coff) frame = make_frame_modbus(self.block['data']) return self.__transfer_data(frame) - def frame_write_str(self, daddr=0x82, dval=[0x06, 0x05, 0x04, 0x03, 0x02, 0x01]): + def frame_write_str(self, daddr=0x82, dval=[0x06, 0x05, 0x04, 0x03, 0x02, 0x01]) -> bool: self.block['data']['type'] = 'write_str' self.block['data']['data_addr'] = daddr self.block['data']['data_val'] = dval @@ -204,7 +241,7 @@ class LaminaController: return self.__transfer_data(frame) - def frame_record(self): + def frame_record(self) -> bool: """ 读取录波数据 """ self.block['data']['file_block_size'] = 240 @@ -213,78 +250,41 @@ class LaminaController: self.block['data']['step'] = 'start' frame_master = make_frame_modbus(self.block['data']) - ret, cnt, cnt_sub = True, 0, 0 + ret, pbar = True, None frame_data_cfg = [] while ret: - self.__com.read_all() - self.__com.write(frame_master) - frame_slave = None - while not frame_slave: - time.sleep(0.1) - frame_slave = self.__com.read_all() - cnt_sub += 1 - if cnt_sub >= self.retry_sub: - break - - try: - ret, *block_cfg = check_frame_modbus(frame_slave, self.block['data']) - print(f"{trans_list_to_str(frame_slave[:9])}") - except Exception as ex: - print(ex) - cnt += 1 - ret = False - - if ret: - cnt = 0 - frame_data_cfg.append(block_cfg[0]) - if block_cfg[0]['seq'] == 0: + if ret := self.__transfer_data(frame_master): + frame_data_cfg.append(self.output['record']) + if self.output['record']['seq'] == 0: + pbar = tqdm(total=self.output['record']['total'], desc="Record Config Reading") self.block['data']['step'] = 'next' frame_master = make_frame_modbus(self.block['data']) - elif (block_cfg[0]['seq']) >= block_cfg[0]['total']: + elif (self.output['record']['seq']) >= self.output['record']['total']: ret = False - elif cnt < self.retry: - ret = True + pbar and pbar.update() + pbar and pbar.close() # 读取data self.block['data']['type'] = 'record_data' self.block['data']['step'] = 'start' frame_master = make_frame_modbus(self.block['data']) - ret, cnt, cnt_sub = True, 0, 0 + ret, pbar = True, None frame_data_record = [] while ret: - self.__com.read_all() - self.__com.write(frame_master) - time.sleep(0.3) - frame_slave = None - while not frame_slave: - time.sleep(0.1) - frame_slave = self.__com.read_all() - cnt_sub += 1 - if cnt_sub >= self.retry_sub: - break - - try: - ret, *block_record = check_frame_modbus(frame_slave, self.block['data']) - print(f"{trans_list_to_str(frame_slave[:9])}") - except Exception as ex: - print(ex) - cnt += 1 - ret = False - - if ret: - cnt = 0 - frame_data_record.append(block_record[0]) - if block_record[0]['seq'] == 0: + if ret := self.__transfer_data(frame_master): + frame_data_record.append(self.output['record']) + if self.output['record']['seq'] == 0: + pbar = tqdm(total=self.output['record']['total'], desc="Record Data Reading") self.block['data']['step'] = 'next' frame_master = make_frame_modbus(self.block['data']) - elif (block_record[0]['seq']) >= block_record[0]['total']: + elif (self.output['record']['seq']) >= self.output['record']['total']: ret = False - elif cnt < self.retry: - ret = True - + pbar and pbar.update() + pbar and pbar.close() if len(frame_data_record) == 0: - raise Exception("未取得录波数据.") + print("Operation_Record: 未取得录波数据.") + return False # 处理配置信息 data_cfg_bare = b"".join([x['data'] for x in frame_data_cfg]) @@ -377,6 +377,9 @@ class LaminaController: (data_cfg_bare[pos+13] * 0x100 + data_cfg_bare[pos+12]) * 0.001, } config_record['TriggerTime'] = time_stamp + self.log['record']['config'] = config_record + self.log['record']['bare_config'] = data_cfg_bare + # 处理录波数据 data_record_bare = b"".join([x['data'] for x in frame_data_record]) data_record = [] @@ -407,156 +410,102 @@ class LaminaController: pos += 2 data_record.append(record_point) - return config_record, data_record + self.log['record']['data'] = data_record + self.log['record']['bare_data'] = data_record_bare + return True - def frame_update(self, path_bin): + def frame_update(self, path_bin: Path, makefile: bool = False) -> bool: """ 程序升级 注意: 在使用单板升级测试时, 需要关闭低电压检测功能, 否则无法启动升级流程; - """ + if makefile: + self.block['data']['file'], file_bin = GeneratePackage_DLSP001_p280039(path_bin) + else: + self.block['data']['file'] = path_bin.read_bytes() + self.block['data']['header_offset'] = 184 self.block['data']['type'] = 'update' + param_saved = self.flag_print, self.retry, self.time_out + self.retry = 5 + self.time_out = 0.5 + self.flag_print = False + + # 启动帧 self.block['data']['step'] = 'start' self.block['data']['index'] = 0 - self.block['data']['file'] = Path(path_bin).read_bytes() - self.block['data']['header_offset'] = 184 - # 启动帧 - frame_master = bytearray(make_frame_modbus(self.block['data'])) - - # 等待擦除完成返回 - try_times = 30 - self.__com.read_all() - while try_times: - time.sleep(self.time_out) - self.__com.write(frame_master) - frame_slave = self.__com.read_all() - if not frame_slave: - try_times -= 1 - continue - - try: - ret, _, self.block["data"]['file_block_size'] = check_frame_modbus(frame_slave, self.block['data']) - break - except Exception as e: - print(e) - - if self.block["data"]['file_block_size'] == 0: - raise Exception("Error slave response.") + frame_master = make_frame_modbus(self.block['data']) + if not self.__transfer_data(frame_master): + self.flag_print, self.retry, self.time_out = param_saved + print('Upgrade Fail: start') + return False + self.block["data"]['file_block_size'] = self.output['upgrade']['length'] # 避免接收到延迟返回报文 time.sleep(self.time_out) # 文件传输 + self.retry = 3 + self.time_out = 1.5 self.block["data"]['step'] = 'trans' - data_remain = len(self.block["data"]['file']) - self.block['data']['header_offset'] - while data_remain > 0: - frame_master = bytearray(make_frame_modbus(self.block['data'])) - - cnt = 0 - while cnt < self.retry: - self.__com.read_all() - self.__com.write(frame_master) - - cnt_sub = 0 - frame_slave = None - while not frame_slave: - time.sleep(self.time_out) - frame_slave = self.__com.read_all() - cnt_sub += 1 - if cnt_sub >= self.retry_sub: - break - - try: - ret = check_frame_modbus(frame_slave, self.block['data']) - except Exception as e: - print(e) - ret = False, 0, 0 - if ret[0]: - break - else: - cnt += 1 - - if cnt >= self.retry: - raise Exception("Error, Retry failed.") - - self.block["data"]['index'] += 1 - data_remain -= self.block["data"]['file_block_size'] + self.block['data']['index'] = 0 + frame_total = ceil((len(self.block["data"]['file']) - self.block['data']['header_offset']) / self.block["data"]['file_block_size']) + for idx in tqdm(range(frame_total), desc="File Transmitting"): + self.block["data"]['index'] = idx + frame_master = make_frame_modbus(self.block['data']) + if not self.__transfer_data(frame_master): + self.flag_print, self.retry, self.time_out = param_saved + print(f'Upgrade Fail: trans data in {idx}') + return False # 结束升级 + self.time_out = 1 self.block["data"]['step'] = 'end' - frame_master = bytearray(make_frame_modbus(self.block['data'])) + self.block["data"]['index'] += 1 + frame_master = make_frame_modbus(self.block['data']) + if not self.__transfer_data(frame_master): + self.flag_print, self.retry, self.time_out = param_saved + print(f'Upgrade Fail: end') + return False - cnt = 0 - while cnt < self.retry: - self.__com.read_all() - self.__com.write(frame_master) - - cnt_sub = 0 - frame_slave = None - while not frame_slave: - time.sleep(self.time_out) - frame_slave = self.__com.read_all() - cnt_sub += 1 - if cnt_sub >= self.retry_sub: - break - - try: - ret = check_frame_modbus(frame_slave, self.block['data']) - except Exception as e: - print(e) - ret = False, 0, 0 - if ret[0]: - break - else: - cnt += 1 - - if cnt >= self.retry: - raise Exception("Error, Retry failed.") + self.flag_print, self.retry, self.time_out = param_saved + return True def test_communication(time_out=2): """ 通信成功率测试 """ - log_success = 0 - log_failed = 0 - log_failedseries = 0 - cnt_failedseries = 0 time_start = time.time() - saveconfig_print = dev_lamina.flag_print + param_saved = dev_lamina.flag_print, dev_lamina.retry, dev_lamina.time_out dev_lamina.flag_print = False + dev_lamina.retry = 1 try: - while 1: - if dev_lamina.frame_read(0x0C, 0x20): - log_success += 1 - cnt_failedseries = 0 - else: - log_failed += 1 - cnt_failedseries += 1 - if log_failedseries <= cnt_failedseries: - log_failedseries = cnt_failedseries + while True: + dev_lamina.frame_read(0x0C, 0x20) print(f"Time Stamp: {time.ctime()}") - print(f"Success Frame: {log_success}") - print(f"Failed Frame: {log_failed}") - print(f"Max Series Failed Frame: {log_failedseries}") + print(f"Success Frame: {dev_lamina.log['read']}") + print(f"Failed Frame: {dev_lamina.log['send'] - dev_lamina.log['read']}") + print(f"Max Series Failed Frame: {dev_lamina.log['keep-fail']}") time.sleep(time_out) finally: time_end = time.time() print("Test Result: ") print(f"Time Start: {time.strftime(r'%Y-%m-%d %H:%M:%S', time.localtime(time_start))}, \tTime End: {time.strftime(r'%Y-%m-%d %H:%M:%S', time.localtime(time_end))}") print(f"Time Elapsed: {time_end - time_start}") - print(f"Success Rate: {log_success / (log_success + log_failed) * 100}%") - dev_lamina.flag_print = saveconfig_print - + print(f"Success Rate: {dev_lamina.log['read'] / dev_lamina.log['send'] * 100}%") + dev_lamina.flag_print, dev_lamina.retry, dev_lamina.time_out = param_saved def test_record(path_CFG=None, path_data=None): """ 执行录波数据读取流程 """ if path_CFG is None: path_CFG = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\record") / f"record_{'-'.join(time.ctime().replace(':', '').split(' '))}.cfg" if path_data is None: path_data = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\record") / f"record_{'-'.join(time.ctime().replace(':', '').split(' '))}.dat" - config, data = dev_lamina.frame_record() + if not dev_lamina.frame_record(): + return + config = dev_lamina.log['record']['config'] + data = dev_lamina.log['record']['data'] - # Header File - - # Config File + # Header File + + # Config File text_cfg = "" text_cfg += f"LaminaController,1,{config['Standard']}\r\n" text_cfg += f"{config['ChannelNum']},{config['ChNum_Alg']}A,{config['ChNum_Dgt']}D\r\n" @@ -593,6 +542,9 @@ def test_record(path_CFG=None, path_data=None): text_record += line_record + "\r\n" path_data.write_text(text_record) + print(f"Saved Path:") + print(f"\tconfig: {path_CFG}") + print(f"\tdata: {path_data}") def make_Image(): """ 叠光控制器DSP镜像与升级包生成流程 """ @@ -638,7 +590,6 @@ def make_Image(): data_hex = file_Bin_to_IntelHex(data_image, 0x80000, memory_width=2) file_image3.write_text(data_hex) - def make_Pakeage(fp: Path): """ 生成升级包 """ @@ -743,12 +694,14 @@ if __name__=='__main__': "Debug": {'com_name': 'COM3', 'baudrate': 115200, 'parity': 'N', 'bytesize': 8, 'stopbits': 1, # 'addr_645': [0x01, 0x02, 0x03, 0x04, 0x05, 0x06], 'frame_print': True, - 'time_out': 0.2, 'retry': 3, 'retry_sub': 10}, + 'time_out': 0.5, 'retry': 3}, } dev_lamina = LaminaController(**mode_config['Debug']) dev_lamina.frame_read(0x0100, 0x20) + # dev_lamina.frame_read(0x0A, 0x20) + # dev_lamina.frame_read(0x60, 0x60) if not hasattr(__builtins__,"__IPYTHON__") and 0: # @@ -770,15 +723,10 @@ if __name__=='__main__': file_package = make_Pakeage(file_hex) dev_lamina.frame_write_one(0x60, 0) - time.sleep(1) - - dev_lamina.frame_update(file_package) - - time.sleep(6) - - dev_lamina.frame_read(0x0100, 0x20) - - # dev_lamina.frame_write_one(0x52, 0x01) + if dev_lamina.frame_update(file_package): + time.sleep(6) + dev_lamina.frame_read(0x0100, 0x20) + # dev_lamina.frame_write_one(0x52, 0x01)