From 5a52f6262d1fdb28bfa38fad545194d308be5d48 Mon Sep 17 00:00:00 2001 From: gitea Date: Tue, 24 Sep 2024 21:30:35 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E8=8E=B7=E5=8F=96=E7=B1=BB=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E9=83=BD=E6=B7=BB=E5=8A=A0=20@property=20=E8=A3=85?= =?UTF-8?q?=E9=A5=B0=E5=99=A8=202.=20=E4=BF=AE=E5=A4=8D=20Modbus=20?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8C=BA=E7=9B=B8=E5=85=B3=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=203.=20=E9=87=8D=E6=96=B0=E8=B0=83=E6=95=B4=E4=BA=86?= =?UTF-8?q?=E5=BB=BA=E8=81=94=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/json/safety_area.set_param.json | 93 ++++++++++++++++ code/common.py | 6 +- code/openapi.py | 147 +++++++++++++++---------- 3 files changed, 187 insertions(+), 59 deletions(-) create mode 100644 assets/json/safety_area.set_param.json diff --git a/assets/json/safety_area.set_param.json b/assets/json/safety_area.set_param.json new file mode 100644 index 0000000..cb354d3 --- /dev/null +++ b/assets/json/safety_area.set_param.json @@ -0,0 +1,93 @@ +{ + "s": { + "box": { + "Lx": 0.0, + "Ly": 0.0, + "Lz": 0.0, + "direction": true, + "ori": { + "euler": { + "a": 0.0, + "b": 0.0, + "c": 0.0 + }, + "quaternion": { + "q1": 0.0, + "q2": 0.0, + "q3": 0.0, + "q4": 0.0 + } + }, + "pos": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "enable": false, + "id": 0, + "name": "region1", + "plane": { + "direction": true, + "point": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "vector": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "shape": 0, + "shared_bind_di": "", + "shared_bind_do": "", + "sphere": { + "ori": { + "euler": { + "a": 0.0, + "b": 0.0, + "c": 0.0 + }, + "quaternion": { + "q1": 0.0, + "q2": 0.0, + "q3": 0.0, + "q4": 0.0 + } + }, + "pos": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "radius": 0.0 + }, + "state": true, + "trigger": 0, + "type": 0, + "vertebral": { + "high": 0.0, + "ori": { + "euler": { + "a": 0.0, + "b": 0.0, + "c": 0.0 + }, + "quaternion": { + "q1": 0.0, + "q2": 0.0, + "q3": 0.0, + "q4": 0.0 + } + }, + "pos": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "radius": 0.0 + } + } +} \ No newline at end of file diff --git a/code/common.py b/code/common.py index 5e0837e..3c726d5 100644 --- a/code/common.py +++ b/code/common.py @@ -1,13 +1,14 @@ import time import openapi import json +import clibs def initialization(): hr = openapi.HmiRequest() pd = openapi.PreDos() # 推送配置文件 - robot_params = hr.get_robot_params() + robot_params = hr.get_robot_params robot_type = robot_params["robot_type"] security_type = robot_params["security_type"] controller_type = robot_params["controller_type"] @@ -86,12 +87,13 @@ def initialization(): hr.set_quickturn_pos(enable_drag=True) hr.move2quickturn("drag") while True: - if md.w_robot_moving(): + if md.w_robot_is_moving: time.sleep(1) else: break hr.stop_move(1) hr.switch_motor_state("off") + hr.close() # 清除所有告警 md.r_clear_alarm() diff --git a/code/openapi.py b/code/openapi.py index 8e4cfcf..10d0fa1 100644 --- a/code/openapi.py +++ b/code/openapi.py @@ -1,4 +1,4 @@ -from json import load, dumps, loads +from json import load, dumps, loads, dump from os import listdir from inspect import currentframe from socket import socket, AF_INET, SOCK_STREAM @@ -99,142 +99,157 @@ class ModbusRequest(object): self.__reg_high_pulse(40015) clibs.logger.info(f"40015-010 执行切换为手动模式") - def r_safe_region01(self, action): # NG - clibs.logger.critical("[NG]-40016-01 该指令暂时有问题,无法实现指定功能,待修复...") - # self.__c.write_register(40016, action) - # actions = "打开" if action == 1 else "关闭" - # clibs.logger.info(f"[NG]-40016-{action} 执行{actions}安全区 safe region 01") - # sleep(clibs.interval) + def r_switch_safe_region01(self, action: bool): # OK | 上升沿打开,下降沿关闭 + if action: + self.__c.write_register(40016, False) + sleep(clibs.interval) + self.__c.write_register(40016, True) + else: + self.__c.write_register(40016, True) + sleep(clibs.interval) + self.__c.write_register(40016, False) + actions = "打开" if action else "关闭" + clibs.logger.info(f"40016-{action} 执行{actions}安全区 safe region 01") + sleep(clibs.interval) - def r_safe_region02(self, action): - clibs.logger.critical("[NG]-40017-01 该指令暂时有问题,无法实现指定功能,待修复...") - # self.__c.write_register(40017, action) - # actions = "打开" if action == 1 else "关闭" - # clibs.logger.info(f"[NG]-40017-{action} 执行{actions}安全区 safe region 02") - # sleep(clibs.interval) + def r_switch_safe_region02(self, action: bool): # OK | 上升沿打开,下降沿关闭 + if action: + self.__c.write_register(40017, False) + sleep(clibs.interval) + self.__c.write_register(40017, True) + else: + self.__c.write_register(40017, True) + sleep(clibs.interval) + self.__c.write_register(40017, False) + actions = "打开" if action else "关闭" + clibs.logger.info(f"40017-{action} 执行{actions}安全区 safe region 02") + sleep(clibs.interval) - def r_safe_region03(self, action): - clibs.logger.critical("[NG]-40018-01 该指令暂时有问题,无法实现指定功能,待修复...") - # self.__c.write_register(40018, action) - # actions = "打开" if action == 1 else "关闭" - # clibs.logger.info(f"[NG]-40018-{action} 执行{actions}安全区 safe region 03") - # sleep(clibs.interval) + def r_switch_safe_region03(self, action: bool): # OK | 上升沿打开,下降沿关闭 + if action: + self.__c.write_register(40018, False) + sleep(clibs.interval) + self.__c.write_register(40018, True) + else: + self.__c.write_register(40018, True) + sleep(clibs.interval) + self.__c.write_register(40018, False) + actions = "打开" if action else "关闭" + clibs.logger.info(f"40018-{action} 执行{actions}安全区 safe region 03") + sleep(clibs.interval) @property def w_alarm_state(self): # OK res = self.__c.read_holding_registers(40500, 1).registers[0] - clibs.logger.info(f"40500 获取告警状态,结果为 {res} :--: 0 表示无告警, 1 表示有告警") + clibs.logger.info(f"40500 获取告警状态,结果为 {res} :--: 0 表示无告警,,1 表示有告警") return res @property def w_collision_alarm_state(self): # OK res = self.__c.read_holding_registers(40501, 1).registers[0] - clibs.logger.info(f"40501 获取碰撞告警状态,结果为 {res} :--: 0 表示未触发 1 表示已触发") + clibs.logger.info(f"40501 获取碰撞告警状态,结果为 {res} :--: 0 表示未触发,1 表示已触发") return res @property def w_collision_open_state(self): # OK res = self.__c.read_holding_registers(40502, 1).registers[0] - clibs.logger.info(f"40502 获取碰撞检测开启状态,结果为 {res} :--: 0 表示关闭 1 表示开启") + clibs.logger.info(f"40502 获取碰撞检测开启状态,结果为 {res} :--: 0 表示关闭,1 表示开启") return res @property def w_controller_is_running(self): # OK res = self.__c.read_holding_registers(40503, 1).registers[0] - clibs.logger.info(f"40503 获取控制器运行状态,结果为 {res} :--: 0 表示运行异常 1 表示运行正常") + clibs.logger.info(f"40503 获取控制器运行状态,结果为 {res} :--: 0 表示运行异常,1 表示运行正常") return res @property def w_encoder_low_battery(self): # OK res = self.__c.read_holding_registers(40504, 1).registers[0] - clibs.logger.info(f"40504 获取编码器低电压状态,结果为 {res} :--: 0 表示非低电压 1 表示低电压 需关注") + clibs.logger.info(f"40504 获取编码器低电压状态,结果为 {res} :--: 0 表示非低电压,1 表示低电压 需关注") return res @property def w_estop_state(self): # OK res = self.__c.read_holding_registers(40505, 1).registers[0] - clibs.logger.info(f"40505 获取机器人急停状态(非软急停),结果为 {res} :--: 0 表示未触发 1 表示已触发") + clibs.logger.info(f"40505 获取机器人急停状态(非软急停),结果为 {res} :--: 0 表示未触发,1 表示已触发") return res @property def w_motor_state(self): # OK res = self.__c.read_holding_registers(40506, 1).registers[0] - clibs.logger.info(f"40506 获取机器人上电状态,结果为 {res} :--: 0 表示未上电 1 表示已上电") + clibs.logger.info(f"40506 获取机器人上电状态,结果为 {res} :--: 0 表示未上电,1 表示已上电") return res @property def w_operation_mode(self): # OK res = self.__c.read_holding_registers(40507, 1).registers[0] - clibs.logger.info(f"40507 获取机器人操作模式,结果为 {res} :--: 0 表示手动模式 1 表示自动模式") + clibs.logger.info(f"40507 获取机器人操作模式,结果为 {res} :--: 0 表示手动模式,1 表示自动模式") return res @property def w_program_state(self): # OK res = self.__c.read_holding_registers(40508, 1).registers[0] - clibs.logger.info(f"40508 获取程序的运行状态,结果为 {res} :--: 0 表示未运行 1 表示正在运行") + clibs.logger.info(f"40508 获取程序的运行状态,结果为 {res} :--: 0 表示未运行,1 表示正在运行") return res @property def w_program_not_run(self): # OK res = self.__c.read_holding_registers(40509, 1).registers[0] - clibs.logger.info(f"40509 判定程序为未运行状态,结果为 {res} :--: 0 表示正在运行 1 表示未运行") + clibs.logger.info(f"40509 判定程序为未运行状态,结果为 {res} :--: 0 表示正在运行,1 表示未运行") return res @property def w_program_reset(self): # OK res = self.__c.read_holding_registers(40510, 1).registers[0] - clibs.logger.info(f"40510 判定程序指针为 pp2main 状态,结果为 {res} :--: 0 表示指针不在 main 函数 1 表示指针在 main 函数") + clibs.logger.info(f"40510 判定程序指针为 pp2main 状态,结果为 {res} :--: 0 表示指针不在 main 函数,1 表示指针在 main 函数") return res @property def w_reduce_mode_state(self): # OK res = self.__c.read_holding_registers(40511, 1).registers[0] - clibs.logger.info(f"40511 获取机器人缩减模式状态,结果为 {res} :--: 0 表示非缩减模式 1 表示缩减模式") + clibs.logger.info(f"40511 获取机器人缩减模式状态,结果为 {res} :--: 0 表示非缩减模式,1 表示缩减模式") return res @property def w_robot_is_busy(self): # OK res = self.__c.read_holding_registers(40512, 1).registers[0] - clibs.logger.info(f"40512 获取机器人是否处于 busy 状态,结果为 {res} :--: 0 表示未处于 busy 状态 1 表示处于 busy 状态") + clibs.logger.info(f"40512 获取机器人是否处于 busy 状态,结果为 {res} :--: 0 表示未处于 busy 状态,1 表示处于 busy 状态") return res @property def w_robot_is_moving(self): # OK res = self.__c.read_holding_registers(40513, 1).registers[0] - clibs.logger.info(f"40513 获取机器人是否处于运动状态,结果为 {res} :--: 0 表示为运动 1 表示正在运动") + clibs.logger.info(f"40513 获取机器人是否处于运动状态,结果为 {res} :--: 0 表示为运动,1 表示正在运动") return res @property def w_safe_door_state(self): # OK res = self.__c.read_holding_registers(40514, 1).registers[0] - clibs.logger.info(f"40514 获取机器人是否处于安全门打开状态,需自动模式下执行,结果为 {res} :--: 0 表示未触发安全门 1 表示已触发安全门") + clibs.logger.info(f"40514 获取机器人是否处于安全门打开状态,需自动模式下执行,结果为 {res} :--: 0 表示未触发安全门,1 表示已触发安全门") return res @property - def w_safe_region01(self): # NG - clibs.logger.critical(f"40515 获取安全区域 safe region01 功能咱不可用,待修复...") - # res = self.__c.read_holding_registers(40515, 1).registers[0] - # clibs.logger.info(f"40515 获取安全区域 safe region01 是否处于打开状态,结果为 {res}") - # return res + def w_safe_region01_trig_state(self): # OK + res = self.__c.read_holding_registers(40515, 1).registers[0] + clibs.logger.info(f"40515 获取安全区域 safe region01 的触发状态,结果为 {res} :--: 0 表示未触发,1 表示已触发") + return res @property - def w_safe_region02(self): # NG - clibs.logger.critical(f"40516 获取安全区域 safe region02 功能咱不可用,待修复...") - # res = self.__c.read_holding_registers(40516, 1).registers[0] - # clibs.logger.info(f"40516 获取安全区域 safe region02 是否处于打开状态,结果为 {res}") - # return res + def w_safe_region02_trig_state(self): # OK + res = self.__c.read_holding_registers(40516, 1).registers[0] + clibs.logger.info(f"40516 获取安全区域 safe region02 的触发状态,结果为 {res} :--: 0 表示未触发,1 表示已触发") + return res @property - def w_safe_region03(self): # NG - clibs.logger.critical(f"40517 获取安全区域 safe region03 功能咱不可用,待修复...") - # res = self.__c.read_holding_registers(40517, 1).registers[0] - # clibs.logger.info(f"40517 获取安全区域 safe region03 是否处于打开状态,结果为 {res}") - # return res + def w_safe_region03_trig_state(self): # OK + res = self.__c.read_holding_registers(40517, 1).registers[0] + clibs.logger.info(f"40517 获取安全区域 safe region03 的触发状态,结果为 {res} :--: 0 表示未触发,1 表示已触发") + return res @property def w_soft_estop_state(self): # OK res = self.__c.read_holding_registers(40518, 1).registers[0] - clibs.logger.info(f"40518 获取机器人软急停状态,结果为 {res} :--: 0 表示未触发软急停 1 表示已触发软急停") + clibs.logger.info(f"40518 获取机器人软急停状态,结果为 {res} :--: 0 表示未触发软急停,1 表示已触发软急停") return res def io_write_coils(self, addr, action): # OK | 名字叫写线圈,其实是写 modbus 的 discrete inputs(DI) @@ -281,6 +296,7 @@ class HmiRequest(object): self.__t_is_alive = Thread(target=self.__is_alive) self.__t_is_alive.daemon = False self.__t_is_alive.start() + sleep(1) # 很重要,必须有,因为涉及到建联成功与否 def __is_alive(self): first_time = True @@ -301,9 +317,8 @@ class HmiRequest(object): self.__t_unpackage_xs = Thread(target=self.__unpackage_xs, args=(self.__c_xs,)) self.__t_unpackage_xs.daemon = True self.__t_unpackage_xs.start() - else: - self.__silence = False - first_time = True + self.__silence = False + first_time = True sleep(clibs.interval*10) @@ -1727,14 +1742,32 @@ class HmiRequest(object): """ return self.__get_data(currentframe().f_code.co_name, "safety_area_data", flag=1) - def set_safety_area_enable(self, id: int, enable: bool, **kwargs): + def set_safety_area_enable(self, id: int, enable: bool): """ 设置每个安全区域的开关 :param id: 安全区域开关,0-9 :param enable: True 打开,False 关闭 :return: None """ - self.execution("safety.safety_area.safety_area_enable", protocol_flag=1, id=id, enable=enable, **kwargs) + self.execution("safety.safety_area.safety_area_enable", protocol_flag=1, id=id, enable=enable) + + def set_safety_area_param(self, id: int, enable: bool, **kwargs): # 不生效,待确认 + """ + 设定单独安全区的参数 + :param id: 安全区 id + :param enable: 是否开启 + :param kwargs: 其他参数,参考 get_safety_area_params 的返回值形式 + :return: None + """ + res = self.get_safety_area_params["g"]["safety_area_data"]["safety_area_setting"][id] + keys = res.keys() + kwargs.update({"id": id, "enable": enable}) + for _ in keys: + if _ in kwargs.keys(): + res[_] = kwargs[_] + with open(f"{clibs.PREFIX}/json/safety_area.set_param.json", mode="w", encoding="utf-8") as f: + dump({"s": res}, f, indent=4) + self.execution("safety_area.set_param", protocol_flag=1) @property def get_filtered_error_code(self): @@ -1766,7 +1799,7 @@ class HmiRequest(object): return self.__get_data(currentframe().f_code.co_name, "log_code.data", flag=1) def set_filtered_error_code(self, action: str, code_list: list): - origin_code_list = self.get_filtered_error_code()["g"]["log_code.data"]["code_list"] + origin_code_list = self.get_filtered_error_code["g"]["log_code.data"]["code_list"] # [{'id': 10000, 'title': 'HMI请求包解析错误'}, {'id': 10002, 'title': '快速调整启动失败'}] if action == "clear": code_list = [] @@ -1899,7 +1932,7 @@ class ExternalCommunication(object): return self.__exec_cmd(f"open_safe_region:{number}", f"打开第 {number} 个安全区域") def close_safe_region(self, number: int): - return self.__exec_cmd(f"close_safe_region:{number}", f"打开第 {number} 个安全区域") + return self.__exec_cmd(f"close_safe_region:{number}", f"关闭第 {number} 个安全区域") def open_reduced_mode(self): return self.__exec_cmd("open_reduced_mode", "开启缩减模式")