我们在一些工业产品中使用树莓派替代了PLC和上位机,并借助树莓派的算力将AI和机器视觉引入工业领域。
以前的产品都不存在动作机构,仅仅将结果输出到指示灯、蜂鸣器或者显示器上,没有安全隐患,
现在引入了动作机构,需要根据结果驱动设备执行一定的动作,动作机构的引入,增加了产品的安全隐患,比如可能会夹手,撞机等。为此我们需要设计额外的保护程序,其中最重要的是急停功能的实现。
import RPi.GPIO as GPIO import time from multiprocessing import Process # 定义信号引脚 button_stop = 20 button_reset = 21 button_start = 22 # 初始化GPIO def init_gpio(): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # 初始化按钮,按钮均为低电平触发 GPIO.setup(button_reset, GPIO.IN) GPIO.setup(button_start, GPIO.IN) GPIO.setup(button_stop, GPIO.IN) # 业务动作 def step_1(): time.sleep(3) return True def step_2(): time.sleep(3) return True def step_3(): time.sleep(3) return True # 复位动作组合 def run_reset(): move_reset_list = [ step_3, step_2, step_1 ] result = True try: for func in move_reset_list: func_name = func.__name__ print("正在执行: %s" % func_name) func_result = func() if not func_result: result = False break except: result = False finally: if not result: exit(1) else: exit(0) # 业务动作组合 def run_step(): result = True try: auto_cover_list = [ step_1, step_2, step_3 ] for func in auto_cover_list: func_name = func.__name__ print("正在执行: %s" % func_name) func_result = func() if not func_result: result = False break except: result = False finally: if not result: exit(1) else: exit(0) if __name__ == '__main__': # 开始工作 init_gpio() while True: if GPIO.input(button_start) == 0: try: p_run = Process(target=run_step, daemon=True) p_run.start() # 监听急停信号 while p_run.is_alive(): if GPIO.input(button_stop) == 0: p_run.terminate() break else: time.sleep(0.1) if p_run.exitcode == 0 or p_run.exitcode is None: print("执行成功") else: print("执行失败") except: print("执行失败") elif GPIO.input(button_reset) == 0: p_reset = Process(target=run_reset, daemon=True) p_reset.start() # 监听急停信号 while p_reset.is_alive(): if GPIO.input(button_stop) == 0: p_reset.terminate() break else: time.sleep(0.1) elif GPIO.input(button_stop) == 0: # 急停按钮释放后,再释放程序 while True: if GPIO.input(button_stop) == 0: time.sleep(0.1) else: break else: time.sleep(0.1)