v0.1.7.4(2024/07/02)
1. [APIs: openapi.py] - 增加了modbus的python实现 - heartbeat函数修改发送间隔为1s - 清除了绝大部分调试性输出,发现太多的这种输出也会导致心跳丢包...,不清楚这个原理是什么 - 在get_response函数中的while self.pkg > 0循环中,删除了else语句,因为它永不会被执行到 - 在get_response函数中,修复一个bug,在flag==0的else语句中,补齐了index==6的情况 2. [APIs: do_current.py] - 完成了六个轴的电机电流动作的执行,以及数据采集 - 完成了对应的RL程序的编写 3[APIs: aio.py] - 引入modbus实例化,并以参数的形式,传递给相应的tabview - 新增pre_warning函数,在做自动化测试之前,确保所有条件皆具备
This commit is contained in:
		| @@ -82,10 +82,6 @@ def prj_to_xcore(prj_file): | ||||
|     ssh.close() | ||||
|  | ||||
|  | ||||
| def modify_prj(): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| def validate_resp(_id, response, w2t): | ||||
|     match _id: | ||||
|         case 'DATA ERR': | ||||
| @@ -102,76 +98,120 @@ def execution(cmd, hr, w2t, **kwargs): | ||||
|     _id = hr.execution(cmd, **kwargs) | ||||
|     _msg = hr.get_from_id(_id) | ||||
|     if not _msg: | ||||
|         w2t(f"无法获取{_id}请求的响应信息", 0, 6, 'red', tab_name='Automatic Test') | ||||
|         w2t(f"无法获取{_id}请求的响应信息", 0, 0, 'red', tab_name='Automatic Test') | ||||
|     else: | ||||
|         _response = loads(_msg) | ||||
|         validate_resp(_id, _response, w2t) | ||||
|         return _response | ||||
|  | ||||
|  | ||||
| def run_rl(hr, w2t): | ||||
|     prj_path = 'target/_build/target.prj' | ||||
|     _response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['brake', 'current']) | ||||
|     print(f"reload prj: {_response}") | ||||
|     _response = execution('overview.get_cur_prj', hr, w2t) | ||||
|     print(f"get cur prj name: {_response}") | ||||
|     _response = execution('rl_task.pp_to_main', hr, w2t, tasks=['brake']) | ||||
|     print(f"set pp2main of prj: {_response}") | ||||
|  | ||||
|     _response = execution('state.switch_auto', hr, w2t) | ||||
|     _response = execution('state.switch_motor_on', hr, w2t) | ||||
|  | ||||
|     _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) | ||||
|     print(f"打开诊断: {_response}") | ||||
|     # _response = execution('diagnosis.get_params', hr, w2t) | ||||
|     # print(f"显示诊断状态: {_response}") | ||||
|     display_pdo_params = [ | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 0}, | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 1}, | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 2}, | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 3}, | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 4}, | ||||
|         {"name": "hw_joint_vel_feedback", "channel": 5}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 0}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 1}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 2}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 3}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 4}, | ||||
|         {"name": "device_servo_trq_feedback", "channel": 5}, | ||||
|         {"name": "device_safety_estop", "channel": 0}, | ||||
| def run_rl(hr, md, w2t): | ||||
|     # need to run | ||||
|     conditions = [ | ||||
|         "	scenario(0, j1_p, j1_n, p_speed, p_tool)", | ||||
|         "	scenario(0, j2_p, j2_n, p_speed, p_tool)", | ||||
|         "	scenario(0, j3_p, j3_n, p_speed, p_tool)", | ||||
|         "	scenario(0, j4_p, j4_n, p_speed, p_tool)", | ||||
|         "	scenario(0, j5_p, j5_n, p_speed, p_tool)", | ||||
|         "	scenario(0, j6_p, j6_n, p_speed, p_tool)", | ||||
|         "	scenario(1, j5_p, j5_n, p_speed, p_tool)", | ||||
|         "	scenario(2, j5_p, j5_n, p_speed, p_tool)", | ||||
|         "	scenario(3, j5_p, j5_n, p_speed, p_tool)", | ||||
|     ] | ||||
|     _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) | ||||
|     print(f"执行采样: {_response}") | ||||
|  | ||||
|     _response = execution('rl_task.run', hr, w2t, tasks=['brake']) | ||||
|     print(f"run prj: {_response}") | ||||
|     sleep(10) | ||||
|     for condition in conditions: | ||||
|         disc = {0: '一轴', 1: '二轴', 2: '三轴', 3: '四轴', 4: '五轴', 5: '六轴', 6: '场景一', 7: '场景二', 8: '场景三'} | ||||
|         number = conditions.index(condition) | ||||
|         w2t(f"正在执行{disc[number]}测试......", 0, 0, 'purple', 'Automatic Test') | ||||
|  | ||||
|     _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) | ||||
|     print(f"关闭诊断: {_response}") | ||||
|         # 1. 关闭诊断曲线,触发软急停,并解除,目的是让可能正在运行着的机器停下来 | ||||
|         _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) | ||||
|         md.trigger_estop() | ||||
|         md.reset_estop() | ||||
|         _response = execution('state.switch_manual', hr, w2t) | ||||
|  | ||||
|     _response = execution('rl_task.stop', hr, w2t, tasks=['brake']) | ||||
|     _response = execution('state.switch_motor_off', hr, w2t) | ||||
|     _response = execution('state.switch_manual', hr, w2t) | ||||
|         # 3. 修改未要执行的场景 | ||||
|         ssh = SSHClient() | ||||
|         ssh.set_missing_host_key_policy(AutoAddPolicy()) | ||||
|         ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019') | ||||
|         cmd = f'cd /home/luoshi/bin/controller/; ' | ||||
|         cmd += f'sudo sed -i "/scenario/d" projects/target/current/main.mod; ' | ||||
|         cmd += f'sudo sed -i "/DONOTDELETE/i {condition}" projects/target/current/main.mod; ' | ||||
|         stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) | ||||
|         stdin.write('luoshi2019' + '\n') | ||||
|         stdin.flush() | ||||
|         print(stdout.read().decode())  # 必须得输出一下stdout,才能正确执行sudo | ||||
|         print(stderr.read().decode())  # 顺便也执行以下stderr | ||||
|  | ||||
|     for _msg in hr.c_msg: | ||||
|         if 'diagnosis.result' in _msg: | ||||
|             print(_msg) | ||||
|             # _msg = json.loads(_msg) | ||||
|             # if 'channel' in _msg and 'name' in _msg: | ||||
|             #     if int(_msg['channel']) == 0 and _msg['name'] == 'device_servo_trq_feedback': | ||||
|             #         print(f"diagnosis.result: {_msg}") | ||||
|             #         count += 1 | ||||
|             #         if count * 50 > 5 * 1000: | ||||
|             #             break | ||||
|         # 4. reload工程后,pp2main | ||||
|         prj_path = 'target/_build/target.prj' | ||||
|         _response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['current']) | ||||
|         _response = execution('overview.get_cur_prj', hr, w2t) | ||||
|         _response = execution('rl_task.pp_to_main', hr, w2t, tasks=['current']) | ||||
|         print(f"set pp2main of prj: {_response}") | ||||
|  | ||||
|         # 5. 切换自动并上电 | ||||
|         _response = execution('state.switch_auto', hr, w2t) | ||||
|         _response = execution('state.switch_motor_on', hr, w2t) | ||||
|  | ||||
|         # 6. 开始运行程序,单轴运行15s | ||||
|         _response = execution('rl_task.run', hr, w2t, tasks=['current']) | ||||
|         print(f"run prj: {_response}") | ||||
|         for i in range(3): | ||||
|             if md.read_ready_to_go() == 1: | ||||
|                 md.write_act(True) | ||||
|                 sleep(1) | ||||
|                 md.write_act(False) | ||||
|                 break | ||||
|             else: | ||||
|                 sleep(1) | ||||
|                 continue | ||||
|         else: | ||||
|             w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') | ||||
|         # 7. 打开诊断曲线,并执行采集 | ||||
|         _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) | ||||
|         display_pdo_params = [ | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 0}, | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 1}, | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 2}, | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 3}, | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 4}, | ||||
|             {"name": "hw_joint_vel_feedback", "channel": 5}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 0}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 1}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 2}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 3}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 4}, | ||||
|             {"name": "device_servo_trq_feedback", "channel": 5}, | ||||
|             {"name": "device_safety_estop", "channel": 0}, | ||||
|         ] | ||||
|         _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) | ||||
|         sleep(8) | ||||
|         # 8. 关闭诊断曲线,停止程序运行,下电并且换成手动模式 | ||||
|         _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) | ||||
|         _response = execution('rl_task.stop', hr, w2t, tasks=['current']) | ||||
|         _response = execution('state.switch_motor_off', hr, w2t) | ||||
|         _response = execution('state.switch_manual', hr, w2t) | ||||
|         sleep(1) | ||||
|         # 9. 处理数据并输出文件 | ||||
|         # for _msg in hr.c_msg: | ||||
|         #     if 'diagnosis.result' in _msg: | ||||
|         #         print(_msg) | ||||
|         #         _msg = json.loads(_msg) | ||||
|         #         if 'channel' in _msg and 'name' in _msg: | ||||
|         #             if int(_msg['channel']) == 0 and _msg['name'] == 'device_servo_trq_feedback': | ||||
|         #                 print(f"diagnosis.result: {_msg}") | ||||
|         #                 count += 1 | ||||
|         #                 if count * 50 > 5 * 1000: | ||||
|         #                     break | ||||
|  | ||||
|  | ||||
| def main(path, hr, w2t): | ||||
| def main(path, hr, md, w2t): | ||||
|  | ||||
|     data_dirs, data_files = traversal_files(path, w2t) | ||||
|     config_file, current_file, prj_file = check_files(data_dirs, data_files, w2t) | ||||
|     prj_to_xcore(prj_file) | ||||
|     run_rl(hr, w2t) | ||||
|     run_rl(hr, md, w2t) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|   | ||||
| @@ -5,12 +5,115 @@ import selectors | ||||
| from time import time, sleep | ||||
| from os.path import dirname | ||||
| from binascii import b2a_hex, a2b_hex | ||||
| from pymodbus.client.tcp import ModbusTcpClient | ||||
|  | ||||
| MAX_FRAME_SIZE = 1024 | ||||
| setdefaulttimeout(2) | ||||
| current_path = dirname(__file__) | ||||
|  | ||||
|  | ||||
| class ModbusRequest(object): | ||||
|     def __init__(self, w2t, tab_name): | ||||
|         super().__init__() | ||||
|         self.w2t = w2t | ||||
|         self.tab_name = tab_name | ||||
|         self.host = '192.168.0.160' | ||||
|         self.port = 502 | ||||
|         self.c = ModbusTcpClient(self.host, self.port) | ||||
|         self.c.connect() | ||||
|  | ||||
|     def motor_off(self): | ||||
|         try: | ||||
|             self.c.write_register(40002, 1) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法正常下电,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def motor_on(self): | ||||
|         try: | ||||
|             self.c.write_register(40003, 1) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法正常上电,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def trigger_estop(self): | ||||
|         try: | ||||
|             self.c.write_register(40012, 0) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法触发软急停,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def reset_estop(self): | ||||
|         try: | ||||
|             self.c.write_register(40012, 1) | ||||
|             # self.c.write_register(40001, 1) | ||||
|             # sleep(0.2) | ||||
|             # self.c.write_register(40001, 1) | ||||
|             # sleep(0.2) | ||||
|             # self.c.write_register(40001, 0) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法重置软急停,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def clear_alarm(self): | ||||
|         try: | ||||
|             self.c.write_register(40000, 1) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法清除告警,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def get_cart_vel(self): | ||||
|         try: | ||||
|             results = self.c.read_holding_registers(40537, 7) | ||||
|             print(f"cart vel: {results.registers}") | ||||
|  | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法读取笛卡尔速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def get_jnt_vel(self): | ||||
|         try: | ||||
|             results = self.c.read_holding_registers(40579, 7) | ||||
|             print(f"joint vel: {results.registers}") | ||||
|  | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法读取关节速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def get_tcp_vel(self): | ||||
|         try: | ||||
|             results = self.c.read_holding_registers(40607, 7) | ||||
|             print(f"tcp vel: {results.registers}") | ||||
|  | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法读取TCP速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def get_tcp_mag_vel(self): | ||||
|         try: | ||||
|             results = self.c.read_holding_registers(40621, 1) | ||||
|             print(f"tcp mag: {results.registers}") | ||||
|  | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法读取TCP合成速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def write_act(self, number): | ||||
|         try: | ||||
|             self.c.write_register(41000, number) | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法发送执行信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|     def read_ready_to_go(self): | ||||
|         try: | ||||
|             results = self.c.read_holding_registers(41001, 1) | ||||
|             return results.registers[0] | ||||
|         except Exception as Err: | ||||
|             self.w2t(f"{Err}") | ||||
|             self.w2t("无法读取准备信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) | ||||
|  | ||||
|  | ||||
| class HmiRequest(object): | ||||
|     def __init__(self, w2t): | ||||
|         super().__init__() | ||||
| @@ -62,6 +165,10 @@ class HmiRequest(object): | ||||
|                 self.w2t("Connection success", 0, 0, 'green', tab_name=self.tab_name) | ||||
|                 with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: | ||||
|                     f_hb.write('1') | ||||
|                 md = ModbusRequest(self.w2t, self.tab_name) | ||||
|                 md.reset_estop() | ||||
|                 md.clear_alarm() | ||||
|                 md.write_act(False) | ||||
|             except Exception as Err: | ||||
|                 self.w2t("Connection failed...", 0, 0, 'red', tab_name=self.tab_name) | ||||
|                 with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: | ||||
| @@ -87,9 +194,9 @@ class HmiRequest(object): | ||||
|             self.half_length = len(data) - index | ||||
|             self.half = data[index:] | ||||
|  | ||||
|             print(f"in head check half: {self.half}") | ||||
|             print(f"in head check length: {self.half_length}") | ||||
|             print(f"in head check data: {data}") | ||||
|             # print(f"in head check half: {self.half}") | ||||
|             # print(f"in head check length: {self.half_length}") | ||||
|             # print(f"in head check data: {data}") | ||||
|  | ||||
|             self.broke = 100 | ||||
|             index += MAX_FRAME_SIZE | ||||
| @@ -101,11 +208,12 @@ class HmiRequest(object): | ||||
|             _flag = '0' if self.get_from_id(_id) is None else '1' | ||||
|             print(f"hb = {_flag}", end=' ') | ||||
|             print(f"len(c_msg) = {len(self.c_msg)}", end=' ') | ||||
|             print(f"len(c_msg_xs) = {len(self.c_msg_xs)}", end=' ') | ||||
|             with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: | ||||
|                 f_hb.write(_flag) | ||||
|                 if _flag == '0': | ||||
|                     self.w2t(f"心跳丢失,连接失败,重新连接中...", 0, 0, 'red', tab_name=self.tab_name) | ||||
|             sleep(2) | ||||
|                     self.w2t(f"{_id} 心跳丢失,连接失败,重新连接中...", 0, 7, 'red', tab_name=self.tab_name) | ||||
|             sleep(1) | ||||
|             # with open(f"{current_path}/../../assets/templates/c_msg.log", "w", encoding='utf-8') as f: | ||||
|             #     for msg in self.c_msg: | ||||
|             #         f.write(str(loads(msg)) + '\n') | ||||
| @@ -122,12 +230,12 @@ class HmiRequest(object): | ||||
|     def get_response(self, data): | ||||
|         # 流式获取单次请求的响应 | ||||
|         if self.broke == 100: | ||||
|             print("*****************************************") | ||||
|             print(f"in get_response if broke == 100 half = {self.half}") | ||||
|             # print("*****************************************") | ||||
|             # print(f"in get_response if broke == 100 half = {self.half}") | ||||
|             _half_1 = self.half | ||||
|             _half_2 = data[:8-self.half_length] | ||||
|             _full = _half_1 + _half_2 | ||||
|             print(f"in get_response if broke == 100 _full = {_full}") | ||||
|             # print(f"in get_response if broke == 100 _full = {_full}") | ||||
|  | ||||
|             _frame_size = int.from_bytes(_full[:2], byteorder='big') | ||||
|             _pkg_size = int.from_bytes(_full[2:6], byteorder='big') | ||||
| @@ -139,9 +247,9 @@ class HmiRequest(object): | ||||
|  | ||||
|             self.pkg_size = _pkg_size | ||||
|             self.index = 8 - self.half_length | ||||
|             print(f"broke == 100 index = {self.index}") | ||||
|             print(f"broke == 100 INIT pkg size = {self.pkg_size}") | ||||
|             print(f"broke == 100 data = {data}") | ||||
|             # print(f"broke == 100 index = {self.index}") | ||||
|             # print(f"broke == 100 INIT pkg size = {self.pkg_size}") | ||||
|             # print(f"broke == 100 data = {data}") | ||||
|         else: | ||||
|             if self.reset_index == 1: | ||||
|                 self.index = 0 | ||||
| @@ -153,9 +261,9 @@ class HmiRequest(object): | ||||
|                     self.broke = 0 | ||||
|                 else: | ||||
|                     self.index, _frame_size, self.pkg_size = self.header_check(self.index, data) | ||||
|                     print(f"broke == 0 index = {self.index-8}") | ||||
|                     print(f"broke == 0 INIT pkg size = {self.pkg_size}") | ||||
|                     print(f"broke == 0 data = {data}") | ||||
|                     # print(f"broke == 0 index = {self.index-8}") | ||||
|                     # print(f"broke == 0 INIT pkg size = {self.pkg_size}") | ||||
|                     # print(f"broke == 0 data = {data}") | ||||
|                     if self.index > MAX_FRAME_SIZE: | ||||
|                         break | ||||
|                 # 详见解包原理数据.txt,self.pkg_size 永远是除了当前data之外剩余未处理的数据大小 | ||||
| @@ -164,10 +272,10 @@ class HmiRequest(object): | ||||
|                     self.response = data[self.index:self.index + self.pkg_size].decode() | ||||
|                     self.msg_storage(flag=0, response=self.response) | ||||
|                     self.index += self.pkg_size | ||||
|                     print(f"in flag=0 if data = {data}") | ||||
|                     print(f"in flag=0 if index = {self.index}") | ||||
|                     print(f"in flag=0 if pkg size = {self.pkg_size}") | ||||
|                     print(f"in flag=0 if leftover = {self.leftover}") | ||||
|                     # print(f"in flag=0 if data = {data}") | ||||
|                     # print(f"in flag=0 if index = {self.index}") | ||||
|                     # print(f"in flag=0 if pkg size = {self.pkg_size}") | ||||
|                     # print(f"in flag=0 if leftover = {self.leftover}") | ||||
|                     self.flag = 0 | ||||
|                     self.response = '' | ||||
|                     self.leftover = 0 | ||||
| @@ -177,7 +285,7 @@ class HmiRequest(object): | ||||
|                     # 执行到这里说明该data是首包,且有有分包的情况发生了也就是该响应数据量稍微比较大 | ||||
|                     # 分散在了相邻的两个及以上的data中,需要flag=1的处理 | ||||
|                     self.flag = 1 | ||||
|                     if self.index+_frame_size-6 < len(data): | ||||
|                     if self.index+_frame_size-6 <= len(data): | ||||
|                         self.response = data[self.index:self.index+_frame_size-6].decode() | ||||
|                         self.index += (_frame_size-6) | ||||
|                         self.pkg_size -= (_frame_size-6)  # 详见解包原理数据.txt,self.pkg_size | ||||
| @@ -191,13 +299,13 @@ class HmiRequest(object): | ||||
|                             if self.index + 2 == len(data): | ||||
|                                 self.broke = 1 | ||||
|                                 self.half = data[-2:] | ||||
|                                 print(f"flag = 0 encounter broke == 1 - half = {self.half}") | ||||
|                                 # print(f"flag = 0 encounter broke == 1 - half = {self.half}") | ||||
|                             elif self.index + 1 == len(data): | ||||
|                                 self.broke = 2 | ||||
|                                 self.half = data[-1:] | ||||
|                                 print(f"flag = 0 encounter broke == 2 - half = {self.half}") | ||||
|                                 # print(f"flag = 0 encounter broke == 2 - half = {self.half}") | ||||
|                             elif self.index == len(data): | ||||
|                                 print('flag = 0 encounter broke == 3') | ||||
|                                 # print('flag = 0 encounter broke == 3') | ||||
|                                 self.broke = 3 | ||||
|  | ||||
|                             self.index += MAX_FRAME_SIZE | ||||
| @@ -211,10 +319,10 @@ class HmiRequest(object): | ||||
|                         self.index += MAX_FRAME_SIZE | ||||
|                         self.reset_index = 1 | ||||
|  | ||||
|                     print(f"in flag=0 else data = {data}") | ||||
|                     print(f"in flag=0 else index = {self.index}") | ||||
|                     print(f"in flag=0 else pkg size = {self.pkg_size}") | ||||
|                     print(f"in flag=0 else leftover = {self.leftover}") | ||||
|                     # print(f"in flag=0 else data = {data}") | ||||
|                     # print(f"in flag=0 else index = {self.index}") | ||||
|                     # print(f"in flag=0 else pkg size = {self.pkg_size}") | ||||
|                     # print(f"in flag=0 else leftover = {self.leftover}") | ||||
|                     # break | ||||
|             elif self.flag == 1: | ||||
|                 # 继续处理之前为接收完的数据,处理完之后将flag重置为0 | ||||
| @@ -223,23 +331,23 @@ class HmiRequest(object): | ||||
|                     self.index = 0 | ||||
|                     self.leftover = int.from_bytes(self.half, byteorder='big') | ||||
|                     self.broke = 0 | ||||
|                     print(f"broke 1 leftover: {self.leftover}") | ||||
|                     # print(f"broke 1 leftover: {self.leftover}") | ||||
|                 elif self.broke == 2: | ||||
|                     self.leftover = int.from_bytes(self.half+data[:1], byteorder='big') | ||||
|                     self.index = 1 | ||||
|                     self.broke = 0 | ||||
|                     print(f"broke 2 leftover: {self.leftover}") | ||||
|                     # print(f"broke 2 leftover: {self.leftover}") | ||||
|                 if self.broke == 3: | ||||
|                     self.leftover = int.from_bytes(data[:2], byteorder='big') | ||||
|                     print(f"broke 3 leftover: {self.leftover}") | ||||
|                     # print(f"broke 3 leftover: {self.leftover}") | ||||
|                     self.index = 2 | ||||
|                     self.broke = 0 | ||||
|                 while self.pkg_size > 0: | ||||
|                     if self.index + self.leftover <= len(data): | ||||
|                         print(f"in pkg size > 0 loop before if data = {data}") | ||||
|                         print(f"in pkg size > 0 loop before if index = {self.index}") | ||||
|                         print(f"in pkg size > 0 loop before if pkg size = {self.pkg_size}") | ||||
|                         print(f"in pkg size > 0 loop before if leftover = {self.leftover}") | ||||
|                         # print(f"in pkg size > 0 loop before if data = {data}") | ||||
|                         # print(f"in pkg size > 0 loop before if index = {self.index}") | ||||
|                         # print(f"in pkg size > 0 loop before if pkg size = {self.pkg_size}") | ||||
|                         # print(f"in pkg size > 0 loop before if leftover = {self.leftover}") | ||||
|                         if self.leftover < 0 or self.leftover > 1024: | ||||
|                             self.w2t("", 0, 111, 'red') | ||||
|                         self.response += data[self.index:self.index + self.leftover].decode() | ||||
| @@ -252,10 +360,10 @@ class HmiRequest(object): | ||||
|                             self.leftover = 0 | ||||
|                             self.pkg_size = 0 | ||||
|                             self.reset_index = 0 if self.index < len(data) else 1 | ||||
|                             print(f"in pkg size > 0 loop break if data = {data}") | ||||
|                             print(f"in pkg size > 0 loop break if index = {self.index}") | ||||
|                             print(f"in pkg size > 0 loop break if pkg size = {self.pkg_size}") | ||||
|                             print(f"in pkg size > 0 loop break if leftover = {self.leftover}") | ||||
|                             # print(f"in pkg size > 0 loop break if data = {data}") | ||||
|                             # print(f"in pkg size > 0 loop break if index = {self.index}") | ||||
|                             # print(f"in pkg size > 0 loop break if pkg size = {self.pkg_size}") | ||||
|                             # print(f"in pkg size > 0 loop break if leftover = {self.leftover}") | ||||
|                             break | ||||
|  | ||||
|                         self.index += self.leftover | ||||
| @@ -268,29 +376,29 @@ class HmiRequest(object): | ||||
|                             if self.index + 2 == len(data): | ||||
|                                 self.broke = 1 | ||||
|                                 self.half = data[-2:] | ||||
|                                 print(f"flag = 1 encounter broke == 1 - half = {self.half}") | ||||
|                                 # print(f"flag = 1 encounter broke == 1 - half = {self.half}") | ||||
|                             elif self.index + 1 == len(data): | ||||
|                                 self.broke = 2 | ||||
|                                 self.half = data[-1:] | ||||
|                                 print(f"flag = 1 encounter broke == 2 - half = {self.half}") | ||||
|                                 # print(f"flag = 1 encounter broke == 2 - half = {self.half}") | ||||
|                             elif self.index == len(data): | ||||
|                                 print('flag = 1 encounter broke == 3') | ||||
|                                 # print('flag = 1 encounter broke == 3') | ||||
|                                 self.broke = 3 | ||||
|  | ||||
|                             self.index += MAX_FRAME_SIZE | ||||
|                             self.reset_index = 1 | ||||
|                             break  # 因为 index + 2 的大小超过 MAX_FRAME_SIZE | ||||
|                         print(f"in pkg size > 0 loop after if data = {data}") | ||||
|                         print(f"in pkg size > 0 loop after if index = {self.index}") | ||||
|                         print(f"in pkg size > 0 loop after if pkg size = {self.pkg_size}") | ||||
|                         print(f"in pkg size > 0 loop after if leftover = {self.leftover}") | ||||
|                         # print(f"in pkg size > 0 loop after if data = {data}") | ||||
|                         # print(f"in pkg size > 0 loop after if index = {self.index}") | ||||
|                         # print(f"in pkg size > 0 loop after if pkg size = {self.pkg_size}") | ||||
|                         # print(f"in pkg size > 0 loop after if leftover = {self.leftover}") | ||||
|                         if self.leftover < 0 or self.leftover > 1024: | ||||
|                             self.w2t("", 0, 111, 'red') | ||||
|                     else: | ||||
|                         print(f"in pkg size > 0 loop before else data = {data}") | ||||
|                         print(f"in pkg size > 0 loop before else index = {self.index}") | ||||
|                         print(f"in pkg size > 0 loop before else pkg size = {self.pkg_size}") | ||||
|                         print(f"in pkg size > 0 loop before else leftover = {self.leftover}") | ||||
|                         # print(f"in pkg size > 0 loop before else data = {data}") | ||||
|                         # print(f"in pkg size > 0 loop before else index = {self.index}") | ||||
|                         # print(f"in pkg size > 0 loop before else pkg size = {self.pkg_size}") | ||||
|                         # print(f"in pkg size > 0 loop before else leftover = {self.leftover}") | ||||
|                         if self.leftover < 0 or self.leftover > 1024: | ||||
|                             self.w2t("", 0, 111, 'red') | ||||
|                         self.response += data[self.index:].decode() | ||||
| @@ -298,22 +406,21 @@ class HmiRequest(object): | ||||
|                         self.pkg_size -= (len(data) - self.index) | ||||
|                         self.index += MAX_FRAME_SIZE | ||||
|                         self.reset_index = 1 | ||||
|                         print(f"in pkg size > 0 loop after else data = {data}") | ||||
|                         print(f"in pkg size > 0 loop after else index = {self.index}") | ||||
|                         print(f"in pkg size > 0 loop after else pkg size = {self.pkg_size}") | ||||
|                         print(f"in pkg size > 0 loop after else leftover = {self.leftover}") | ||||
|                         # print(f"in pkg size > 0 loop after else data = {data}") | ||||
|                         # print(f"in pkg size > 0 loop after else index = {self.index}") | ||||
|                         # print(f"in pkg size > 0 loop after else pkg size = {self.pkg_size}") | ||||
|                         # print(f"in pkg size > 0 loop after else leftover = {self.leftover}") | ||||
|                         if self.leftover < 0 or self.leftover > 1024: | ||||
|                             self.w2t("", 0, 111, 'red') | ||||
|                         break  # 该data内数据已经处理完毕,需要跳出大循环,通过break和index | ||||
|                 else: | ||||
|                     self.msg_storage(flag=0, response=self.response) | ||||
|                     self.flag = 0 | ||||
|                     self.response = '' | ||||
|                     self.leftover = 0 | ||||
|                     self.pkg_size = 0 | ||||
|                     self.index -= 2 | ||||
|                     # self.reset_index = 1 | ||||
|                     self.reset_index = 0 if (len(data) > self.index > 0) else 1 | ||||
|                 # else: | ||||
|                 #     self.msg_storage(flag=0, response=self.response) | ||||
|                 #     self.flag = 0 | ||||
|                 #     self.response = '' | ||||
|                 #     self.leftover = 0 | ||||
|                 #     self.pkg_size = 0 | ||||
|                 #     self.index -= 2 | ||||
|                 #     self.reset_index = 0 if (len(data) > self.index > 0) else 1 | ||||
|  | ||||
|     def get_response_xs(self, data): | ||||
|         if self.flag_xs == 0: | ||||
| @@ -354,8 +461,8 @@ class HmiRequest(object): | ||||
|         for i in range(3): | ||||
|             for msg in messages: | ||||
|                 if msg_id is None: | ||||
|                     self.w2t("未能成功获取到 message id...", 0, 10, 'red', tab_name=self.tab_name) | ||||
|                 if msg_id in msg: | ||||
|                     return None | ||||
|                 elif msg_id in msg: | ||||
|                     return msg | ||||
|             sleep(1) | ||||
|         else: | ||||
| @@ -372,37 +479,13 @@ class HmiRequest(object): | ||||
|         return f"{dumps(cmd, separators=(',', ':'))}\r".encode() | ||||
|  | ||||
|     def unpackage(self, sock): | ||||
|         def to_read(conn): | ||||
|         def to_read(conn, mask): | ||||
|             data = conn.recv(MAX_FRAME_SIZE) | ||||
|             if data: | ||||
|                 # print(data) | ||||
|                 self.get_response(data) | ||||
|             else: | ||||
|                 print('closing', sock) | ||||
|                 sel.unregister(conn) | ||||
|                 conn.close() | ||||
|  | ||||
|         sel = selectors.DefaultSelector() | ||||
|         sel.register(sock, selectors.EVENT_READ, to_read) | ||||
|  | ||||
|         while self.t_bool: | ||||
|             try: | ||||
|                 events = sel.select() | ||||
|             except: | ||||
|                 sleep(1) | ||||
|                 continue | ||||
|             for key, mask in events: | ||||
|                 callback = key.data | ||||
|                 callback(key.fileobj) | ||||
|  | ||||
|     def unpackage_xs(self, sock): | ||||
|         def to_read(conn): | ||||
|             data = conn.recv(1024)  # Should be ready | ||||
|             if data: | ||||
|                 # print(data) | ||||
|                 self.get_response_xs(data) | ||||
|             else: | ||||
|                 print('closing', sock) | ||||
|                 print('closing', conn) | ||||
|                 sel.unregister(conn) | ||||
|                 conn.close() | ||||
|  | ||||
| @@ -413,7 +496,27 @@ class HmiRequest(object): | ||||
|             events = sel.select() | ||||
|             for key, mask in events: | ||||
|                 callback = key.data | ||||
|                 callback(key.fileobj) | ||||
|                 callback(key.fileobj, mask) | ||||
|  | ||||
|     def unpackage_xs(self, sock): | ||||
|         def to_read(conn, mask): | ||||
|             data = conn.recv(1024)  # Should be ready | ||||
|             if data: | ||||
|                 # print(data) | ||||
|                 self.get_response_xs(data) | ||||
|             else: | ||||
|                 print('closing', conn) | ||||
|                 sel.unregister(conn) | ||||
|                 conn.close() | ||||
|  | ||||
|         sel = selectors.DefaultSelector() | ||||
|         sel.register(sock, selectors.EVENT_READ, to_read) | ||||
|  | ||||
|         while self.t_bool: | ||||
|             events = sel.select() | ||||
|             for key, mask in events: | ||||
|                 callback = key.data | ||||
|                 callback(key.fileobj, mask) | ||||
|  | ||||
|     def gen_id(self, command): | ||||
|         _now = time() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user