精华内容
下载资源
问答
  • 红外线发光二极管用脉冲调变,是传达信号的一种方法,而且也是一种较理想的方式,,如果红外线发光二极管,流过大量电流就会得到大的发射束,但是电流的极限,受到规格的限制,因此,利用脉冲调变方式降低其平均...

    脉冲波调变驱动电路

    红外线发光二极管用脉冲调变,亦是传达信号的一种方法,而且也是一种较理想的方式,,如果红外线发光二极管,流过大量电流就会得到大的发射束,但是电流的极限,受到规格的限制,因此,利用脉冲调变方式降低其平均电流,就可能容许有比较大的峰值电流流过,使得发射光束相对的增强。

    所以本质上,红外的传播距离,受电流的大小的影响,而脉冲驱动可以有效提高原来的电流峰值,从而使其红外传播更远。

    发射红外线去控制相应的受控装置时,其控制的距离与发射功率成正比。为了增加红外线的控制距离,红外发光二极管工作于脉冲状态,因为脉动光(调制光)的有效传送距离与脉冲的峰值电流成正比,只需尽量提高峰值Ip,就能增加红外光的发射距离。提高Ip的方法,是减小脉冲占空比,即压缩脉冲的宽度T,一般其使用频在300KHz以下

    详情可参考:

    红外驱动电路设计https://www.dianziaihaozhe.com/lilunxuexi/973/

    里面有具体不同的驱动方法的介绍和相应的驱动电流的计算

    展开全文
  • 领域驱动战略设计实践

    千次阅读 2018-11-26 13:16:48
    课程介绍 国内关于领域驱动设计(Domain Driven Design,DDD)的原创书籍少之又少,甚至可以说没有,作者...本系列课程拆分两个课程,即《领域驱动战略设计实践》和《领域驱动战术设计实践》,分别对应领域驱动设...

    b9db2740-7705-11e9-b77d-2109c5a029d4e9890150-7706-11e9-83dc-19aaf4aa0006

    课程内容

    访谈录 | 聊聊领域驱动设计(文字版)

    相信很多朋友对领域驱动设计会有这样或那样的困惑,比如领域驱动设计是什么?它在工作中有什么作用?为什么国内关于这方面的书籍少之又少?…… 为了解决这些疑惑,有幸邀请到专家张逸老师来聊聊领域驱动设计,下面是 GitChat 独家采访记录。

    GitChat:领域驱动设计(Domain Driven Design,DDD)自诞生以来已有十几年时间,这门本已步入老年的方法学却因为微服务的兴起而焕发了第二春。您说过这可能要归功于 DDD 的“坚硬生长”,但不可否认微服务确实也是一个重要因素,能否请您解释一下领域驱动设计微服务这种深层次的匹配关系?

    张逸:领域驱动设计是由 Eric Evans 在一本《领域驱动设计》书中提出的,它是针对复杂系统设计的一套软件工程方法;而微服务是一种架构风格,一个大型复杂软件应用是由一个或多个微服务组成的,系统中的各个微服务可被独立部署,各个微服务之间是松耦合的,每个微服务仅关注于完成一件任务并很好地完成该任务。

    两者之间更深入的关系,在我写的课程中已有详细讲解。主要体现在领域驱动设计中限界上下文与微服务之间的映射关系。假如限界上下文之间需要跨进程通信,并形成一种零共享架构,则每个限界上下文就成为了一个微服务。在微服务架构大行其道的当今,我们面临的一个棘手问题是:如何识别和设计微服务?领域驱动的战略设计恰好可以在一定程度上解决此问题。

    GitChat:如果说轻量化处理、自动部署,以及容器技术的发展使得微服务的兴起成为必然,那么是否可以说领域驱动设计今日的再续辉煌也是一种必然(或者说 DDD 在其诞生之时过于超前)?您能否预测一下 DDD 未来可能会和什么样的新理念相结合?

    张逸:好像领域驱动设计就从未真正“辉煌”过,所以谈不上再续辉煌,但确实是因为微服务引起了社区对它的重燃热情。推行领域驱动设计确乎有许多阻力,一方面要做到纯粹的领域驱动设计,许多团队成员的技能达不到;另一方面,似乎领域驱动设计带来的价值不经过时间的推移无法彰显其价值,这就缺乏足够的说服力让一家公司不遗余力地去推广领域驱动设计。微服务似乎给了我们一个推动领域驱动设计的理由!因为软件系统的微服务化已经成为了一种潮流,领域驱动设计又能够为微服务化保驾护航,还有什么理由不推行呢?

    我个人认为,未来 DDD 的发展可能会出现以下趋势:

    • 以函数式编程思想为基础的领域建模理念与事件驱动架构和响应式编程的结合,可能在低延迟高并发的项目中发挥作用。这种领域驱动设计思想已经比较成熟,但目前还没有看到太多成功的运用。
    • 以 DDD 设计方法为基础的框架的出现,让微服务设计与领域建模变得更加容易,降低领域驱动设计的门槛。

    GitChat:能否尽可能地详细(或举例)说明您在阅读并审校《实现领域驱动设计》一书时所认识到的领域驱动设计的本质—— 一个开放的设计方法体系 ——是什么?

    张逸:在《实现领域驱动设计》一书中,Vernon 不仅对整个领域驱动设计过程作了一番有益的梳理,还结合社区发展在书中引入了六边形架构和领域事件等概念,这为当时的我打开了一扇全新的窗户——原来领域驱动设计并不是一套死板的方法,而是一种设计思想、一种开放的设计方法体系,只要有利于领域驱动设计的实践,都可以引入其中。于是,在我的书中我才敢于大胆地引入用例、敏捷实践、整洁架构,以期为领域驱动设计提供补充。

    Eric Evans 的《领域驱动设计》是以面向对象设计作为模型驱动设计的基础,但时下被频繁运用的函数式编程思想也给模型驱动设计带来了另一种视角。从开放的设计方法体系的角度讲,我们完全可以把更多的编程范式引入到领域驱动设计中。因为有了更多的选择,针对不同的业务场景就可以选择更适合的 DDD 实践,而不仅仅限于 Eric Evans 最初提出的范畴。

    点击了解《领域驱动战略设计实践》

    GitChat:团队内外成员之间的协作与沟通一直以来都是个难题,也是大家经常喜欢调侃的话题之一,能否举例说明一下领域驱动设计是如何解决这一问题的?

    张逸:我觉得这个问题问反了。领域驱动设计解决不了这个问题,它只是重视这个问题;相反,我们应该说只有解决了团队内外成员之间的协作与沟通,才能更好地进行领域驱动设计。为此,我尝试用一些敏捷实践来解决这种协作问题。

    GitChat:您在学习和实践领域驱动设计的过程中是否有哪些(有趣的)故事可以和读者们分享?

    张逸:我在 ThoughtWorks 的时候,公司邀请《实现领域驱动设计》作者 Vaughn Vernon 到北京 Office 给我们做了一次 DDD 培训。借着这次亲炙大师教诲的机会,我向他请教了一个一直缠绕在我心中困惑不解的问题:“如何正确地识别限界上下文?”结果他思考了一会儿,严肃地回答了我:“By experience!” 我唯有无言以对。

    GitChat:有很多读者对您即将在课程中给出全真案例“EAS 系统”很感兴趣,能否简单介绍一下这个案例以及它在实际应用中的意义?

    张逸:EAS 系统是我之前做过的一个真实项目,之所以选择这个项目来作为这个课程的全真案例,原因如下:

    • 学习 DDD 必须理论联系实际。虽然在我写的课程内容中已经结合理论讲解提供了较多的实际案例,但这些零散的案例无法给读者提供一个整体的印象。
    • EAS 系统的业务知识门槛相对较低,不至于因为不熟悉领域知识而影响对 DDD 的学习。
    • EAS 系统具备一定的业务复杂度,既适合战略设计阶段,又适合战术阶段。

    GitChat:您提到这次的 DDD 系列课程分为《领域驱动战略设计实践》和《领域驱动战术设计实践》两部分,这两个课程在内容设计上侧重有什么不同?很多读者关心《领域驱动战术设计实践》何时发布,可否透露一下?

    张逸:这两个课程对应于 DDD 的战略设计阶段与战术设计阶段,粗略地说,前者更偏向于架构,后者更偏向于设计与编码。事实上,就我个人的规划来说,计划还有第三部分,是围绕着函数式编程讲解与 DDD 有关的实践,包括 EDA、CQRS、Domain Event 等知识。

    目前,《领域驱动战略设计实践》还有最后几个章节没有完成。一旦完成后,就可以开始撰写《领域驱动战术设计实践》内容了。当然,战术设计的相关内容已有部分初稿,我争取能够在 11 月发布这部分内容。

    GitChat:您觉得这门课的学员/读者应该是什么样的人?对于这些人,要想掌握领域驱动设计乃至在专业领域更上一层楼,您有哪些学习建议?

    张逸:学习课程的学员/读者最好要有一定的软件设计能力,并对 DDD 学习抱有好奇心,希望能够将 DDD 学以致用。

    学习建议:

    • 积累领域知识,以提高沟通与协作能力;
    • 以 Eric Evans 的《领域驱动设计》为主体,广泛涉猎与 DDD 相关的书籍与文章,并关注 DDD 社区的最新知识;
    • 要善于总结,理清 DDD 中各个概念之间的区别与应用场景。

    GitChat:作为一位曾就职于中兴、惠普、中软、ThoughtWorks 等大型中外企业的架构师/技术总监/首席咨询师,在职业发展方面,您对您的读者们有哪些建议?

    张逸:我之前在 ThoughtWorks 的同事郑烨(校长)给我提过一个建议,就是打造自己的技术标签。例如,现在 DDD 就成为了我其中的一个技术标签了。这个说法的内在含义,就是要寻找和定位自己的技术发展方向,然后往更深的方向钻研,最终成为这个方向的技术专家。因此,结合自己的能力特长、兴趣点以及技术发展趋势去规划自己的技术发展方向,才是技术人员最应该思考并践行的。

    到这里,访谈录的内容就结束了,大家若对 DDD 的内容比较感兴趣的话,欢迎订阅本课程,有任何关于本课程内容的疑惑可在读者圈留言给张逸老师,张老师会很积极的解答每一个问题~

    分享交流

    我们为本课程付费读者创建了微信交流群,以方便更有针对性地讨论课程相关问题。入群方式请到第 04 课末尾添加小编的微信号,并注明「DDD」。

    阅读文章过程中有任何疑问随时可以跟其他小伙伴讨论,或者直接向作者提问(作者看到后抽空回复)。你的分享不仅帮助他人,更会提升自己。

    点击了解《领域驱动战略设计实践》

    开篇词 | 领域驱动设计,重焕青春的设计经典

    课程背景

    领域驱动设计确实已不再青春,从 Eric Evans 出版的那本划时代的著作《领域驱动设计》至今,已有将近十五年的时间,在软件设计领域中,似乎可以称得上是步入老年时代了。可惜的是,对于这样一个在国外 IT 圈享有盛誉并行之有效的设计方法学,国内大多数的技术人员却并不了解,也未曾运用到项目实践中,真可以说是知音稀少。领域驱动设计似乎成了一门悄悄发展的隐学,它从来不曾大行其道,却依旧顽强地发挥着出人意料的价值。

    直到行业内吹起微服务的热风,人们似乎才重新发现了领域驱动设计的价值,并不是微服务拯救了领域驱动设计,是因为领域驱动设计一直在坚硬的生长,然而看起来,确乎因为微服务,领域驱动设计才又焕发了青春。

    我从 2006 年开始接触领域驱动设计,一开始我就发现了它的魅力并沉迷其间。从阅读 Eric Evans 的《领域驱动设计》入门,然后尝试在软件项目中运用它,也取得了一定成效。然而,我的学习与运用一直处于摸索之中,始终感觉不得其门而入,直到有机会拜读 Vaughn Vernon 出版的《实现领域驱动设计》一书,并负责该书的审校工作,我才触摸到了领域驱动从战略设计到战术设计的整体脉络,并了解其本质:领域驱动设计是一个开放的设计方法体系

    即使如此,许多困惑与谜题仍然等待我去发现线索和答案。设计总是如此,虽然前人已经总结了许多原则与方法,却不能像数学计算那样,按照公式与公理进行推导就一定能得到准确无误的结果。设计没有唯一的真相。

    即使如此,如果我们能够走在迈向唯一真相的正确道路上,那么每前进一步,就会离这个理想的唯一真相更近一步,这正是我推出这门课的初衷。也并不是说我贴近了唯一真相,更不是说我已经走在了正确道路上,但我可以自信地说,对于领域驱动设计,我走在了大多数开发人员的前面,在我发现了更多新奇风景的同时,亦走过太多荒芜的分岔小径,经历过太多坎坷与陷阱。我尝试着解答领域驱动设计的诸多谜题,期望能从我的思考与实践中发现正确道路的蛛丝马迹。我写的这门课程正是我跌跌撞撞走过一路的风景拍摄与路径引导,就好似你要去银河系旅游,最好能有一本《银河系漫游指南》在手一样,不至于迷失在浩瀚的星空之中,我期待这门课程能给你带来这样的指导。

    课程框架

    本课程是我计划撰写的领域驱动设计实践系列的第一部分内容(第二部分内容是领域驱动战术设计实践,后面陆续更新),其全面覆盖了领域建模分析与架构设计的战略设计过程,从剖析软件复杂度的根源开始,引入了领域场景分析与敏捷项目实践,帮助需求分析人员与软件设计人员分析软件系统的问题域,提炼真实表达的领域知识,最终建立系统的统一语言。同时,本课程将主流架构设计思想、微服务架构设计原则与领域驱动设计中属于战略设计层面的限界上下文、上下文映射、分层架构结合起来,完成从需求到架构设计再到构建代码模型的架构全过程。

    本课程分为五部分,共计 34 篇。

    开篇词:领域驱动设计,重焕青春的设计经典

    第一部分(第01~05课):软件复杂度

    • 领域驱动设计的目的是应对软件复杂度。本部分内容以简练的笔触勾勒出了领域驱动设计的全貌,然后深入剖析了软件复杂度的本质,总结了控制软件复杂度的原则,最终给出了领域驱动设计应对软件复杂度的基本思想与方法。

    第二部分(第06~10课):领域知识

    • 领域驱动设计的核心是“领域”,也是进行软件设计的根本驱动力。因此,团队在进行领域驱动设计时,尤其需要重视团队内外成员之间的协作与沟通。本部分内容引入了敏捷开发思想中的诸多实践,并以领域场景分析为主线讲解了如何提炼领域知识的方法。

    第三部分(第11~20课):限界上下文

    • 限界上下文是领域驱动设计最重要的设计要素,我们需要充分理解限界上下文的本质与价值,突出限界上下文对业务、团队与技术的“控制”能力。
    • 提出了从业务边界、工作边界到应用边界分阶段分步骤迭代地识别限界上下文的过程方法,使得领域驱动设计的新手能够有一个可以遵循的过程来帮助识别限界上下文。
    • 剖析上下文映射,确定限界上下文之间的协作关系,进一步帮助我们合理地设计限界上下文。

    第四部分(第21~28课):架构与代码模型

    • 作为一个开放的设计方法体系,本部分引入了分层架构、整洁架构、六边形架构与微服务架构等模式,全面剖析了领域驱动设计的架构思想与原则。
    • 结合限界上下文,并针对限界上下文的不同定义,对领域驱动的架构设计进行了深度探索,给出了满足整洁架构思想的代码模型。

    第五部分(第29~33课):EAS 系统的战略设计实践

    • 给出一个全真案例——EAS 系统,运用各篇介绍的设计原则、模式与方法对该系统进行全方位的战略设计,并给出最终的设计方案。

    本课程并非是对 Eric Evans《领域驱动设计》的萧规曹随,而是吸纳了领域驱动设计社区的各位专家大师提出的先进知识,并结合我多年来运用领域驱动设计收获的项目经验,同时还总结了自己在领域驱动设计咨询与培训中对各种困惑与问题的思考与解答。本课程内容既遵循了领域驱动设计的根本思想,又有自己的独到见解;既给出了权威的领域驱动知识阐释,又解答了在实践领域驱动设计中最让人困惑的问题。

    为什么要学习领域驱动设计

    如果你已经能设计出美丽优良的软件架构,如果你只希望脚踏实地做一名高效编码的程序员,如果你是一位注重用户体验的前端设计人员,如果你负责的软件系统并不复杂,那么,你确实不需要学习领域驱动设计!

    领域驱动设计当然并非“银弹”,自然也不是解决所有疑难杂症的“灵丹妙药”,请事先降低对领域驱动设计的不合现实的期望。我以中肯地态度总结了领域驱动设计可能会给你带来的收获:

    • 领域驱动设计是一套完整而系统的设计方法,它能带给你从战略设计到战术设计的规范过程,使得你的设计思路能够更加清晰,设计过程更加规范。
    • 领域驱动设计尤其善于处理与领域相关的高复杂度业务的产品研发,通过它可以为你的产品建立一个核心而稳定的领域模型内核,有利于领域知识的传递与传承。
    • 领域驱动设计强调团队与领域专家的合作,能够帮助团队建立一个沟通良好的团队组织,构建一致的架构体系。
    • 领域驱动设计强调对架构与模型的精心打磨,尤其善于处理系统架构的演进设计。
    • 领域驱动设计的思想、原则与模式有助于提高团队成员的面向对象设计能力与架构设计能力。
    • 领域驱动设计与微服务架构天生匹配,无论是在新项目中设计微服务架构,还是将系统从单体架构演进到微服务设计,都可以遵循领域驱动设计的架构原则。

    课程寄语

    没有谁能够做到领域驱动设计的一蹴而就,一门课程也不可能穷尽领域驱动设计的方方面面,从知识的学习到知识的掌握,进而达到能力的提升,需要一个漫长的过程。所谓“理论联系实际”虽然是一句耳熟能详的老话,但其中蕴含了颠扑不破的真理。我在进行领域驱动设计培训时,总会有学员希望我能给出数学公式般的设计准则或规范,似乎软件设计就像拼积木一般,只要遵照图示中给出的拼搭过程,不经思考就能拼出期待的模型。——这是不切实际的幻想。

    要掌握领域驱动设计,就不要被它给出的概念所迷惑,而要去思索这些概念背后蕴含的原理,多问一些为什么。同时,要学会运用设计原则去解决问题,而非所谓的“设计规范”。例如:

    • 思考限界上下文边界的划分,实际上还是“高内聚、低耦合”原则的体现,只是我们需要考虑什么内容才是高内聚的,如何抽象才能做到低耦合?
    • 是否需要提取单独的限界上下文?是为了考虑职责的重用,还是为了它能够独立进化以应对未来的变化?
    • 在分层架构中,各层之间该如何协作?如果出现了依赖,该如何解耦?仍然需要从重用与变化的角度去思考设计决策。
    • 为什么同样遵循领域驱动设计,不同的系统会设计出不同的架构?这是因为不同的场景对架构质量的要求并不一样,我们要学会对架构的关注点做优先级排列,从而得出不同的架构决策。

    我强烈建议读者诸君要学会对设计的本质思考,不要只限于对设计概念的掌握,而要追求对设计原则与方法的融汇贯通。只有如此,才能针对不同的业务场景灵活地运用领域驱动设计,而非像一个牵线木偶般遵照着僵硬的过程进行死板地设计。

    分享交流

    我们为本课程付费读者创建了微信交流群,以方便更有针对性地讨论课程相关问题。入群方式请到第 04 课末尾添加小编的微信号,并注明「DDD」。

    阅读文章过程中有任何疑问随时可以跟其他小伙伴讨论,或者直接向作者提问(作者看到后抽空回复)。你的分享不仅帮助他人,更会提升自己。

    点击了解《领域驱动战略设计实践》

    第01课:领域驱动设计概览

    领域驱动设计(Domain Driven Design,DDD)是由 Eric Evans 最早提出的综合软件系统分析和设计的面向对象建模方法,如今已经发展成为了一种针对大型复杂系统的领域建模与分析方法。它完全改变了传统软件开发工程师针对数据库进行的建模方法,从而将要解决的业务概念和业务规则转换为软件系统中的类型以及类型的属性与行为,通过合理运用面向对象的封装、继承和多态等设计要素,降低或隐藏整个系统的业务复杂性,并使得系统具有更好的扩展性,应对纷繁多变的现实业务问题。

    领域驱动设计的开放性

    领域驱动设计是一种方法论(Methodology),根据维基百科的定义,方法论是一套运用到某个研究领域的系统与理论分析方法。领域驱动设计就是针对软件开发领域提出的一套系统与理论分析方法。Eric Evans 在创造性地提出领域驱动设计时,实则是针对当时项目中聚焦在以数据以及数据样式为核心的系统建模方法的批判。面向数据的建模方法是关系数据库理论的延续,关注的是数据表以及数据表之间关系的设计。这是典型的面向技术实现的建模方法,面对日渐复杂的业务逻辑,这种设计方法欠缺灵活性与可扩展性,也无法更好地利用面向对象设计思想及设计模式,建立可重用的、可扩展的代码单元。领域驱动设计的提出,是设计观念的转变,蕴含了全新的设计思想、设计原则与设计过程

    由于领域驱动设计是一套方法论,它建立了以领域为核心驱动力的设计体系,因而具有一定的开放性。在这个体系中,你可以使用不限于领域驱动设计提出的任何一种方法来解决这些问题。例如,可以使用用例(Use Case)、测试驱动开发(TDD)、用户故事(User Story)来帮助我们对领域建立模型;可以引入整洁架构思想及六边形架构,以帮助我们建立一个层次分明、结构清晰的系统架构;还可以引入函数式编程思想,利用纯函数与抽象代数结构的不变性以及函数的组合性来表达领域模型。这些实践方法与模型已经超越了 Eric Evans 最初提出的领域驱动设计范畴,但在体系上却是一脉相承的。这也是为什么在领域驱动设计社区,能够不断诞生新的概念诸如 CQRS 模式、事件溯源(Event Sourcing)模式与事件风暴(Event Storming);领域驱动设计也以开放的心态拥抱微服务(Micro Service),甚至能够将它的设计思想与原则运用到微服务架构设计中。

    领域驱动设计过程

    领域驱动设计当然不是架构方法,也并非设计模式。准确地说,它其实是“一种思维方式,也是一组优先任务,它旨在加速那些必须处理复杂领域的软件项目的开发”。领域驱动设计贯穿了整个软件开发的生命周期,包括对需求的分析、建模、架构、设计,甚至最终的编码实现,乃至对编码的测试与重构。

    领域驱动设计强调领域模型的重要性,并通过模型驱动设计来保障领域模型与程序设计的一致。从业务需求中提炼出统一语言(Ubiquitous Language),再基于统一语言建立领域模型;这个领域模型会指导着程序设计以及编码实现;最后,又通过重构来发现隐式概念,并运用设计模式改进设计与开发质量。这个过程如下图所示:

    enter image description here

    这个过程是一个覆盖软件全生命周期的设计闭环,每个环节的输出都可以作为下一个环节的输入,而在其中扮演重要指导作用的则是“领域模型”。这个设计闭环是一个螺旋式的迭代设计过程,领域模型会在这个迭代过程中逐渐演进,在保证模型完整性与正确性的同时,具有新鲜的活力,使得领域模型能够始终如一的贯穿领域驱动设计过程、阐释着领域逻辑、指导着程序设计、验证着编码质量。

    如果仔细审视这个设计闭环,会发现在针对问题域和业务期望提炼统一语言,并通过统一语言进行领域建模时,可能会面临高复杂度的挑战。这是因为对于一个复杂的软件系统而言,我们要处理的问题域实在太庞大了。在为问题域寻求解决方案时,需要从宏观层次划分不同业务关注点的子领域,然后再深入到子领域中从微观层次对领域进行建模。宏观层次是战略的层面,微观层次是战术的层面,只有将战略设计与战术设计结合起来,才是完整的领域驱动设计。

    战略设计阶段

    领域驱动设计的战略设计阶段是从下面两个方面来考量的:

    • 问题域方面:针对问题域,引入限界上下文(Bounded Context)上下文映射(Context Map)对问题域进行合理的分解,识别出核心领域(Core Domain)子领域(SubDomain),并确定领域的边界以及它们之间的关系,维持模型的完整性。
    • 架构方面:通过分层架构来隔离关注点,尤其是将领域实现独立出来,能够更利于领域模型的单一性与稳定性;引入六边形架构可以清晰地表达领域与技术基础设施的边界;CQRS 模式则分离了查询场景和命令场景,针对不同场景选择使用同步或异步操作,来提高架构的低延迟性与高并发能力。

    Eric Evans 提出战略设计的初衷是要保持模型的完整性。限界上下文的边界可以保护上下文内部和其他上下文之间的领域概念互不冲突。然而,如果我们将领域驱动设计的战略设计模式引入到架构过程中,就会发现限界上下文不仅限于对领域模型的控制,而在于分离关注点之后,使得整个上下文可以成为独立部署的设计单元,这就是“微服务”的概念,上下文映射的诸多模式则对应了微服务之间的协作。因此在战略设计阶段,微服务扩展了领域驱动设计的内容,反过来领域驱动设计又能够保证良好的微服务设计。

    一旦确立了限界上下文的边界,尤其是作为物理边界,则分层架构就不再针对整个软件系统,而仅仅针对粒度更小的限界上下文。此时,限界上下文定义了技术实现的边界,对当前上下文的领域与技术实现进行了封装,我们只需要关心对外暴露的接口与集成方式,形成了在服务层次的设计单元重用。

    边界给了实现限界上下文内部的最大自由度,这也是战略设计在分治上起到的效用,我们可以在不同的限界上下文选择不同的架构模式。例如,针对订单的查询与处理,选择 CQRS 模式来分别处理同步与异步场景;还可以针对核心领域与子领域重要性的不同,分别选择领域模型(Domain Model)和事务脚本(Transaction Script)模式,灵活地平衡开发成本与开发质量。在宏观层面,面对整个软件系统,我们可以采用前后端分离与基于 REST 的微服务架构,保证系统具有一致的架构风格。

    战术设计阶段

    整个软件系统被分解为多个限界上下文(或领域)后,就可以分而治之,对每个限界上下文进行战术设计。领域驱动设计并不牵涉到技术层面的实现细节,在战术层面,它主要应对的是领域的复杂性。领域驱动设计用以表示模型的主要要素包括:

    • 值对象(Value Object)
    • 实体(Entity)
    • 领域服务(Domain Service)
    • 领域事件(Domain Event)
    • 资源库(Repository)
    • 工厂(Factory)
    • 聚合(Aggregate)
    • 应用服务(Application Service)

    Eric Evans 通过下图勾勒出了战术设计诸要素之间的关系:

    enter image description here

    领域驱动设计围绕着领域模型进行设计,通过分层架构(Layered Architecture)将领域独立出来。表示领域模型的对象包括:实体值对象领域服务领域逻辑都应该封装在这些对象中。这一严格的设计原则可以避免业务逻辑渗透到领域层之外,导致技术实现与业务逻辑的混淆。在领域驱动设计的演进中,又引入了领域事件来丰富领域模型。

    聚合是一种边界,它可以封装一到多个实体值对象,并维持该边界范围之内的业务完整性。在聚合中,至少包含一个实体,且只有实体才能作为聚合根(Aggregate Root)。注意,在领域驱动设计中,没有任何一个类是单独的聚合,因为聚合代表的是边界概念,而非领域概念。在极端情况下,一个聚合可能有且只有一个实体。

    工厂资源库都是对领域对象生命周期的管理。前者负责领域对象的创建,往往用于封装复杂或者可能变化的创建逻辑;后者则负责从存放资源的位置(数据库、内存或者其他 Web 资源)获取、添加、删除或者修改领域对象。领域模型中的资源库不应该暴露访问领域对象的技术实现细节。

    演进的领域驱动设计过程

    战略设计会控制和分解战术设计的边界与粒度,战术设计则以实证角度验证领域模型的有效性、完整性与一致性,进而以演进的方式对之前的战略设计阶段进行迭代,从而形成一种螺旋式上升的迭代设计过程,如下图所示:

    enter image description here

    面对客户的业务需求,由领域专家与开发团队展开充分的交流,经过需求分析与知识提炼,以获得清晰的问题域。通过对问题域进行分析和建模,识别限界上下文,利用它划分相对独立的领域,再通过上下文映射建立它们之间的关系,辅以分层架构与六边形架构划分系统的逻辑边界与物理边界,界定领域与技术之间的界限。之后,进入战术设计阶段,深入到限界上下文内对领域进行建模,并以领域模型指导程序设计与编码实现。若在实现过程中,发现领域模型存在重复、错位或缺失时,再进而对已有模型进行重构,甚至重新划分限界上下文。

    两个不同阶段的设计目标是保持一致的,它们是一个连贯的过程,彼此之间又相互指导与规范,并最终保证一个有效的领域模型和一个富有表达力的实现同时演进

    点击了解《领域驱动战略设计实践》

    第02课:深入分析软件的复杂度

    软件复杂度的成因

    Eric Evans 的经典著作《领域驱动设计》的副标题为“软件核心复杂性应对之道”,这说明了 Eric 对领域驱动设计的定位就是应对软件开发的复杂度。Eric 甚至认为:“领域驱动设计只有应用在大型项目上才能产生最大的收益”。他通过 Smart UI 反模式逆向地说明了在软件设计与开发过程中如果出现了如下问题,就应该考虑运用领域驱动设计:

    • 没有对行为的重用,也没有对业务问题的抽象,每当操作用到业务规则时,都要重复这些业务规则。
    • 快速的原型建立和迭代很快会达到其极限,因为抽象的缺乏限制了重构的选择。
    • 复杂的功能很快会让你无所适从,所以程序的扩展只能是增加简单的应用模块,没有很好的办法来实现更丰富的功能。

    因此,选择领域驱动设计,就是要与软件系统的复杂作一番殊死拼搏,以降低软件复杂度为己任。那么,什么才是复杂呢?

    点击了解《领域驱动战略设计实践》

    什么是复杂?

    即使是研究复杂系统的专家,如《复杂》一书的作者 Melanie Mitchell,都认为复杂没有一个明确得到公认的定义。不过,Melanie Mitchell 在接受 Ubiquity 杂志专访时,还是“勉为其难”地给出了一个通俗的复杂系统定义:由大量相互作用的部分组成的系统,与整个系统比起来,这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性的通讯,并且组成部分的相互作用导致了复杂行为。

    这个定义庶几可以表达软件复杂度的特征。定义中的组成部分对于软件系统来说,就是我所谓的“设计单元”,基于粒度的不同可以是函数、对象、模块、组件和服务。这些设计单元相对简单,然而彼此之间的相互作用却导致了软件系统的复杂行为。

    Jurgen Appelo 从理解力与预测能力两个维度分析了复杂系统理论,这两个维度又各自分为不同的复杂层次,其中,理解力维度分为 Simple 与 Comlicated 两个层次,预测能力维度则分为 Ordered、Complex 与 Chaotic 三个层次,如下图所示:

    enter image description here

    参考复杂的含义,Complicated 与 Simple(简单)相对,意指非常难以理解,而 Complex 则介于 Ordered(有序的)与 Chaotic(混沌的)之间,认为在某种程度上可以预测,但会有很多出乎意料的事情发生。显然,对于大多数软件系统而言,系统的功能都是难以理解的;在对未来需求变化的把控上,虽然我们可以遵循一些设计原则来应对可能的变化,但未来的不可预测性使得软件系统的演进仍然存在不可预测的风险。因此,软件系统的所谓“复杂”其实覆盖了 Complicated 与 Complex 两个方面。要理解软件复杂度的成因,就应该结合理解力预测能力这两个因素来帮助我们思考。

    理解力

    在软件系统中,是什么阻碍了开发人员对它的理解?想象团队招入一位新人,就像一位游客来到了一座陌生的城市,他是否会迷失在阡陌交错的城市交通体系中,不辨方向?倘若这座城市实则是乡野郊外的一座村落,不过只有房屋数间,一条街道连通城市的两头,还会疑生出迷失之感吗?

    因而,影响理解力的第一要素是规模

    规模

    软件的需求决定了系统的规模。当需求呈现线性增长的趋势时,为了实现这些功能,软件规模也会以近似的速度增长。由于需求不可能做到完全独立,导致出现相互影响相互依赖的关系,修改一处就会牵一发而动全身。就好似城市的一条道路因为施工需要临时关闭,此路不通,通行的车辆只能改道绕行,这又导致了其他原本已经饱和的道路,因为涌入更多车辆,超出道路的负载从而变得更加拥堵,这种拥堵现象又会顺势向这些道路的其他分叉道路蔓延,形成一种辐射效应的拥堵现象。

    软件开发的拥堵现象或许更严重:

    • 函数存在副作用,调用时可能对函数的结果作了隐含的假设;
    • 类的职责繁多,不敢轻易修改,因为不知这种变化会影响到哪些模块;
    • 热点代码被频繁变更,职责被包裹了一层又一层,没有清晰的边界;
    • 在系统某个角落,隐藏着伺机而动的 bug,当诱发条件具备时,则会让整条调用链瘫痪;
    • 不同的业务场景包含了不同的例外场景,每种例外场景的处理方式都各不相同;
    • 同步处理与异步处理代码纠缠在一起,不可预知程序执行的顺序。

    当需求增多时,软件系统的规模也会增大,且这种增长趋势并非线性增长,会更加陡峭。倘若需求还产生了事先未曾预料到的变化,我们又没有足够的风险应对措施,在时间紧迫的情况下,难免会对设计做出妥协,头疼医头、脚疼医脚,在系统的各个地方打上补丁,从而欠下技术债(Technical Debt)。当技术债务越欠越多,累计到某个临界点时,就会由量变引起质变,整个软件系统的复杂度达到巅峰,步入衰亡的老年期,成为“可怕”的遗留系统。正如饲养场的“奶牛规则”:奶牛逐渐衰老,最终无奶可挤;然而与此同时,饲养成本却在上升。

    结构

    不知大家是否去过迷宫?相似而回旋繁复的结构使得本来封闭狭小的空间被魔法般地扩展为一个无限的空间,变得无穷大,仿佛这空间被安置了一个循环,倘若没有找到正确的退出条件,循环就会无休无止,永远无法退出。许多规模较小却格外复杂的软件系统,就好似这样的一座迷宫。

    此时,结构成了决定系统复杂度的关键因素。

    结构之所以变得复杂,在多数情况下还是因为系统的质量属性决定的。例如,我们需要满足高性能、高并发的需求,就需要考虑在系统中引入缓存、并行处理、CDN、异步消息以及支持分区的可伸缩结构。倘若我们需要支持对海量数据的高效分析,就得考虑这些海量数据该如何分布存储,并如何有效地利用各个节点的内存与 CPU 资源执行运算。

    从系统结构的视角看,单体架构一定比微服务架构更简单,更便于掌控,正如单细胞生物比人体的生理结构要简单数百倍;那么,为何还有这么多软件组织开始清算自己的软件资产,花费大量人力物力对现有的单体架构进行重构,走向微服务化?究其主因,不还是系统的质量属性在作祟吗?

    纵观软件设计的历史,不是分久必合、合久必分,而是不断拆分、继续拆分、持续拆分的微型化过程。分解的软件元素不可能单兵作战,怎么协同、怎么通信,就成为了系统分解后面临的主要问题。如果没有控制好,这些问题固有的复杂度甚至会在某些场景下超过因为分解给我们带来的收益。

    无论是优雅的设计,还是拙劣的设计,都可能因为某种设计权衡而导致系统结构变得复杂。唯一的区别在于前者是主动地控制结构的复杂度,而后者带来的复杂度是偶发的,是错误的滋生,是一种技术债,它可能会随着系统规模的增大而导致一种无序设计

    在 Pete Goodliffe 讲述的《两个系统的故事:现代软件神话》中详细地罗列了无序设计系统的几种警告信号:

    • 代码没有显而易见的进入系统中的路径;
    • 不存在一致性、不存在风格、也没有统一的概念能够将不同的部分组织在一起;
    • 系统中的控制流让人觉得不舒服,无法预测;
    • 系统中有太多的“坏味道”,整个代码库散发着腐烂的气味儿,是在大热天里散发着刺激气体的一个垃圾堆;
    • 数据很少放在使用它的地方,经常引入额外的巴罗克式缓存层,目的是试图让数据停留在更方便的地方。

    我们看一个无序设计的软件系统,就好像隔着一层半透明的玻璃观察事物一般,系统中的软件元素都变得模糊不清,充斥着各种技术债。细节层面,代码污浊不堪,违背了“高内聚、松耦合”的设计原则,导致许多代码要么放错了位置,要么出现重复的代码块;架构层面,缺乏清晰的边界,各种通信与调用依赖纠缠在一起,同一问题域的解决方案各式各样,让人眼花缭乱,仿佛进入了没有规则的无序社会。

    预测能力

    当我们掌握了事物发展的客观规律时,我们就具有了一定的对未来的预测能力。例如,我们洞察了万有引力的本质,就可以对我们能够观察到的宇宙天体建立模型,较准确地推测出各个天体在未来一段时间的运行轨迹。然而,宇宙空间变化莫测,或许因为一个星球的死亡产生黑洞的吸噬能力,就可能导致那一片星域产生剧烈的动荡,这种动荡会传递到更远的星空,从而干扰了我们的预测。坦白说,我们现在连自己居住的地球天气都不能做一个准确的预测呢。之所以如此,正是因为未知的变化的产生。

    变化

    未来总会出现不可预测的变化,这种不可预测性带来的复杂度,使得我们产生畏惧,因为我们不知道何时会发生变化,变化的方向又会走向哪里,这就导致心理滋生一种仿若失重一般的感觉。变化让事物失去控制,受到事物牵扯的我们会感到惶恐不安。

    在设计软件系统时,变化让我们患得患失,不知道如何把握系统设计的度。若拒绝对变化做出理智的预测,系统的设计会变得僵化,一旦变化发生,修改的成本会非常的大;若过于看重变化产生的影响,渴望涵盖一切变化的可能,一旦预期的变化不曾发生,我们之前为变化付出的成本就再也补偿不回来了。这就是所谓的“过度设计”。

    从需求的角度讲,变化可能来自业务需求,也可能来自质量属性。以对系统架构的影响而言,尤以后者为甚,因为它可能牵涉到整个基础架构的变更。George Fairbanks在《恰如其分的软件架构》一书中介绍了邮件托管服务公司 RackSpace 的日志架构变迁,业务功能没有任何变化,却因为邮件数量的持续增长,为满足性能需求,架构经历了三个完全不同系统的变迁:从最初的本地日志文件,到中央数据库,再到基于 HDFS 的分布式存储,整个系统几乎发生了颠覆性的变化。这并非 RackSpace 的设计师欠缺设计能力,而是在公司草创之初,他们没有能够高瞻远瞩地预见到客户数量的增长,导致日志数据增多,以至于超出了已有系统支持的能力范围。俗话说:“事后诸葛亮”,当我们在对一个软件系统的架构设计进行复盘时,总会发现许多设计决策是如此的愚昧。殊不知这并非愚昧,而是在设计当初,我们手中掌握的筹码不足以让自己赢下这场面对未来的战争罢了。

    这就是变化之殇!

    如果将软件系统中我们自己开发的部分都划归为需求的范畴,那么还有一种变化,则是因为我们依赖的第三方库、框架或平台、甚至语言版本的变化带来的连锁反应。例如,作为 Java 开发人员,一定更垂涎于 Lambda 表达式的简洁与抽象,又或者 Jigsaw 提供的模块定义能力,然而现实是我们看到多数的企业软件系统依旧在 Java 6 或者 Java 7 中裹足不前。

    这还算是幸运的例子,因为我们尽可以满足这种故步自封,由于情况并没有到必须变化的境地。当我们依赖的第三方有让我们不得不改变的理由时,难道我们还能拒绝变化吗?

    许多软件在版本变迁过程中都尽量考虑到 API 变化对调用者带来的影响,因而尽可能保持版本向后兼容。我亲自参与过系统从 Spring 2.0 到 4.0 的升级,Spark 从 1.3.1 到 1.5 再到 1.6 的升级,感谢这些框架或平台设计人员对兼容性的体贴照顾,使得我们的升级成本能够被降到最低;但是在升级之后,倘若没有对系统做全方位的回归测试,我们的内心始终是惴惴不安的。

    对第三方的依赖看似简单,殊不知我们所依赖的库、平台或者框架又可能依赖了若干对于它们而言又份属第三方的更多库、平台和框架。每回初次构建软件系统时,我都为漫长等待的依赖下载过程而感觉烦躁不安。多种版本共存时可能带来的所谓依赖地狱,只要亲身经历过,就没有不感到不寒而栗的。倘若你运气欠佳,可能还会有各种古怪问题接踵而来,让你应接不暇、疲于奔命。

    如果变化是不可预测的,那么软件系统也会变得不可预测。一方面我们要尽可能地控制变化,至少要将变化产生的影响限制在较小的空间范围内;另一方面又要保证系统不会因为满足可扩展性而变得更加复杂,最后背上过度设计的坏名声。软件设计者们就像走在高空钢缆的技巧挑战者,惊险地调整重心以维持行动的平衡。故而,变化之难,在于如何平衡。

    点击了解《领域驱动战略设计实践》

    第03课:控制软件复杂度的原则

    虽然说认识到软件系统的复杂本性,并不足以让我们应对其复杂,并寻找到简化系统的解决之道;然而,如果我们连导致软件复杂度的本源都茫然不知,又怎么谈得上控制复杂呢?既然我们认为导致软件系统变得复杂的成因是规模结构变化三要素,则控制复杂度的原则就需要对它们进行各个击破。

    点击了解《领域驱动战略设计实践》

    分而治之、控制规模

    针对规模带来的复杂度,我们应注意克制做大、做全的贪婪野心,尽力保证系统的小规模。简单说来,就是分而治之的思想,遵循小即是美的设计美学。

    丹尼斯·里奇(Dennis MacAlistair Ritchie)从大型项目 Multics 的失败中总结出 KISS(Keep it Simple Stupid)原则,基于此原则,他将 Unix 设计为由许多小程序组成的整体系统,每个小程序只能完成一个功能,任何复杂的操作都必须分解成一些基本步骤,由这些小程序逐一完成,再组合起来得到最终结果。从表面上看,运行一连串小程序很低效,但是事实证明,由于小程序之间可以像积木一样自由组合,所以非常灵活,能够轻易完成大量意想不到的任务。而且,计算机硬件的升级速度非常快,所以性能也不是一个问题;另一方面,当把大程序分解成单一目的的小程序,开发会变得很容易。

    Unix 的这种设计哲学被 Doug McIlroy、Elliot Pinson 和 Berk Tague 总结为以下两条:

    • Make each program do one thing well. To do a new job, build a fresh rather than complicate old programs by adding new “features.”
    • Expect the output of every program to become the input to another, as yet unknown, program.

    这两条原则是相辅相成的。第一条原则要求一个程序只做一件事情,符合“单一职责原则”,在应对新需求时,不会直接去修改一个复杂的旧系统,而是通过添加新特性,然后对这些特性进行组合。要满足小程序之间的自由组合,就需要满足第二条原则,即每个程序的输入和输出都是统一的,因而形成一个统一接口(Uniform Interface),以支持程序之间的自由组合(Composability)。利用统一接口,既能够解耦每个程序,又能够组合这些程序,还提高了这些小程序的重用性,这种“统一接口”,其实就是架构一致性的体现。

    保持结构的清晰与一致

    所有设计质量高的软件系统都有相同的特征,就是拥有清晰直观且易于理解的结构。

    Robert Martin 分析了这么多年诸多设计大师提出的各种系统架构风格与模式,包括 Alistair Cockburn 提出的六边形架构(Hexagonal Architecture),Jeffrey Palermo 提出的洋葱架构(Onion Architecture),James Coplien 与 Trygve Reenskaug 提出的 DCI 架构,Ivar Jacobson 提出的 BCE 设计方法。结果,他认为这些方法的共同特征都遵循了“关注点分离”架构原则,由此提出了整洁架构的思想。

    整洁架构提出了一个可测试的模型,无需依赖于任何基础设施就可以对它进行测试,只需通过边界对象发送和接收对应的数据结构即可。它们都遵循稳定依赖原则,不对变化或易于变化的事物形成依赖。整洁架构模型让外部易变的部分依赖于更加稳定的领域模型,从而保证了核心的领域模型不会受到外部的影响。典型的整洁架构如下图所示:

    enter image description here

    整洁架构的目的在于识别整个架构不同视角以及不同抽象层次的关注点,并为这些关注点划分不同层次的边界,从而使得整个架构变得更为清晰,以减少不必要的耦合。要做到这一点,则需要合理地进行职责分配,良好的封装与抽象,并在约束的指导下为架构建立一致的风格,这是许多良好系统的设计特征。

    拥抱变化

    变化对软件系统带来的影响可以说是无解,然而我们不能因此而消极颓废,套用 Kent Beck 的话来说,我们必须“拥抱变化”。除了在开发过程中,我们应尽可能做到敏捷与快速迭代,以此来抵消变化带来的影响;在架构设计层面,我们还可以分析哪些架构质量属性与变化有关,这些质量属性包括:

    • 可进化性(Evolvability)
    • 可扩展性(Extensibility)
    • 可定制性(Customizability)

    要保证系统的可进化性,可以划分设计单元的边界,以确定每个设计单元应该履行的职责以及需要与其他设计单元协作的接口。这些设计单元具有不同的设计粒度,包括函数、对象、模块、组件及服务。由于每个设计单元都有自己的边界,边界内的实现细节不会影响到外部的其他设计单元,我们就可以非常容易地替换单元内部的实现细节,保证了它们的可进化性。

    要满足系统的可扩展性,首先要学会识别软件系统中的变化点(热点),常见的变化点包括业务规则、算法策略、外部服务、硬件支持、命令请求、协议标准、数据格式、业务流程、系统配置、界面表现等。处理这些变化点的核心就是“封装”,通过隐藏细节、引入间接等方式来隔离变化、降低耦合。一些常见的架构风格,如基于事件的集成、管道—过滤器等的引入,都可以在一定程度上提高系统可扩展性。

    可定制性意味着可以提供特别的功能与服务。Fielding 在《架构风格与基于网络的软件架构设计》提到:“支持可定制性的风格也可能会提高简单性和可扩展性”。在 SaaS 风格的系统架构中,我们常常通过引入元数据(Metadata)来支持系统的可定制。插件模式也是满足可定制性的常见做法,它通过提供统一的插件接口,使得用户可以在系统之外按照指定接口编写插件来扩展定制化的功能。

    点击了解《领域驱动战略设计实践》

    第04课:领域驱动设计对软件复杂度的应对(上)
    第05课:领域驱动设计对软件复杂度的应对(下)
    第06课:软件开发团队的沟通与协作
    第07课:【案例】版本升级系统的先启阶段
    第08课:运用领域场景分析提炼领域知识(上)
    第09课:运用领域场景分析提炼领域知识(下)
    第10课:建立统一语言
    第11课:理解限界上下文
    第12课:限界上下文的控制力(上)
    第13课:限界上下文的控制力(下)
    第14课:识别限界上下文(上)
    第15课:识别限界上下文(下)
    第16课:理解上下文映射
    第17课:上下文映射的团队协作模式
    第18课:上下文映射的通信集成模式
    第19课:辨别限界上下文的协作关系(上)
    第20课:辨别限界上下文的协作关系(下)
    第21课:认识分层架构
    第22课:分层架构的演化
    第23课:领域驱动架构的演进
    第24课:【案例】层次的职责与协作关系(图文篇)
    第25课:限界上下文与架构
    第26课:限界上下文对架构的影响
    第27课:领域驱动设计的代码模型
    第28课:代码模型的架构决策
    第29课:【实践】先启阶段的需求分析
    第30课:【实践】先启阶段的领域场景分析(上)
    第31课:【实践】先启阶段的领域场景分析(下)
    第32课:【实践】识别限界上下文
    第33课:【实践】确定限界上下文的协作关系
    第34课:【实践】EAS 的整体架构

    阅读全文: http://gitbook.cn/gitchat/column/5b3235082ab5224deb750e02

    展开全文
  • 本试验只初学者掌握单片机驱动步进电机的原理,其硬件配置只做短时间试验演示不可持续过长时间,不可实际中使用。
  • 机器人驱动介绍

    万次阅读 2016-11-16 14:14:21
    电气驱动具有无环境污染、易于控制、运动精度高、成本低、驱动效率高等优点,应用最为广泛,电气驱动可分为步进电机驱动、直流伺服电机驱动、交流伺服电机驱动、直线电动机驱动。交流伺服电机驱动具有大的转矩质量比...

    电气驱动
    电气驱动是利用各种电动机产生的力或力矩,直接或经过减速机构去驱动机器人的关节,以获得要求的位置、速度和加速度。电气驱动具有无环境污染、易于控制、运动精度高、成本低、驱动效率高等优点,应用最为广泛,电气驱动可分为步进电机驱动、直流伺服电机驱动、交流伺服电机驱动、直线电动机驱动。交流伺服电机驱动具有大的转矩质量比和转矩体积比,没有直流打击的电刷和整流子,因而可靠性高,运行时几乎不需要维护,可用在防爆场合,因此在现代机器人中广泛应用。

    1.电气驱动
    电气驱动是利用各种电动机产生的力或力矩,直接或经过减速机构去驱动机器人的关节,以获得要求的位置、速度和加速度。电气驱动具有无环境污染、易于控制、运动精度高、成本低、驱动效率高等优点,应用最为广泛,电气驱动可分为步进电机驱动、直流伺服电机驱动、交流伺服电机驱动、直线电动机驱动。交流伺服电机驱动具有大的转矩质量比和转矩体积比,没有直流打击的电刷和整流子,因而可靠性高,运行时几乎不需要维护,可用在防爆场合,因此在现代机器人中广泛应用。

    2.步进电动机
    步进电动机是一种用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的控制电动机。由于步进电动机的步距或转速,不受电压波动和负载变化的影响,不受环境条件的限制,仅与脉冲频率同步,能按控制脉冲的要求立即启动、停止、反转或改变转速,它每一转都有固定的步数,在不丢步的情况下运行时,步距误差不会长期积累,因此,它不仅在闭环系统中作控制元件,而且在程序控制系统中作开发控制和传动元件用时能大大简化系统。 
     
    步进电机种类繁多,但通常为以下三种: 

    ① 永磁式步进电动机 它是一种由永磁体建立励磁磁场的步进电动机,也称永磁转子型步进电动机。其缺点是步距大,启动频率低;其优点是控制功率小,在断电情况下有定位转矩。步进电动机可以制成多相,通常有一相、两相和三相。




    工作原理: 
      
    如图5-17所示。转子为一对极或几对级的星型磁钢,定子上有两相或多相绕组,定子每相的轴线相对于转子的轴线,这类电动机要求电源提供正负脉冲。 
      
    当定子绕组A相正向通电时,在定子A相的A(1)、A(3)端产生S极,而A(2)、A(4)产生N极,由磁极性质,转子位于图5-17(a)的位置上;当A相断电B正向通电时,定子B向的B(1)、B(3)端产生S极,而B(2)、B(4)产生N极,转子顺时针旋转45°至图5-17(b)位置;当B相断电,A相负向通电时,定子A相的A(1)、A(3)端产生N极,而A(2)、A(4)产生S极,转子再顺时针转45°至图5-17(c)位置;当A相断电B相负向通电时,定子B相的B(1)、B(3)端产生N极,而B(2)、B(4)产生S极,转子再顺时针旋转45°至图5-17(d)位置。 

    依次按上述A→B→A→B单四拍方式通电,转子便连续旋转,也可按双四拍的方式AB→BA→AB→BA通电,步距角均为45°,若按A→AB→B→BA…八拍方式通电,则旋转步距为角为22.5°。
       
    要减小步距角,可以增加转子的磁极数及定子的齿数, 但转子要制成N-S相间的多对磁极是很困难的,同时,定子级数及绕组线圈数也必须相应的增加,这将受到定子空间的限制,因此永磁式步进电动机的步距角都较大。 
     
    ② 反应式步进电动机 它是一种定、转子磁场均由软磁材料制成,只有控制绕组,基于磁导的变化产生反应转矩的步进电动机,又称为变磁阻步进电动机。它的结构按绕组的顺序可分为径向分相和轴向分相。按铁芯分段,则有单段式和多段式。



    ③ 永磁感应子式步进电动机 它的定子结构与反应式步进电机相同,而转子由环形磁钢和两段铁芯组成,它与反应式步进电机一样,可以使其具有小步距和较高的启动频率,同时又有永磁式步进电动机控制功率小的优点。其缺点是由于采用的磁钢分成两段,致使制造工艺和结构比反应式步进电动机复杂。
    3.直流伺服电动机及其控制 
    直流伺服电动机是用直流供电的电动机。其功能是将输入的受控电压/电流能量转换为电枢轴上的角位移或角速度输出。其结构如图5-24所示,它由定子、转子(电枢)、换向器和机壳组成。定子的作用是产生磁场,转子由铁芯、线圈组成,用于产生电磁转矩;换向器由整流子、电刷组成,用于改变电枢线圈的电流方向,保证电枢在磁场作用下连续旋转。


    直流电动机的特点 

    稳定性好,它具有较好的机械性,能在较宽的速度范围内运行。 

    可控性好。它具有线性调节的特性,能使转速正比于控制电压的大小;转向取决于控制电压的极性(或相位);控制电压为零时,转子惯性很小,能立即停止。 

    相应迅速。它具有较大的启动转矩和较小的转动惯量,在控制信号增加、减小或消失的瞬间,能快速启动、增速、减速及停止。 

    控制功率低,损耗小。 

    转矩大。直流伺服电动机广泛应用在宽调速系统和精确位置控制系统中,其输出功率为1-600W,电压有6V、9V、12V、24V、27V、48V、110V、220V等,转速可达1500-1600r/min。
    直流电动机的控制 

    直流伺服电动机用直流供电,为调节电动机转速和分享需要对其直流电压的大小和方向进行控制。目前常用晶体管脉宽调速驱动和可控硅直流调速驱动两种方式。可控硅直流驱动,主要通过调节触发装置控制可控硅的导通角(控制电压的大小)来移动触发脉冲的相位,从而改变整流电压的大小,使直流电动机电枢电压的变化易于平滑调速。由于可控硅本身的工作原理和电源的特点,导通后是利用交流(50Hz)过零来关闭的,因此在低整流电压时,其输出时很小的尖峰值的平均值,从而造成电流的不连续性。而采用脉宽调速驱动系统,其开关频率高,赐福机构能够相应频带范围也比较宽。与可控硅相比,其输出电流脉动非常小,接近于纯直流。
    4.交流伺服电动机及其控制
    交流伺服电动机分为两种,同步型和感应型

    (1)同步型(SM)采用永磁结构的同步电动机,又称为无刷直流伺服电动机。其特点为: 
    ① 无接触换向部件 
    ② 需要磁极位置检测器(如编码器)。
     ③ 具有直流伺服电动机的全部优点 
    (2)感应型(LM)指笼型感应电动机。
    其特点为: ① 对定子电流的激励分量和转矩分量分别控制; ② 具有直流伺服电动机的全部优点。 

    交流伺服电机控制方法 

    (1)异步电动机转速的基本关系式:
    n=60f(1-s)/p=n0(1-s)=-=- 
    式中n-电动机转速      f-电源电压频率      p-电动机磁极对数 
    n0=60f/p   电动机定子旋转磁场转速或称同步转速 
    S=(n0-n)/n0  转差率 

    可见:改变异步电动机转速的方法有三种: 
      改变磁极对数p调速,一般所见的交流电动机磁极对数不能改变,磁极对数可变的交流电动机成为多速电动机。通常,磁极对数设计成4/2, 8/4, 6/4, 8/6/4等几种。显然磁极对数只能成对改变,转速只能成倍改变,速度不可能平滑调节。 
       改变转差率S调速。此办法只适用于绕线式异步电动机,在转子绕组回路中串入电阻使电动机进机械特性变软,转差率增大。串入电阻越大,转速越低,调速范围通常为3:1.  
    改变频率f调速。如果电源频率能平滑调节,那么速度也就可能平滑改变。目前,高性能的调速系统大都采用这种方法,设计了专门为电动机供电的变频器VFD。  
       
    变频调速器
    5.直线电动机 
    目前直线电动机主要应用的机型有直线感应电动机、直线直流电动机和直线步进电动机三种。 
    直线感应电动机

    与旋转电动机相比,直线电动机传动主要有以下优点: 
       
    直线电动机由于不需要中间传动机械,因而使整个机械得到简化,提高了精度,减少了振动和噪声。 l 快速响应。用直线电动机驱动时,由于不存在中间传动机构惯量和阻力矩的影响,因而加速和减速时间短,可实现快速启动和正反向运行。 
      
    仪表用的直线电动机,可省去电刷和换向器等易损零件,提高可靠性,延长寿命。 
      
    直线电动机由于散热面积大,容易冷却,所以允许较高的电磁负荷,可提高电动机的容量定额。
      
    装配灵活性大,可将电动机和其他机件合成一体。 (1)直线感应电动机(LIM)


    直线感应电动机可以看做是由普通的旋转感应电动机直接演变而来的。图5-28(a)表示一台旋转的感应电动机,设想将它沿径向剖开,并将定、转子沿圆周方向展出直线,如图5-28(b),这就得到了最简单的平板型直线感应电动机。由定子演变而来的一侧称为初级,由转子演变而来的一侧称作次级。直线电动机的运动方式可以是固定初级,让次级运动,此称为动次级;相反,也可以固定次级而让初级运动,则称为动初级。 

      图5-29中直线电动机的初级和次级长度是不等的。因为初、次级要作相对运动,假定在开始时初、次级正好对齐,那么在运动过程中,初、次级之间的电磁耦合部分将逐渐减少,影响正常运行。因此在实际应用中,必须把初次级作的不等。其他几种形式:


    直线直流电动机 

     直线直流电动机(LDM)主要有两种类型:永磁式和电磁式。永磁式推力小,但运行平稳,多用在音频线圈和功率较小的自动记录仪表中,如记录仪中笔的纵横走向的驱动,摄影中快门和光圈的操作机构,电表试验中探测头,电梯门控制器的驱动等;电磁式驱动功率较大,但运动平稳性不好,一般用于驱动功率较大的场合。 
      作为LDM,以永磁式、长行程的直线直流无刷电动机(LDBLM)为代表,如图5-34所示。


    当需要功率较大时,上述直线电动机中的永久磁铁所产生的磁通可改为由绕组通入直流电励磁所产生,这就称为电磁式直线直流电动机。如图5-35所示。


    直线步进电动机 

    直线步进电动机如图5-36所示,定子用磁铁材料制成,称其为定尺。其上开有矩形齿槽,槽中填充非磁性材料,使整个定子表面非常光滑。动子上装有两块永久磁钢A和B,每一磁极端部装有用磁铁材料制成的P形极片。每块极片有两个齿(如a和c),齿距为1.5t,这样当齿a与定子齿对齐时,齿c便对准槽。同一磁钢的两个极片间隔的距离刚好使齿a与a’能同时对准定子的齿,即它们的间隔是加kt,k代表任意整数。 
      磁钢B与A相同,但极性相反,它们之间距离等于(k±1/4)t。这样,当其中一个磁钢的齿完全与定子齿和槽对齐时,另一磁钢的齿则应处在定子的齿和槽的中间。
       
    在磁钢A和B的两个P形极片上分别装有控制绕组。如果某一瞬间,A相绕组中通入直流电流Ai,并假定箭头指向左边的电流为正向,如图5-36(a)所示。这时A相绕组所产生的磁通在赤a、a’中与永久磁钢的磁通相叠加,而在赤c、c’中却相抵消,使齿c、c’全部去磁,不起任何作用。在这过程中B相绕组不同电流,即ib=0,磁钢B的磁通量在齿d、d’和b、b’中大致相等,沿着动子移动方向各齿产生的作用力互相平衡。 
    概况说来,这时只有齿a、a’起作用,它使动子处在如图5-36(a)的位置,为了使动子向右移动,这就是说从图5-36(a)移动到图5-36(b)的位置,就要切断加在A相绕组的电源,使ia=0,同时给B相肉阿祖通入正向电流ib。这时在齿b和b’中,B相绕组产生的磁通与磁钢的磁通相叠加,而在齿d、d’却相抵消。因而,动子便向右移动半个齿宽即t/4,使齿b和b’移动到与定子齿相对齐的位置。如果切断电流Bi并给A相绕组通上反向电流,则A相绕组及磁钢上产生的磁通在c、c’中相叠加,而在d、d’中相抵消。动子便又向右移动t/4,使齿c、c’与定子齿相对齐,见图5-36(c)。    
     
    同理,如切断电流ia,给B相绕组通上反向电流,动子又向右移动t/4,使齿d和d¢与定子齿对齐,见图5-36(d)。这样,经过图5-36(a)、(b)、(c)、(d)所示的4各阶段后,动子便向右移动了一个齿距t,如果还需要移动,只需要重复前面的次序通电即可。  
       
    反之亦然。

    电液伺服系统驱动
    电液伺服系统通过电气传动方式,将电气信号输入系统来操纵有关的液压控制元件动作,控制液压执行元件使其跟随输入信号而动作。这类伺服系统中电液两部分之间都采用电液伺服阀作为转换元件。电液伺服系统根据物理量的不同可分为位置控制、速度控制、压力控制和电液伺服控制。
    1.电液伺服系统驱动  
    电液伺服系统通过电气传动方式,将电气信号输入系统来操纵有关的液压控制元件动作,控制液压执行元件使其跟随输入信号而动作。这类伺服系统中电液两部分之间都采用电液伺服阀作为转换元件。电液伺服系统根据物理量的不同可分为位置控制、速度控制、压力控制和电液伺服控制。 
      
    图5-1所示为机械手手臂伸缩电液伺服系统原理图。它由电液伺服阀1,液压缸2,活塞杆带动的机械手臂3、电位器4,步进电机5、齿轮齿条6和放大器7等元件组成。当数字控制部分发出一定数量的脉冲信号时,步进电动机带动电位器4的动触头转过一定的角度,使动触头偏移电位器中位,产生微弱电压信号,该信号经放大器7放大后输入电液伺服阀1的控制线圈,是伺服阀产生一定的开口量,假设此时压力油经伺服阀进入液压缸左腔,推动活塞连同机械手手臂上的齿条相啮合,手臂向右移动时,电位器跟着作顺时针方向旋转。当电位器的中位和动触头重合时,动触头输出的电压为零,电液伺服阀失去信号,阀口关闭,手臂停止运动,手臂的行程决定于脉冲的数量,速度决定于脉冲的频率。当数字控制部分反向发出脉冲时,步进电机向反方向转动。手臂便向左移动。由于机械手手臂移动的距离与输入电位器的转角成比例,机械手手臂完全跟随输入电位器的转动而产生相应的位移,所以它是一个带有反馈的位置控制电液伺服系统。


    2.液压伺服驱动系统
    液压伺服驱动系统由液压源、驱动器、伺服阀、传感器和控制回路组成。 
      
    如图5-2所示。液压泵将压力油供到伺服阀,给定位置指令值与位置传感器的实测值之差经放大器放大后送到伺服阀。当信号输入到伺服阀时,压力油被供到驱动器并驱动载荷。当反馈信号与输入指令值相同,驱动器便停止。伺服阀在液压伺服系统中是不可缺少的一部分,它利用电信号实现液压系统的能量控制。在响应快、载荷大的私服系统中往往采用液压驱动器,原因在于液压驱动器的输出力与重量比最大。 
      
    电液伺服阀是电液伺服系统中的放大转换元件,它把输入的小功率电流信号,转换并放大成液压功率输出,实现执行元件的位移、速度、加速度及力的控制。


    电液伺服阀的构成 

    电液伺服阀通常由电气®机械转换装置、液压放大器和反馈(平衡)机构三部分组成。电气机械转换装置用来将输入的电信号转换为转角或直线位移输出。输出转角的装置称为力矩马达,输出直线位移的这装置称为力马达。 
      
    液压放大器接受小功率的电气®机械转换装置输入的转角或直线位移信号,对大功率的压力油进行那个调节和分配,实现控制功率的转换和放大。反馈和平衡机构是电液伺服阀输出的流量或压力获得与输入信号成比例的特性。 
    电液伺服阀的工作原理 

     图5-3为喷嘴挡板式电液伺服阀的工作原理。图中上半部分为力矩马达,下半部分为前置级(喷嘴挡板)和主滑阀。当没有电流信号输入时,力矩马达无力矩输出,与衔铁5固定在一起的挡板9处于中位,主滑阀阀芯亦处于中(零)位。液压泵输出的油液以及压力Ps进入主滑阀阀口,因阀芯两端台肩将阀口关闭,油液不能进入A,B口,但经过固定节流孔10和13分别引到喷嘴8和7,经喷射后液流流回油箱。由于挡板处于中位,两喷嘴与挡板的间隙相等,因而油液流经喷嘴的液阻相等,则喷嘴前的压力1p与2p相等,主滑阀的阀芯两端压力相等,阀芯处于中位。若线圈输入电流,控制线圈中将产生磁通,使衔铁上产生磁力矩。当磁力矩为顺时针方向时,衔铁连同挡板一起绕弹簧管中的支点顺时针偏转。图5-3中左喷嘴8的间隙减小、右喷嘴7的间隙增大,即压力1p增大,2p减小,主滑阀阀芯在两端压力差的作用下向右运动,开启阀口,sp与B相通,A与T相通,在主滑阀阀芯向右运动的同时,通过挡板下边的弹簧杆11的反馈作用使挡板向逆时针方向偏转,使做喷嘴8的间隙增大,右喷嘴7的间隙减小,于是压力1p减小,2p增大。当主滑阀阀芯向右移动到某一位置,由两端压力差1p-2p形成的液压力通过反馈弹簧杆作用在挡板上的力矩、喷嘴液流压力作用在挡板上的力矩以及弹簧管的反力矩之和与力矩马达产生的电磁力矩相等时,主滑阀阀芯受力平衡,稳定在一定的开口下工作。 

      

    显然,可以改变输入电流的大小,可成比例地调节电磁力矩,从而得到不同的主阀开口大小。若改变输入电流方向,主滑阀阀芯反向位移,可实现液流的反向控制。图5-3中主滑阀阀芯的最终工作位置是通过挡板弹性反力反馈作用达到平衡的,因此称之为力反馈式。除力反馈之外还有位置反馈、负载流量反馈、负载压力反馈等。



    3.电液比例控制
    电液比例控制是介于普通液压阀的开关控制和电液伺服控制之间的控制方式。它能实现对液流压力和流量连续地、按比例的跟随控制信号而变化。因此,因此它的控制性能优于开关控制,它与电液伺服控制相比,其控制精度和相应速度较低。因为它的核心元件是电液比例阀,所以简称比例阀。 
      
    图5-4所示为一直弄个电液比例压力阀的结构示意图。它由压力阀1和马达2两部分组成,当力马达的线圈通入电流I时,推杆3通过钢球4.弹簧5把电磁推力传给锥阀6.推力的大小与电流I成正比,当阀进油口P处的压力油作用在锥阀上的力,油液通过阀口由出油口排出,这个阀的阀口开度是不影响电磁推力的,但当通过阀口的流量变化时,由于阀座上的小孔d处压差的改变以及稳态液动力的变化等,被控制的油液压力依然有一些改变。


    4.电液比例换向阀
    电液比例换向阀一般由电液比例减压阀和液动换向阀组合而成,前者作为先导级以其出口压力来控制液动换向阀的正反向开口量的大小,从而控制液流方向和流量的大小,电液比例换向阀的工作原理如图5-5所示,先导级电液比例减压阀由两个比例电磁铁2、4和阀芯3组成,经通道a、b反馈至阀芯3的右端,与电磁铁2的电磁力平衡。因而减压后的压力与供油压力大小无关,而只与输入电流信号的大小成比例。减压后的油液经通道a、c作用在换向阀阀芯5的右端,使阀芯左移,打开A与B的连通阀口并压缩左端的弹簧,阀芯5的移动量与控制油压的大小成正比,即阀口的开口大小与输入电流信号成正比。如输入电流信号给比例电磁铁4,则相应地打开P与A的连通阀口,通过阀口输出的流量与阀口开口大小以及阀口前后压差有关,即输出流量受到外界载荷大小的影响,当阀口前后压差不变时,则输出流量与输入的电流信号大小成比例。


    液动换向阀的端盖上装有节流阀调节螺钉1和6,可以根据需要分别调节换向阀的换向时间,此外,这种换向阀也和普通换向阀一样,可以具有不同的中位机能。
    5.摆动缸
    摆动式液压缸也称为摆动液压马达。当它通入压力油是,它的主轴能输出小于360°的摆动运动,常用于夹具夹紧装置、送料装置、转为装置以及需要周期性进给的系统中。图5-6(a)所示为单叶式摆动缸,它的摆动角度较大,可达300°。当摆动缸进出油口压力为p1与p2,输入流量为q时,它的输出转矩T和角速度ω各为


    式中b是叶片宽度,R1,R2为叶片底部、顶部的回转半径。 
      
    图5-6(b)为双叶片式摆动缸,它的摆动角度较小,可达150°,它的输出转矩是单叶片式的两倍,而角速度则是叶片式的一半。

    6.齿条传动液压缸

    齿条传动液压缸结构形式很多,图5-7所示是一种用于驱动回转工作台回转的齿条传动液压缸。图中两个活塞4,7用螺钉固定在齿条5的两端、两端盖2和8通过螺钉、压板和半圆环3连接在缸筒上。当压力油从油口A进入缸的左腔时,推动齿条活塞向右运动,通过齿轮6带动回转工作台运动。液压缸右腔的回油经油口A排出。当压力油从油口B进入右腔时,齿条活塞向左移动,齿轮6反方向回转,左腔的回油经油口A排出。活塞的行程可由两端盖上的螺钉1,9调节,端盖2和8上的沉孔和活塞4上两端的凸头组成间隙式缓冲装置。

    7.液压伺服马达
    控制用的阀和驱动用的液压缸或液压马达组合起来形成液压伺服马达。液压伺服马达也可以看做把阀的输入位移转换成压力差并高效率地驱动载荷的驱动器。图5-8所示为滑阀伺服马达的原理。伺服马达有阀套和在阀套内沿轴线移动的阀芯,靠阀套上的五个口和阀肩的三个凸肩可实现,中部的供油口连接有一定压力的液压源,两侧的两个口接油箱,两个载荷口用 与驱动器相连。当供油口处于关闭状态,阀芯向右移动(x>0时),供油压力为sp。经过节流口从左通道流到驱动器活塞左侧并以压力1p使载荷向右(y>0)移动,相反,阀芯向左移动(x<0时),压力2p的液压油供到活塞右侧,使载荷向左移动(y<0)


    气压驱动系统
    空气压缩机输出的压缩空气首先储存于储气罐中,然后供给各个回路使用 。 气动回路使用过的空气无需回收,而是直接经排气口排入大气,因而没有回收空气的回气管道。 
    1.气压驱动系统
     气压驱动系统的组成与液压系统有许多相似之处,但在以下三个方面有明显的不同: 

    空气压缩机输出的压缩空气首先储存于储气罐中,然后供给各个回路使用 。 
     气动回路使用过的空气无需回收,而是直接经排气口排入大气,因而没有回收空气的回气管道

    2.气压驱动回路 
    图5-9为一典型的气压驱动回路。在这个图中没有画出空气压缩机和储气罐。压缩空气由空气压缩机产生,其压力约为0.5-0.7Mpa,并被送入储气罐。然后由储气罐用管道接入驱动回路。在过滤器内出去灰尘和水分后,流向压力调整阀调压,使空气压缩机的压力至4-5Mpa。 
      
    在油雾器中,压缩空气被混入油雾。这些油雾用于润滑系统的滑阀及气缸,同时也起一定的防锈作用。 
     
    从油雾出来的压缩空气接着进入换向阀,电磁换向阀根据电信号,改变阀芯的位置使压缩空气进入气缸A腔或者B腔,驱动活塞向右或者向左运动。


    3.气源系统的组成 
     一般规定,当排气量大于或等于6-123/minm的情况下,就有必要单独设立压缩空气站。压缩空气站主要由空气压缩机、吸气过滤器、后冷却器、油水分离器和储气罐组成。如要求气体质量更高,还应附设气体的干燥、净化等处理装置。
    空气压缩机 
       
    空气压缩机种类很多,主要有活塞式、叶片式、螺杆式、离心式、轴流式、混流式等。前三种为容积式,后三种为速度式。 
       
    所谓容积式就是周期地改变气体容积的方法,即先通过缩小空气的体积,使单位体积内气体分子密度增加,形成压缩空气。而速度式则是先让气体分子得到一个很高的速度,然后让他停滞下来,将动能转化为静压能,使气体的压力提高。 
       
    选择空气压缩机的基本参数是供气量和工作压力。工作压力应当和空气压缩机的额定排气压力相符,而供气量应当与所选压缩机的排气量相符。 

    气源净化辅助设备 
     
    气源净化辅助设备包括后冷却器、油水分离器、储气罐、干燥器、过滤器等。 
    ① 后冷却器 
       后冷却器安装在空气压缩机出口处的管道。它对空气压缩机排出的温度高达150℃左右的压缩空气降温,同时使混入压缩空气的水汽和油气凝聚成水滴和油滴。通过后冷却器的气体温度降至40-50℃。 
       后冷却器主要有风冷式和水冷式两种,风冷式冷却器如图5-10所示。风冷式冷却器是靠风扇产生的冷空气吹向带散热片的热气管道来降低压缩空气温度的。它不需要循环冷却水,所以具有占地面积小,使用及维护方便等特点。 
    ② 油水分离器 
       油水分离器的作用是分离压缩空气中凝聚的水分、油份和灰尘等杂质,使压缩空气初步得到净化,其结构形式有环形回转式、撞击折回式、离心旋转式、水浴式及以上形式的组合等。撞击折回式油水分离器结构如图5-11所示。当压缩空气由进气管4进入分离器壳体以后,气流先受到隔板2的阻挡,被撞击而折回向下,之后又上升并产生环形回转,最后从输出管3排出。与此同时,在压缩空气中凝聚的水滴、油滴等杂质受惯性力的作用而分离析出,沉降于壳体底部,由阀6定期排出。


    ③ 储气罐 
       如图5-12 所示。储气罐的作用是储存一定量的压缩空气,保证供给气动装置连续和稳定的压缩空气,并可减小气流脉动所造成的管道振动。同时,还可进一步分离油水杂质。储气罐上通常装有安全阀、压力表、排污阀等。 


    ④ 干燥器 
     如图5-13所示。为了进一步排除压缩空气中的水、油与杂志,以供给要求高度干燥、洁净压缩空气的气动装置。 

    ⑤ 过滤器 
     如图5-14所示。对要求高的压缩空气,经干燥处理之后,再经过二次过滤。过滤器大致有陶瓷过滤器、焦炭过滤器、粉末冶金过滤器及纤维过滤器等。 

    4.气压驱动器
    气压驱动器时最简单的一种驱动方式,气体驱动元件有直线汽缸和旋转气动马达两种。气压驱动器除了用压缩空气作为工作介质外,其它与液压驱动器类似。气动马达和汽缸是典型的气压驱动器。气压驱动器结构简单、安全可靠、价格便宜。但是由于空气的可压缩性,精度和可控性较差,不能应用在高精度的场合。一种新型的气动马达,用微处理器直接控制的一种叶片马达,能携带215.6N的负载而又获得高的定位精度(1mm)。


    ①叶片式气动马达  由于空气的可压缩性,使得汽缸的特性与液压油缸的特性有所不同。因为空气的温度和压力变化时将导致密度的变化,所以采用质量流量比体积流量更方便。假设汽缸不受热的影响,则质量流量MQ与活塞速度v之间有如下关系。


    式中R-气体常数,T-绝对温度,V-汽缸腔的容积;k-比热常数,p-汽缸腔内压力,A-活塞的有效受压面积。
     
    可以看出在系统中,活塞速度与流量之间的关系不像式v=Q/A那样简单,气动系统所产生的力与液压系统相同,也可以用式F=A△p来表达。典型的气动马达有叶片马达和径向活塞马达,其工作原理与液压马达相同。气动机械的噪声较大,有时要按照消声器。图5-15所示为叶片式气动马达的结构。叶片式气动马达的优点是转速高、体积小、重量轻,其缺点是气动启动力矩较小。 

    ② 气压驱动的控制结构 
     图5-16所示为气压驱动器的控制原理,它由放大器、电动部件及变速器、位移(或转角)-气压变换器和气-电变换器等组成。放大器把输入的控制信号放大后去推动电动部件及变速器,电动部件及变速器把电能转化为机械能,产生线位移或角位移。最后通过位移气压变换器产生与控制信号相对应的气压值。位移气压变换器是喷嘴挡板式气压变换器。气-电变换器把输出的气压变成电量用作显示或反馈。



    机器人关节驱动装置研究进展
    1.机器人关节驱动装置及其特点
    谐波减速器
     
    目前,谐波减速器是用于机器人关节传动的主要装置,其主要优点是传动比大、运转平稳、结构简单、传动效率高,是一种比较理想的传动装置。但由于其本身固有的结构特点(通过柔轮的弹性变形实现运动传递,具有过量的柔顺,过量的间隙) ,造成刚度不够,在传递载荷时弹性变形回差较大,影响了机器人末端执行器的定位精度和动态特性。而且随着使用时间的增长,其运动精度还会显著降低。因此,为保证机器人在周期性运动时的运动精度,用刚性大、回差小的精密传动装置代替刚性小的谐波传动,是机器人传动发展的需要。
    摆线针轮RV 减速器
     
    80年代中期,日本出现了在双曲柄少齿差行星传动机构基础上完善起来的RV 传动机构,并由帝人公司成功研制出应用于机器人的摆线针轮RV 减速器,自1986年投放市场以来, 其独特的优越性能引起学术界的关注,系列产品也得到用户的青睐。由于它是机器人用减速器中刚性最高的低振动减速器,对提高机器人的运动精度和动态特性非常有利,而且还具有体积小、传动比大、承载能力大、运动精度高、传动效率高等优点,因而该传动装置不仅被机器人生产中使用,在机床行业也广泛采用。例如: 数控车床( N C)主轴分度; 加工中心( MC)的辅助机( ATC)的驱动等;工厂自动化( FA)领域及各种精密伺服系统的应用量也逐渐增多。日本生产的RV减速器均采用一级渐开线齿轮和一级摆线针轮传动,由于加工摆线针轮需要先进的专用设备,工艺系统复杂,且摆线针轮对加工误差敏感,为了得到小回差和使载荷均匀分布,制造精度要求很高,如果不具备大批量生产条件,产品成本非常高,而我国现有加工水平很难达到这种精度要求。

    可调间隙变厚齿轮RV 减速器
     
    变厚齿轮RV 减速器采用一级渐开线齿轮传动和一级少齿差内啮合变厚齿轮传动,是针对驱动机器人关节的需要而开发的一种新型传动装置,由于首次成功地将变厚齿轮应用于减速器中,用它来代替RV 传动中的摆线针轮,使该减速器不但继承了RV减速器的体积小、传动比大、承载能力大、刚度大、运动精度高、传动效率高等优点,而且利用变厚齿轮的结构特点,通过设计调隙机构调整变厚齿轮的轴向位置,可以方便地调节其啮合侧隙,减小回差,实现精密传动。由于国内外对内啮合变厚齿轮设计理论及加工方法的研究资料甚少,严重阻碍了内啮合变厚齿轮在实际中的应用。因此,通过进一步完善该种齿轮的设计理论,并找出一种简单易行的加工方法,不需开发专用机床或改装设备,利用国内现有的设备就可以加工出高精度的内啮合变厚齿轮副,从而用较低的成本制造出自行设计的高精度变厚齿轮RV减速器,这对提高我国机器人的性能,促进我国机器人工业的发展,具有重要的意义。

    2.国内外RV 传动的发展概况
    RV 传动机构是在K-H-V 型行星轮系的基础上发展起来的一种较先进的传动机构。目前在工程上已广泛采用的渐开线少齿差行星传动、摆线针轮行星传动均属K-H-V 型行星传动。一般的K-H-V 型少齿差行星传动机构具有传动比大、结构紧凑、体积小、重量轻等优点,因而得到了广泛的应用。该种传动装置通常都带有W输出机构,行星齿轮既作公转运动又作自转运动,公转运动是减速器的输入运动,自转运动是输出运动,两者又汇集在行星轮上,如图1所示。W输出机构的型式有双万向联轴节式、十字滑块式、浮动盘式、平行四边形机构式、孔销式和零齿差式等,其结构各异,功能却是相同的。但它们都存在程度不同的缺点,如使减速器结构复杂、工艺性差、结构尺寸增大、动态性能低劣和机械效率降低等, 此外,这种机构刚度低、附加动载荷大,特别是传递较大功率时,振动和噪声大,严重影响了这种传动的应用和推广。



    基于上述问题,国内外学者进行了深入广泛的研究,在K-H-V 型行星齿轮传动的基础上又发展出双曲柄式少齿差行星传动机构,其指导思想就是将输入运动和输出运动分别由中心轮和行星轮承担,如图2所示。



    这样,一方面省去了输出机构W, 避免了由它所带来的弊病,另一方面用一个平行四边形机构(双曲柄)代替转臂H ,设置了同步啮合的定轴齿轮副,经减速后再将运F动输送给少齿差轮系,这样可获得更大的速比,使机构更为紧凑和有效; 当总速比相同时,动轴上齿轮的速度较低、运转比较平稳、动载荷和噪音较小。通过对浮动盘、双曲柄式和销轴式三种型式的一齿差减速器进行对比试验表明,无论是效率的理论计算或实测值,双曲柄式少齿差行星减速器均为最高,并且噪音低,运转平稳。
     我国太原工学院的朱景梓教授所提出的双曲柄少齿差减速器,其传动原理与日本的RV 减速器相同,不同之处是其齿形为渐开线齿形。双曲柄式少齿差行星减速器的理论分析和实验研究工作在1985年即已完成,并于同年在太原工学院机械厂试制出第一台样机。1983年,天津卷扬机厂成功地把输入功率为7. 5 kW的双曲柄式二齿差减速机应用于该厂生产的一吨快速卷扬机上,1989年,天津职业技术师范学院与天津减速机厂合作开发了双曲柄摆线针轮减速器,并获国家专利。同年,上海减速机厂从日本进口动力用RV 减速机并加以仿制。1990年,华东化工学院与天津职业技术师范学院共同研制双曲柄式渐开线行星减速器,并应用在北京人民机器厂生产的P-880型双开四色胶印机上。
     
    在国外, RV 减速器的研制、生产主要在日本。1961年,日本即开始从事三曲柄式行星传动行走装置的开发和生产。这种传动具有刚性高、超负荷能力强等优点,获得日本机械振兴协会的奖励。1983年,日本又开始进行高刚性、高精度、低振动的机器人用传动装置(即RV 传动机构)的研究,并于1986年日本帝人公司推出的偏心差动式RV系列减速机获得日本专利。它是一种两级减速机,一级为渐开线直齿轮减速部分,二级为三轴式摆线针轮行星减速部分。由于它具有减速比大、易改变速比、扭转刚度大、传动效率高、振动低、体积小等其它类型减速器所不可比拟的优点,因而已广泛应用于机器人的生产中。1986年投入市场,目前的生产厂家有帝人精机、三菱和住友株式会社等。同年,日本专利局公开了日本住友重机械公司研制的应用在油压机上的RV 减速机专利。70年代,西德Ch risho lm-Moo re制造公司生产的两种起重用卷扬机也采用了双曲柄少齿差行星传动机构。1986年,法国专利局也公布了一种与RV 传动机构类似的摆线齿形、渐开线齿形两种行星减速机专利。
      
    综上所述,在双曲柄式少齿差行星传动机构基础上发展起来的RV 系列减速机具有许多独特的性能,适应现代机械发展的要求,是少齿差行星传动的一个新的发展方向。
    3.RV 传动原理及特点
    RV传动是由一级行星传动部分和偏心差动式少齿差传动部分组合而成的二级减速传动。如图3所示,输入齿轮轴通过直齿轮(太阳轮)将电机的回转运动传递给二个均布的行星轮,实现第一级减速传动。行星轮通过曲轴H ,使摆线针轮做偏心运动。当机壳固定时,摆线针轮绕针轮一边公转一边自转,通过输出圆盘输出其自转运动,实现第二级减速传动。



    从式( 4)中可以看出, 如果设法增大i1 ,就可以使共振时的输入转速转移到高速区域内。因此,可以防止低速区域的共振,从而减小振动。该RV传动通过一级减速后,使第二级偏心差动部分的输入转速大大降低,即偏心差动部分的离心惯性力得到降低,附加动载荷明显减小,相应地降低了附加动载荷引起的振动和噪声。同时,该RV减速器采用偏心圆盘输出机构,少齿差内齿啮合齿数多、抗过载能力强、扭转刚度大,可实现高刚度,耐冲击的传动。
    ( 2) 传动比范围。由式( 2)可知,固定针轮齿数z4的值,通过改变一级传动的齿轮副齿数z1 和z 2 ,就可方便地获得较大范围的传动比,易形成产品系列。
    ( 3) 效率和传递功率。RV 传动由太阳轮输入,经行星轮形成功率分流,由支撑圆盘输出。同时, RV 传动避免了少齿差传动输出机构的各种弊端,因而可实现高效率,大功率传动。
    ( 4) 扭转刚度与回差。RV 传动的摆线针轮z 3由中心圆盘支承的两个曲柄轴同时驱动,并通过中心圆盘直接输出。同时,少齿差传动部分啮合齿数多,所以整个传动装置抵抗变形能力强,弹性变形小,具有较高的扭转刚度,由弹性变形引起的回差小。
    ( 5) 体积和重量。RV 传动采用中心圆盘支承,内部采用超薄主轴承,使轴向尺寸大大减小。
    因而结构紧凑、体积小、重量轻,很适合机器人关节传动。
     由于RV 传动装置具有上述优点,因此其用途是很广泛的。它不仅适用于机器人传动,而且还可以用于机床领域、起重运输、印刷机械、轻纺机械以及其他机械化、自动化领域中的精密传动。

    4.小结
    目前,机器人关节驱动装置主要是谐波减速器和RV减速器。但是,由于谐波减速器本身固有的缺点,使其在传递载荷时产生较大的弹性变形和回差,影响了机器人末端执行器的定位精度和动态特性。因此,用运动精度高、刚度大、回差小、振动低的RV 减速器代替国内机器人关节常用的谐波减速器,是我国机器人产业发展的必然趋势。
     
    在国外,尤其是在日本,其先进的机器人关节都已采用RV减速器来驱动。而在国内,在国家863基金的资助下,已经研制出了高精度的变厚齿轮RV减速器。虽然由于国内加工水平的限制,各零部件的加工精度没有达到要求,但其多数主要性能指标仍然超过了日本同类产品的水平,如其间隙回差为47arc. sec (日本为1) ; 扭转刚度为134. 53N· m· arc /min- 1 (日本为78 N· m·a rc /min- 1 ) ; 传动效率为91. 95% (日本为85% )。可以看出,其主要性能指标达到了国际先进水平,并且价格仅为日本同类产品的三分之一,完全可以取代日本的RV 减速器,实现该类产品的国产化,并可以作为谐波减速器的更新换代产品,满足我国机器人工业生产的需要。

    工业机器人电动驱动系统
    1.电动驱动系统
    机器人电动伺服驱动系统是利用各种电动机产生的力矩和力,直接或间接地驱动机器人本体以获得机器人的各种运动的执行机构。
      
    对工业机器人关节驱动的电动机,要求有最大功率质量比和扭矩惯量比、高起动转矩、低惯量和较宽广且平滑的调速范围。特别是像机器人末端执行器(手爪)应采用体积、质量尽可能小的电动机,尤其是要求快速响应时,伺服电动机必须具有较高的可靠性和稳定性,并且具有较大的短时过载能力。这是伺服电动机在工业机器人中应用的先决条件。
      
    机器人对关节驱动电机的主要要求规纳如下:
      1)快速性。电动机从获得指令信号到完成指令所要求的工作状态的时间应短。响应指令信号的时间愈短,电伺服系统的灵敏性愈高,快速响应性能愈好,一般是以伺服电动机的机电时间常数的大小来说明伺服电动机快速响应的性能。
      2)起动转矩惯量比大。在驱动负载的情况下,要求机器人的伺服电动机的起动转矩大,转动惯量小。
      3)控制特性的连续性和直线性,随着控制信号的变化,电动机的转速能连续变化,有时还需转速与控制信号成正比或近似成正比。
      4)调速范围宽。能使用于1:1000~10000的调速范围。
      5)体积小、质量小、轴向尺寸短。
      6)能经受得起苛刻的运行条件,可进行十分频繁的正反向和加减速运行,并能在短时间内承受过载。
      
    目前,由于高起动转矩、大转矩、低惯量的交、直流伺服电动机在工业机器人中得到广泛应用,一般负载1000N(相当100kgf)以下的工业机器人大多采用电伺服驱动系统。所采用的关节驱动电动机主要是AC伺服电动机,步进电动机和DC伺服电动机。其中,交流伺服电动机、直流伺服电动机、直接驱动电动机(DD)均采用位置闭环控制,一般应用于高精度、高速度的机器人驱动系统中。步进电动机驱动系统多适用于对精度、速度要求不高的小型简易机器人开环系统中。交流伺服电动机由于采用电子换向,无换向火花,在易燃易爆环境中得到了广泛的使用。机器人关节驱动电动机的功率范围一般为0.1~10kW。工业机器人驱动系统中所采用的电动机,大致可细

    分为以下几种:
      (1)交流伺服电动机 包括同步型交流伺服电动机及反应式步进电动机等。
      (2)直流伺服电动机 包括小惯量永磁直流伺服电动机、印制绕组直流伺服电动机、大惯量永磁直流伺服电动机、空心杯电枢直流伺服电动机。
      (3)步进电动机 包括永磁感应步进电动机。  速度传感器多采用测速发电机和旋转变压器;位置传感器多用光电码盘和旋转变压器。近年来,国外机器人制造厂家已经在使用一种集光电码盘及旋转变压器功能为一体的混合式光电位置传感器,伺服电动机可与位置及速度检测器、制动器、减速机构组成伺服电动机驱动单元。  机器人驱动系统要求传动系统间隙小、刚度大、输出扭矩高以及减速比大,常用的减速机构有: 
    1)RV减速机构;
    2)谐波减速机械; 
    3)摆线针轮减速机构; 
    4)行星齿轮减速机械;
    5)无侧隙减速机构;
    6)蜗轮减速机构;
    7)滚珠丝杠机构; 
    8)金属带/齿形减速机构;
    9)球减速机构。  
     工业机器人电动机驱动原理如图1所示。

    工业机器人电动伺服系统的一般结构为三个闭环控制,即电流环、速度环和位置环。 目前国外许多电动机生产厂家均开发出与交流伺服电动机相适配的驱动产品,用户根据自己所需功能侧重不同而选择不同的伺服控制方式,一般情况下,交流伺服驱动器,可通过对其内部功能参数进行人工设定而实现以下功能:
    1)位置控制方式;
    2)速度控制方式; 
    3)转矩控制方式; 
    4)位置、速度混合方式; 
    5)位置、转矩混合方式; 
    6)速度、转矩混合方式; 
    7)转矩限制; 
    8)位置偏差过大报警; 
    9)速度PID参数设置; 
    10)速度及加速度前馈参数设置; 
    11)零漂补偿参数设置; 
    12)加减速时间设置等 
    2.直流伺服电动机驱动器 
     直流伺服电动机驱动器多采用脉宽调制

    (PWM)伺服驱动器,通过改变脉冲宽度来改变加在电动机电枢两端的平均电压,从而改变电动机的转速。 
      
    PWM伺服驱动器具有调速范围宽、低速特性好、响应快、效率高、过载能力强等特点,在工业机器人中常作为直流伺服电动机驱动器。

    3.同步式交流伺服电动机驱动器
    同直流伺服电动机驱动系统相比,同步式交流伺服电动机驱动器具有转矩转动惯量比高、无电刷及换向火花等优点,在工业机器人中得到广泛应用。 
      
    同步式交流伺服电动机驱动器通常采用电流型脉宽调制(PWM)相逆变器和具有电流环为内环、速度环为外环的多闭环控制系统,以实现对三相永磁同步伺服电动机的电流控制。根据其工作原理、驱动电流波形和控制方式的不同,它又可分为两种伺服系统: 
    1)矩形波电流驱动的永磁交流伺服系统。 
    2)正弦波电流驱动的永磁交流伺服系统。 
      
    采用矩形波电流驱动的永磁交流伺服电动机称为无刷直流伺服电动机,采用正弦波电流驱动的永磁交流伺服电动机称为无刷交流伺服电动机。 

    4.步进电动机驱动器
    步进电动机是将电脉冲信号变换为相应的角位移或直线位移的元件,它的角位移和线位移量与脉冲数成正比。转速或线速度与脉冲频率成正比。在负载能力的范围内,这些关系不因电源电压、负载大小、环境条件的波动而变化,误差不长期积累,步进电动机驱动系统可以在较宽的范围内,通过改变脉冲频率来调速,实现快速起动、正反转制动。作为一种开环数字控制系统,在小型机器人中得到较广泛的应用。但由于其存在过载能力差、调速范围相对较小、低速运动有脉动、不平衡等缺点,一般只应用于小型或简易型机器人中。 
      
    步进电动机所用的驱动器,主要包括脉冲发生器、环形分配器和功率放大等几大部分,其原理框图如图2所示。



    5.直接驱动 
    所谓直接驱动(DD)系统,就是电动机与其所驱动的负载直接耦合在一起,中间不存在任何减速机构。 
      
    同传统的电动机伺服驱动相比, DD驱动减少了减速机构,从而减少了系统传动过程中减速机构所产生的间隙和松动,极大地提高了机器人的精度,同时也减少了由于减速机构的摩擦及传送转矩脉动所造成的机器人控制精度降低。而DD驱动由于具有上述优点,所以机械刚性好,可以高速高精度动作,且具有部件少、结构简单、容易维修、可靠性高等特点,在高精度、高速工业机器人应用中越来越引起人们的重视。 作为DD驱动技术的关键环节是DD电动机及其驱动器。它应具有以下特性:
    1)输出转矩大:为传统驱动方式中伺服电动机输出转矩的50~100倍。 
    2)转矩脉动小: DD电动机的转矩脉动可抑制在输出转矩的5%~10%以内。 
    3)效率:与采用合理阻抗匹配的电动机(传统驱动方式下)相比, DD电动机是在功率转换较差的使用条件下工作的。因此,负载越大,越倾向于选用较大的电动机。 目前,DD电动机主要分为变磁阻型和变磁阻混合型,有以下两种结构型式: l)双定子结构变磁阻型DD电动机; 2)中央定子型结构的变磁阻混合型DD电动机。

    6.特种驱动器 
    1)压电驱动器。众所周知,利用压电元件的电或电致伸缩现象已制造出应变式加速度传感器和超声波传感器,压电驱动器利用电场能把几微米到几百微米的位移控制在高于微米级大的力,所以压电驱动器一般用于特殊用途的微型机器人系统中。

    2)超声波电动机。
     
    3)真空电动机,用于超洁净环境下工作的真空机器人,例如用于搬运半导体硅片的超真空机器人等。


    来源:萝卜库



    相关文章链接

    相关文章:

    轮式机器人专题介绍

    仿生机器人专题

    履带机器人专题

    轮腿复合型移动机器人

    轮履腿复合移动机器人专题

    机器人2025本期第二导读

    Alphabet新动向:正在利用人工智能“专致”蚊子不孕不育

    雅虎开发“智能”广告牌:可以通过摄像头和麦克风捕捉人们的看法

    谷歌在纽约为自家硬件产品开设了一家快闪实体店

    我国智能仓储业将引入机器人



    展开全文
  • 小米8手机驱动是专小米8手机用户们打造的驱动程序,安装了这款驱动你就可以方便用电脑来管理你的小米手机了,这款驱动安装简单方便,有需要的用户赶快来下载使用吧!小米8手机介绍小米8是小米公司2018年5月31日...
  • Windows驱动开发WDM (13)- 过滤驱动

    万次阅读 2012-12-19 17:40:12
    过滤驱动可以在功能型驱动的上面,称之上层过滤驱动,或者高层,反正就这个意思。过滤驱动在功能型驱动下面,称之下层过滤驱动。看示意图: 从名字上就可以知道过滤驱动是干啥用的。就是起过滤作用。比如: ...

    之前用的驱动例子是一个功能型驱动,只不过它操作的是一个虚拟设备。这个驱动创建的FDO(功能设备对象)是附在虚拟总线驱动创建的虚拟PDO之上的。这次来介绍一下不同于功能型驱动的过滤驱动。过滤驱动可以在功能型驱动的上面,称之为上层过滤驱动,或者高层,反正就这个意思。过滤驱动在功能型驱动下面,称之为下层过滤驱动。看示意图:

    从名字上就可以知道过滤驱动是干啥用的。就是起过滤作用。比如:

    1. 可以对写入硬盘的数据做加密,然后读取的时候解密,这样对于用户来说,根本不知道有加密解密的过程,然后存在硬盘上的数据是加密的。

    2. 可以对已有驱动做一些扩展,或者改变已有驱动的功能。比如已有驱动一次只能写1024字节的数据,那么过滤驱动可以扩展到任何长度,然后分段调用已有驱动就是了。

     

    我们来尝试给之前用的驱动加个过滤驱动。这个过滤驱动代码,我是从前面的驱动copy过来的,然后修改一下。

    其实过滤驱动跟功能型驱动从代码上看也没有太多不同,需要注意的是:

    1. 因为过滤驱动是附在FDO上的,那么通常过滤驱动都不需要一个名字,因为caller不会直接调用过滤驱动;

    2. 因为不知道下层驱动是缓冲模式还是直接模式操作内存,那么通常过滤驱动会同时支持缓冲和直接方式。

    看一下AddDevice里面创建过滤驱动设备对象的代码:

    NTSTATUS CreateFDO(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
    {
    	NTSTATUS status;
    	PDEVICE_OBJECT fido;
    
    	//创建FDO(Function Device Object)
    	status = IoCreateDevice(
    		DriverObject,
    		sizeof(DEVICE_EXTENSION),
    		NULL,//过滤驱动,无需名字
    		FILE_DEVICE_UNKNOWN,
    		0,
    		FALSE,
    		&fido);
    	if( !NT_SUCCESS(status))
    		return status;
    
    	KdPrint(("Create filter device\n"));
    
    	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
    	pdx->fdo = fido;
    	//将FDO附加在PDO上面,并且将Extension中的NextStackDevice指向FDO的下层设备。如果PDO上面有过滤驱动的话,NextStackDevice就是过滤驱动,如果没有就是PDO。
    	pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fido, pdo);
    
    	if (pdx->NextStackDevice == NULL)
    	{
    		KdPrint(("attach failed\n"));
    		IoDeleteDevice(fido);
    		return STATUS_DEVICE_REMOVED;
    	}
    	
    
    	fido->Flags |= DO_BUFFERED_IO | DO_DIRECT_IO| DO_POWER_PAGABLE;//
    	fido->Flags &= ~DO_DEVICE_INITIALIZING;//将Flag上的DO_DEVICE_INITIALIZING位清零,保证设备初始化完毕,必须的。
    
    	return STATUS_SUCCESS;
    }

    看上去代码很简单,这就够了。主要就是创建一个设备,然后附在传进来的pdo之上。

    我们在过滤驱动里面只做一件事情,把传进来的buffer的第一个字节改成x。

    看code:

    NTSTATUS HelloWDMIOControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
    {
    	KdPrint(("EX Enter HelloWDMIOControl\n"));
    
    	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    
    
    	//得到IOCTRL码
    	ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
    
    	NTSTATUS status;
    	ULONG info = 0;
    	switch (code)
    	{
    	case IOCTL_ENCODE:
    		{			 
    			PDEVICE_OBJECT pFdo = fdo->DriverObject->DeviceObject;
    			do 
    			{
    				pdx = (PDEVICE_EXTENSION)pFdo->DeviceExtension;
    				KdPrint(("EX Device: %x, PDX::NextStackDevice: %x\n", pFdo, pdx->NextStackDevice));
    				pFdo = pFdo->NextDevice;
    			} while (pFdo != NULL);
    
    			//过滤驱动里面修改一个输入缓冲的数据。
    			char* inBuf = (char*)Irp->AssociatedIrp.SystemBuffer;
    			inBuf[0] = 'x';
    
    			KdPrint(("Try to call lower driver Irp: %x\n", Irp));
    			pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    			IoCopyCurrentIrpStackLocationToNext(Irp);
    			status = IoCallDriver(pdx->NextStackDevice, Irp);
    
    			KdPrint(("Finished calling lower driver, Irp: %x", Irp));
    		}
    		break;
    	default:
    		IoSkipCurrentIrpStackLocation(Irp);
    		status = IoCallDriver(pdx->NextStackDevice, Irp);
    		break;
    	}
    
    	KdPrint(("EX Leave HelloWDMIOControl\n"));
    	return status;
    }
    

    如果是IOCTL_ENCODE的irp,那么把input buffer的第一个字节改成x,然后继续调用下层驱动。如果是其他irp直接调用下层驱动。

    代码就这么简单,现在来看看inf文件:

    [Version]
    Signature=$CHICAGO$
    Provider=%MFGNAME%
    
    [DestinationDirs]
    DefaultDestDir=10,system32\drivers
    FiltJectCopyFiles=11
    
    [SourceDisksFiles]
    HelloWDM_Ex.sys=1
    
    [SourceDisksNames]
    1=%INSTDISK%,,,MyFilter_Check
    
    ;------------------------------------------------------------------------------
    ;  Windows 2000 Sections
    ;------------------------------------------------------------------------------
    
    [DefaultInstall.ntx86]
    CopyFiles=DriverCopyFiles,FiltJectCopyFiles
    
    [DriverCopyFiles]
    HelloWDM_Ex.sys,,,0x60		; replace newer, suppress dialog
    
    [DefaultInstall.ntx86.services]
    AddService=HelloWDM_Filter,,FilterService
    
    [FilterService]
    ServiceType=1
    StartType=3
    ErrorControl=1
    ServiceBinary=%10%\system32\drivers\HelloWDM_Ex.sys
    
    ;------------------------------------------------------------------------------
    ;  String Definitions
    ;------------------------------------------------------------------------------
    
    [Strings]
    MFGNAME="Kevin filter"
    INSTDISK="Kevin disk"
    DESCRIPTION="Kevin - Sample Filter Driver"
    

    比功能型驱动简单很多,没什么花头,就是要注意一下AddService=HelloWDM_Filter,,FilterService,这里的HelloWDM_Filter后面会被用到。

    这个inf文件,可以直接右键点击,然后安装。

    安装这个还不够,我们还需要改一下注册表,来指明过滤驱动应该对哪些设备起作用。之前那个驱动的ID是ClassGUID={EF2962F0-0D55-4bff-B8AA-2221EE8A79B0},那么我们可以在注册表里面找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EF2962F0-0D55-4BFF-B8AA-2221EE8A79B0},给它加个子键,比如:


    UpperFilters指上层过滤驱动(反之,下层驱动是LowerFilters),HelloWDM_Filter来自于inf文件的AddService=HelloWDM_Filter,,FilterService

    一旦我们创建的这个子键后,我们可以从设备管理器上看到:

    重启电脑,用devicetree可以看到:

    因为功能驱动HelloWDM创建了3个设备对象,那么过滤驱动将会附在再上层的FDO上面。从上图可以看到附在MyWDMDevice3的上面。这个时候设备栈类似于:

    filter device -> MyWDMDevice3 -> MyWDMDevice2 -> MyWDMDevice -> PDO(虚拟总线驱动创建的)

     

    ok,测试一下。测试代码很简单,就是打开设备\\.\HelloWDM(MyWDMDevice),然后发一个IOCTL_ENCODE请求(DeviceIoControl)。

    // TestWDMDriver.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <process.h>
    
    #define DEVICE_NAME L"\\\\.\\HelloWDM"
    #define DEVICE_NAME2 L"\\\\.\\HelloWDM2"
    #define DEVICE_EX L"\\\\.\\HelloWDM_EX"
    
    void Test(void* pParam)
    {
    	int index = (int)pParam;
    	//设置overlapped标志,表示异步打开
    	HANDLE hDevice;
    	
    	hDevice = CreateFile(DEVICE_NAME,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
    			FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);
    
    	wprintf(L"CreateFile, name: %s, ret: %x\n", DEVICE_NAME, hDevice);
    	
    	
    
    	if (hDevice != INVALID_HANDLE_VALUE)
    	{
    		char inbuf[100] = {0};
    		
    		sprintf(inbuf, "hello world %d", index);
    		char outbuf[100] = {0};
    		DWORD dwBytes = 0;
    
    		DWORD dwStart = GetTickCount();
    
    		printf("input buffer: %s\n", inbuf);
    		
    		OVERLAPPED ol = {0};
    		ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    
    		BOOL b = DeviceIoControl(hDevice, CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_IN_DIRECT, FILE_ANY_ACCESS), 
    			inbuf, strlen(inbuf), outbuf, 100, &dwBytes, &ol);
    
    		printf("DeviceIoControl thread %d, returns %d, last error: %d, used: %d ms, input: %s\n", index, b, GetLastError(), GetTickCount() - dwStart, inbuf);
    
    
    		WaitForSingleObject(ol.hEvent, INFINITE);
    
    		DWORD dwEnd = GetTickCount();
    		//将输出buffer的数据和'm'亦或,看看是否能够得到初始的字符串。
    		for (int i = 0; i < strlen(inbuf); i++)
    		{
    			outbuf[i] = outbuf[i] ^ 'm';
    		}
    
    		printf("Verify thread %d, outbuf: %s, used: %d ms\n", index, outbuf, dwEnd - dwStart);
    
    		CloseHandle(hDevice);
    
    	}
    	else
    		printf("CreateFile failed, err: %x\n", GetLastError());
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE t1 = (HANDLE)_beginthread(Test, 0, (void*)0);
    
    	WaitForSingleObject(t1, INFINITE);
    
    	printf("Test ends\n");
    	return 0;
    }
    
    

    看输出:


    输进去hello world 0, 输出变成了xello world 0,说明过滤驱动起作用了。看看debugview的输出:

    嘿嘿,确实有过滤驱动的输出,成功。

     

    总结,看起来过滤驱动还是蛮简单的,当然这只是一个极其简单的例子,实际情况怕是没那么简单了。要点:

    1. 代码和功能驱动没什么大分别,如果无需过滤,则直接调用下层驱动。

    2. INF文件需要相应修改,看上面的例子。

    3. 需要改一下注册表,找到相应的ID, 如HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EF2962F0-0D55-4BFF-B8AA-2221EE8A79B0},然后增加子键UpperFilters或者LowerFilters,看上面的例子。(其实INF文件可以增加这个子键,在INF文件里面改下就好)

     

    有关这个例子,如果我们设置为LowerFilters,那么过滤驱动就不会被调用到,为什么?很简单,因为这个例子的功能驱动直接把IRP完成了,也就不会往下走了。

     

    代码:http://download.csdn.net/detail/zj510/4906910

    WDK(7600) 编译驱动, VS2008编译测试例子。过滤驱动可以直接右键inf文件安装。

     

    展开全文
  • uln2003驱动

    2012-07-25 15:26:57
    uln2003驱动 减速步进电机 原理图和pcb板都有
  • 产品应用包含目前许多制造商已设标准配备的日行灯 (DRL),包含雾灯、方向灯、煞车/停止灯。  AL8843Q 与 AL8862Q 的供应电压皆从 4.5V 到至少 40V (AL8862Q 达 55V),可承受相当严重的电压变动,例如怠速启动...
  • NVIDIA驱动安装

    千次阅读 2019-03-28 18:19:01
    需要去英伟达官网下载适合自己电脑的版本(nvidia...删除原有驱动版本 sudo apt-get purge nvidia* sudo apt-get autoremove sudo ./NIVIDIA-Linux-X86_64-384.59.run --uninstall 安装依赖 sudo apt-get ...
  • 如何重装键盘驱动操作系统装好之后默认已经装好通用键盘驱动程序了,所以很多用户以为键盘无需驱动。可以在设备管理器中查看键盘驱动程序,如有可能备份一下,必要时会用得上。...怎样重新安装键盘驱动程序键盘...
  • 领域驱动设计,为何又死灰复燃了?

    万次阅读 热门讨论 2018-07-18 07:15:00
    张逸,曾先后就职于中兴通讯、惠普 GDCC、中软国际、ThoughtWorks 等大型中外企业,任职角色高级软件工程师、架构师、技术总监、首席咨询师。 一、领域驱动设计为何又死灰复燃焕发青春? 领域驱动设计(Domain ...
  • 当然,相对于白炽灯,LED需要驱动电路,还有汽车电气是靠酸铅蓄电池供电的,是机械驱动的交流发电机充电,这类电池适合白炽灯,不适用LED,因此,设计一种稳压性能良好而又低噪声的驱动电路是十分必要的。
  • 驱动板分别1:DRV8841驱动板;2:TMC2225驱动板;3:TMC2660驱动板。 二、测试记录 1、在相同环境下,测试各个电机的噪音,测试结果如下表所示: 运行噪音 最大噪音 ...
  • 西门子,施耐德和松下伺服驱动器维修...检查机床机械部分工作正常,直接更换熔断器后,起动机床,恢复正常工作。分析原因是由于电网突然断电引起的偶发性故障。例2.SIEMENS 8MC测量系统故障的维修 故障现象:一台配
  • MTK驱动架构详解.ppt

    2021-08-23 17:55:50
    MTK驱动架构详解.ppt
  • 平台设备驱动

    2017-04-05 09:34:38
  • 过滤驱动程序总结

    千次阅读 2016-04-13 18:52:16
    过滤驱动程序  过滤驱动程序可以修改已有驱动的功能,也可以对数据进行过滤加密。WDM驱动需要通过注册表记录 指定加裁的过滤驱动,OS会读取这些值完成加载,其可以是高层过滤,也可以是低层过滤。而NT...
  • start 打印机驱动

    2011-08-14 16:19:12
    ║如果文件扩展名是ACE,该文件亦为压缩格式!请用WINACE解压! ║ ║如果文件扩展名是ZIP,该文件同样压缩格式!用WINZIP解压! ║ ║如果文件扩展名是ISO,可以通过nero将其刻录到光盘上或通过 ║ ║WinImage将其...
  • 针对欠驱动系统的跟踪控制问题,在被跟踪目标指数收敛情形下,利用基于膨胀的时变变换和非自治系统的级联控制方法,将非线性误差系统的镇定问题转化两个简单线性时变级联系统的镇定问题,并设计了全局-K指数收敛的跟踪...
  •  直流电动机是早发明能将电能转换机械能的设备,它可追溯到法拉第所发明的碟型电动机。到了1880年已成为主要的电能到机械能转换装置,但之后由于交流电的使用日趋普及,而发明了感应电动机与同步电动机,直流电动...
  • DDD领域驱动设计

    万次阅读 2018-08-06 00:35:10
    2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD。Evans DDD是一套综合软件系统分析和设计的面向对象建模方法。 领域驱动设计分为两...
  • ZXP Series 9 证卡打印机驱动,官网正版驱动,精心设计的 ZXP 系列 9 ™ 可满足您的高安全性应用需求,让您能够快速可靠地打印出具有照片质量的清晰证卡。性能可靠的 ZXP 系列 9 打印机采用 Zebra 的 Color ...
  • 当然,相对于白炽灯,LED需要驱动电路,还有汽车电气是靠酸铅蓄电池供电的,是机械驱动的交流发电机充电,这类电池适合白炽灯,不适用LED,因此,设计一种稳压性能良好而又低噪声的驱动电路是十分必要的。
  • 发光二极管照明优点是节能、安全,但由于恒定电流工作考虑,能耗相对增加,因此照明系统设计以低能耗目标。  前面提到恒流驱动器的压降在2V以内,即是考虑低能耗的设计,若系统的电源端电压与串接发光二极管压...
  • 显示驱动(Frame Buffer),Flash内存驱动,照相机驱动,音频驱动,WiFi驱动,键盘驱动,蓝牙驱动,Binder IPC驱动,Power Management ,这些都包括在Linux内核里。 (2)各种库和Android运行环境 C库、多媒体框架、...
  • 当然,相对于白炽灯,LED需要驱动电路,还有汽车电气是靠酸铅蓄电池供电的,是机械驱动的交流发电机充电,这类电池适合白炽灯,不适用LED,因此,设计一种稳压性能良好而又低噪声的驱动电路是十分必要的。...
  • 附件内容s3c2440开发板led灯驱动程序。 根据图文演示可清楚驱动程序的结构以及编写过程,图中标明相关头文件的作用,适合驱动初学者学习。
  • (四)Linux设备驱动之多个同类设备共用一套驱动 (五)Linux设备驱动模型介绍 (六)Linux驱动子系统-I2C子系统 (七)Linux驱动子系统-SPI子系统 (八)Linux驱动子系统-PWM子系统 (九)Linux驱动子系统-...
  • 驱动器PID调节

    2018-10-25 22:40:29
    里面有驱动器相应的资料和 源程序 自带速度和位置了解
  • 小米随身WiFi驱动

    2018-02-12 01:23:47
    小米随身WiFi驱动,分享 给大家了。安装上就可以使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,416
精华内容 13,766
关键字:

亦为驱动