背景

我们在一些工业产品中使用树莓派替代了PLC和上位机,并借助树莓派的算力将AI和机器视觉引入工业领域。

以前的产品都不存在动作机构,仅仅将结果输出到指示灯、蜂鸣器或者显示器上,没有安全隐患,

现在引入了动作机构,需要根据结果驱动设备执行一定的动作,动作机构的引入,增加了产品的安全隐患,比如可能会夹手,撞机等。为此我们需要设计额外的保护程序,其中最重要的是急停功能的实现。

要求

  • 急停信号优先级最高,任何情况下按下急停都应该马上停止

问题分析

  • 动作机构由24V供电,急停开关串联在电源上,可以做到开关按下后,动作机构断电。(急停开关都带有锁定机构,按下后不会弹起,会保持按下状态)
  • 树莓派独立于动作机构供电,急停开关按下后,树莓派收到信号,开始终止程序,之后一直监听急停按钮信号。
  • Python一般情况下是单线程运行,为了及时响应急停,需要将急停功能做成主进程,业务动作逻辑作为子进程,当监听到急停信号后,马上终止子进程

设计思路

  • 择子进程而不是子线程的原因为:Python中子线程无法发送kill信号,没有很好的办法干预子线程的行为(除非每一步都判断一下,会造成代码复杂度升高),而子进程可以直接发送terminate信号杀死。
  • 急停使用低电平触发原因为:我们认为低电平是一个稳定的状态,高电平不是一个稳定的状态,比如由于某种原因导致断电,那么也应该触发急停,发生任何非正常的情况,停下来总是没错的。

接线示意图

Python程序流程图

代码实现

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)

【树莓派】Python开发工控机急停设计的更多相关文章

  1. 阿里云物联网平台体验(树莓派+Python篇)

    阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...

  2. 【python开发】迈出第一步,这可能是我唯一一次的Python开发了

    好久没写博了,今天就瞎唠唠吧 背景: 组内有个测试平台,是基于Python2+tornado 框架写的,之前自己维护了一套系统的UIweb自动化代码,现在需要集成进去.这很可能是自己唯一一次基于pyt ...

  3. Python开发【前端】:jQuery

    jQuery简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是&qu ...

  4. Python开发【前端】:DOM

    DOM(文档对象模型(Document Object Model)) 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页 ...

  5. Python开发【前端】:JavaScript

    JavaScript入门 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本 ...

  6. Python开发【前端】:HTML

    HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...

  7. python学习之python开发环境搭建

    Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...

  8. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  9. 智普教育Python培训之Python开发视频教程网络爬虫实战项目

    网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...

随机推荐

  1. HashMap、ConcurrentHashMap红黑树实现分析

    本文学习知识点 1.二叉查找树,以及二叉树查找带来的问题. 2.平衡二叉树及好处. 3.红黑树的定义及构造. 4.ConcurrentHashMap中红黑树的构造. 在正式分析红黑树之前,有必要了解红 ...

  2. netty系列之:使用netty实现支持http2的服务器

    目录 简介 基本流程 CleartextHttp2ServerUpgradeHandler Http2ConnectionHandler 总结 简介 上一篇文章中,我们提到了如何在netty中配置TL ...

  3. JAVA String、StringBuffer、StringBuilder类解读

    JAVA String.StringBuffer.StringBuilder类解读 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作 ...

  4. BUAA软件工程个人作业-软件案例分析

    BUAA个人博客作业-软件案例分析 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习开发软件的能力 这个作 ...

  5. oo第四次博客-UML暨学期总结

    一. 本单元两次作业架构设计 这两次作业实际上难度不大,不存在算法上的难题,大部分时间都是用在处理UML图中各个元素的关系上. 第一次UML主要处理UML类图.有UMLclass,UMLinterfa ...

  6. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

  7. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  8. Pandas核心用法

    目录 Numpy和Pandas Numpy科学计算 Pandas数据分析 安装jupyter notebook Numpy语法 创建和基本使用 切片索引 布尔索引 对位运算 矩阵的乘除 其他方法 Pa ...

  9. Linux C语言链表你学会了吗?

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

  10. Verdi Protocol Analyzer Debug 简单使用

    转载:Verdi Protocol Analyzer Debug 简单使用_Holden_Liu的博客-CSDN博客_verdi 技巧 文档与源码: User Guide: UVMDebugUserG ...