`
callwangxiang
  • 浏览: 3362 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

《模式——工程化实现及扩展》(设计模式C# 版)《中介者模式》——“自我检验" 参考答案

阅读更多
转自:《模式——工程化实现及扩展》(设计模式C# 版)
http://www.cnblogs.com/callwangxiang/

 

 

 

 

 MarvellousWorks公司有 A B C三个部门负责文件的拟稿、审批和备案,现有的流程如下:

 1.         A部门拟稿后将文件报 B部门审核

2.         B部门对于文件审核后,确认文件体例没有缺项后就通知 C部门发布

3.         如果 B部门发现文件体例有缺项时,将文件返回给 A部门重新修改

4.         C部门在接到 B部门传来的文件时,先再发布,然后对其归档

 

不过, MarvellousWorks的管理层为了加强部门间文件流转的管理,正在酝酿修改工作流程:

1、  增加 D部门专门负责归档, C部门将归档职责划入 D部门后只负责发布文件

2、  C部门发布文件后也须先在 D部门归档

3、  A B部门间所有往复流转的中间文件也都报给 D部门归档

 

请采用本章介绍的 中介者模式及其扩展处理 ,将文件的流转调度过程从 A B C D各对象的职责中独立出来,并用单元测试验证不同的流转过程。

 

 

文件对象的定义

 

class  Document
{
    
#region  essential fields
    
public   string  Subject {  get set ; }
    
public   string  Body {  get set ; }
    
#endregion

    
#region  optional fields
    
public   string  Comment {  get set ; }
    
#endregion

    
public   override   string  ToString()
    {
        
return   string .Format( " \n[{0}]\n------------------\n{1}\n({2})\n " , Subject, Body, Comment);
    }
}

 

 

参考答案

 

分析第一步

上 述A、B、C、D部门间的协作关系比较复杂,而且预期很快会变化,但协作的中间内容很简单——都是文件,所以采用事件方式,由.NET Framework自己的事件机制作为中介者相对很简单,而且类型间的依赖关系全都推给.NET Framework,为以后扩展更多参与方的协作关系提供便利。

 

 据此,我们定义A、B、C、D时全部采用事件作为提供给外中介者协调响应关系的入口。

 

增加如下类型

class  DocumentEventArgs : EventArgs
{
    Document document;
    
public  DocumentEventArgs(Document document)
    {
        
this .document  =  document;
    }
    
public  Document Document{ get return  document;}}
}

abstract   class  Department
{
    
protected  Document document  =   new  Document();
    
public  Document Document
    {
        
get return  document;}
        
protected   set { document  =  value;}
    }
}

 

 

分析第二步

 如果直接通过事件重载操作符 += 和-=建立各Colleague的响应关系,需要重复编写代码,而且不能在系统上线后将这个工作交给管理员维护。

因此,考虑参考前面的Builder模式,增加一个基于配置动态维护维护事件响应关系的对象。

 

 

实现 和单元测试验证

 

 

1、验证“分析第一步”的设想

///   <summary>
///  测试手工定义事件中介者的交互关系
///   </summary>
[TestMethod]
public   void  TestManualDefineEventMediatorInSucceedBranch()
{
    
//   用事件配置松散的响应关系
    a1.WriteDocumentFinishedHandler  +=  b1.OnReceiveFileToReview;
    b1.ReviewDocumentFailedHandler 
+=  a1.OnReviewFailed;
    b1.ReviewDocumentSucceedHandler 
+=  c1.OnReceiveFileToPublish;
    b1.ReviewDocumentSucceedHandler 
+=  c1.OnReceiveFileToArchive;

    
//   成功的路径
    a1.Write( " a " " b " " c " );

    
//   验证修订后的内容曾经流转给了B
    Assert.AreEqual < string > ( " a " , b1.Document.Subject);
    Assert.AreEqual
< string > ( " b " , b1.Document.Body);
    Assert.AreEqual
< string > ( " c " , b1.Document.Comment);

    
//   验证修订后的内容也曾经流转给了C
    Assert.AreEqual < string > ( " a " , c1.Document.Subject);
    Assert.AreEqual
< string > ( " b " , c1.Document.Body);
    Assert.AreEqual
< string > ( " c " , c1.Document.Comment);
}

Output窗口

------ Test started: Assembly: Mediator . Tests . dll ------

A begin write
A write finished

[a]
------------------
b
( c )

B received doc from A to review
B begin review
B review succeed
C received doc to publish from B
C published 
C received doc to archive from B
C archived

1  passed ,   0  failed ,   0  skipped ,  took  0.50  seconds  ( MSTest  10.0 ).

 

 

///   <summary>
///  测试手工定义事件中介者的交互关系
///   </summary>
[TestMethod]
public   void  TestManualDefineEventMediatorInFailedBranch()
{
    
//   用事件配置松散的响应关系
    a1.WriteDocumentFinishedHandler  +=  b1.OnReceiveFileToReview;
    b1.ReviewDocumentFailedHandler 
+=  a1.OnReviewFailed;
    b1.ReviewDocumentSucceedHandler 
+=  c1.OnReceiveFileToPublish;
    b1.ReviewDocumentSucceedHandler 
+=  c1.OnReceiveFileToArchive;

    
//   失败的路径
    a1.Write( " a " "" "" );

    
//   验证确实文档曾经流转给了B
    Assert.AreEqual < string > ( " a " , b1.Document.Subject);
    Assert.AreEqual
< string > ( "" , b1.Document.Body);
    Assert.AreEqual
< string > ( "" , b1.Document.Comment);

    
//   验证文档并没有流转给C
    Assert.IsNull(c1.Document.Subject);
    Assert.IsNull(c1.Document.Body);
    Assert.IsNull(c1.Document.Comment);

    
//   修正错误的内容,重新执行流程
    a1.Write( " a " " b " " c " );

    
//   验证修订后的内容曾经流转给了B
    Assert.AreEqual < string > ( " a " , b1.Document.Subject);
    Assert.AreEqual
< string > ( " b " , b1.Document.Body);
    Assert.AreEqual
< string > ( " c " , b1.Document.Comment);

    
//   验证修订后的内容也曾经流转给了C
    Assert.AreEqual < string > ( " a " , c1.Document.Subject);
    Assert.AreEqual
< string > ( " b " , c1.Document.Body);
    Assert.AreEqual
< string > ( " c " , c1.Document.Comment);
}

 

 

Output窗口

 

------ Test started: Assembly: Mediator . Tests . dll ------

A begin write
A write finished

[a]
------------------

()

B received doc from A to review
B begin review
B review failed
A received doc review failed from B
A begin write
A write finished

[a]
------------------
b
( c )

B received doc from A to review
B begin review
B review succeed
C received doc to publish from B
C published 
C received doc to archive from B
C archived

1  passed ,   0  failed ,   0  skipped ,  took  3.64  seconds  ( MSTest  10.0 ).

 

 

2、验证“分析第二部” 的设想

 

 定义管理基于事件的中介关系Builder

class  EventMediatorBuilder
{
    
class  ConfigItem
    {
        
public  Type SourceType {  get set ; }
        
public  Type TargetType {  get set ; }
        
public   string  SourceEventName {  get set ; }
        
public   string  TargetHandlerMethodName {  get set ; }

        
public   override   bool  Equals( object  obj)
        {
            
if  (obj  ==   null throw   new  ArgumentNullException( " obj " );
            var target 
=  (ConfigItem)obj;
            
return
                SourceType 
==  target.SourceType  &&
                TargetType 
==  target.TargetType  &&
                
string .Equals(SourceEventName, target.SourceEventName)  &&
                
string .Equals(TargetHandlerMethodName, target.TargetHandlerMethodName);
        }
    }

    IList
< ConfigItem >  config  =   new  List < ConfigItem > ();

    
public  EventMediatorBuilder AddConfig(Type sourceType, Type targetType,  string  sourceEventName,  string  targetHandlerMethodName)
    {
        
if  (sourceType  ==   null throw   new  ArgumentNullException( " sourceType " );
        
if  (targetType  ==   null throw   new  ArgumentNullException( " targetType " );
        
if  ( string .IsNullOrEmpty(sourceEventName))  throw   new  ArgumentNullException( " sourceEventName " );
        
if  ( string .IsNullOrEmpty(targetHandlerMethodName))  throw   new  ArgumentNullException( " targetHandlerMethodName " );

        
if  (sourceType.GetEvent(sourceEventName)  ==   null throw   new  NotSupportedException(sourceEventName);
        var item 
=   new  ConfigItem()
        {
            SourceType 
=  sourceType,
            TargetType 
=  targetType,
            SourceEventName 
=  sourceEventName,
            TargetHandlerMethodName 
=  targetHandlerMethodName
        };
        
if  ( ! config.Contains(item))
            config.Add(item);

        
return   this ;
    }

    
public  EventMediatorBuilder BuildAUpColleagues( params   object [] colleagues)
    {
        
if  (colleagues  ==   null throw   new  ArgumentNullException( " colleagues " );
        
if  (config.Count()  ==   0 return   this ;        //   没有通信关系配置项
         if  (colleagues.Count()  ==   1 return   this ;     //   没有需要配置的关联对象组
        colleagues.ToList().ForEach(x  =>  {  if  (x  ==   null throw   new  ArgumentNullException(); });

        
/// /  限制:不支持一类对象的某个实例同时向另一类对象多个实例的通知
         // if (colleagues.GroupBy(x => x.GetType()).Count() != colleagues.Count())
        
//     throw new NotSupportedException();

        
foreach  (var item  in  config)
        {
            var sources 
=  colleagues.Where(x  =>  x.GetType()  ==  item.SourceType);
            
if  ((sources  ==   null ||  (sources.Count()  ==   0 ))
                
continue ;
            var targets 
=  colleagues.Where(x  =>  x.GetType()  ==  item.TargetType);
            
if  ((targets  ==   null ||  (targets.Count()  ==   0 ))
                
continue ;
            var eventInfo 
=  item.SourceType.GetEvent(item.SourceEventName);
            
if  (eventInfo  ==   null )
                
continue ;
            var methodInfo 
=  item.TargetType.GetMethod(item.TargetHandlerMethodName, BindingFlags.Public  |  BindingFlags.Instance);
            
if  (methodInfo  ==   null )
                
continue ;

            
//   绑定事件响应关系
             foreach  (var source  in  sources)
                
foreach  (var target  in  targets)
                    eventInfo.AddEventHandler(source, Delegate.CreateDelegate(eventInfo.EventHandlerType, target, methodInfo));
        }

        
return   this ;
    }
}

 

实现和单元测试验证

 

using  System;
using  System.Diagnostics;
using  System.Collections.Generic;
using  System.Linq;
using  System.Reflection;
using  Microsoft.VisualStudio.TestTools.UnitTesting;
namespace  MarvellousWorks.PracticalPattern.Mediator.Tests.Exercise
{
    [TestClass]
    
public   class  DocumentWorkflowMediatorFixture
    {
        Scenario1.A a1;
        Scenario1.B b1;
        Scenario1.C c1;
        Scenario2.A a2;
        Scenario2.B b2;
        Scenario2.C c2;
        Scenario2.D d2;

        EventMediatorBuilder scenario1Builder;
        EventMediatorBuilder scenario2Builder;

        
///   <summary>
        
///  配置不同协调关系
        
///  实际项目中可以采用本章介绍的基于配置文件的定义方式
        
///   </summary>
        [TestInitialize]
        
public   void  Initialize()
        {
            a1 
=   new  Scenario1.A();
            b1 
=   new  Scenario1.B();
            c1 
=   new  Scenario1.C();
            a2 
=   new  Scenario2.A();
            b2 
=   new  Scenario2.B();
            c2 
=   new  Scenario2.C();
            d2 
=   new  Scenario2.D();

            scenario1Builder 
=   new  EventMediatorBuilder()
                
//   1.    A部门拟稿后将文件报B部门审核
                .AddConfig( typeof (Scenario1.A),  typeof (Scenario1.B),  " WriteDocumentFinishedHandler " " OnReceiveFileToReview " )
                
//   2.    B部门对于文件审核后,确认文件体例没有缺项后就通知C部门发布
                .AddConfig( typeof (Scenario1.B),  typeof (Scenario1.C),  " ReviewDocumentSucceedHandler " " OnReceiveFileToPublish " )
                
//   3.    如果B部门发现文件体例有缺项时,将文件返回给A部门重新修改
                .AddConfig( typeof (Scenario1.B),  typeof (Scenario1.A),  " ReviewDocumentFailedHandler " " OnReviewFailed " )
                
//   4.    C部门在接到B部门传来的文件时,先再发布,然后对其归档
                .AddConfig( typeof (Scenario1.C),  typeof (Scenario1.C),  " DocumentPublishedHandler " " OnReceiveFileToArchive " );


            scenario2Builder 
=   new  EventMediatorBuilder()
                .AddConfig(
typeof (Scenario2.A),  typeof (Scenario2.B),  " WriteDocumentFinishedHandler " " OnReceiveFileToReview " )
                .AddConfig(
typeof (Scenario2.A),  typeof (Scenario2.D),  " WriteDocumentFinishedHandler " " OnReceiveFileToArchive " )
                .AddConfig(
typeof (Scenario2.B),  typeof (Scenario2.A),  " ReviewDocumentFailedHandler " " OnReviewFailed " )
                .AddConfig(
typeof (Scenario2.B),  typeof (Scenario2.D),  " ReviewDocumentFailedHandler " " OnReceiveFileToArchive " )
                .AddConfig(
typeof (Scenario2.B),  typeof (Scenario2.C),  " ReviewDocumentSucceedHandler " " OnReceiveFileToPublish " )
                .AddConfig(
typeof (Scenario2.C),  typeof (Scenario2.D),  " DocumentPublishedHandler " " OnReceiveFileToArchive " );

        }

        
///   <summary>
        
///  测试通过Event Mediator Builder构造现有业务流程下的协作关系
        
///   </summary>
        [TestMethod]
        
public   void  TestScenario1()
        {
            
//   通过Event Mediator以及配置信息建立三个部门Colleague间的协作关系
            
//   所有协调关系统一剥离到作为Mediator的.NET事件机制上
            scenario1Builder.BuildAUpColleagues(a1, b1, c1);

            
//   成功的路径
            Trace.WriteLine( " Succeed path " );
            a1.Write(
" a " " b " " c " );

            
//   失败的路径
            Trace.WriteLine( " \n\nFailed path " );
            a1.Write(
" a " "" "" );

            
//   修正错误的内容,重新执行流程
            Trace.WriteLine( " Modified after review failed path " );
            a1.Write(
" a " " b " " c " );
        }

        
///   <summary>
        
///  测试通过Event Mediator Builder构造管理层期望的未来业务流程下的协作关系
        
///   </summary>
        [TestMethod]
        
public   void  TestScenario2()
        {
            
//   通过Event Mediator以及配置信息建立三个部门Colleague间的协作关系
            
//   所有协调关系统一剥离到作为Mediator的.NET事件机制上
            scenario2Builder.BuildAUpColleagues(a2, b2, c2, d2);

            
//   成功的路径
            Trace.WriteLine( " Succeed path " );
            a2.Write(
" a " " b " " c " );

            
//   失败的路径
            Trace.WriteLine( " \n\nFailed path " );
            a2.Write(
" a " "" "" );

            
//   修正错误的内容,重新执行流程
            Trace.WriteLine( " Modified after review failed path " );
            a2.Write(
" a " " b " " c " );
        }
    }
}

 

 

备注1:现有情景下的A、B、C类型定义

 

namespace  Scenario1
{
    
class  A : Department
    {
        
public   event  EventHandler < DocumentEventArgs >  WriteDocumentFinishedHandler;

        
public   void  Write( string  subject,  string  body,  string  comment)
        {
            
if  (Document  ==   null throw   new  NullReferenceException( " Document " );
            Trace.WriteLine(
" A begin write " );
            Document.Subject 
=  subject;
            Document.Body 
=  body;
            Document.Comment 
=  comment;
            Trace.WriteLine(
" A write finished " );
            Trace.WriteLine(Document);

            
if (WriteDocumentFinishedHandler  !=   null )
                WriteDocumentFinishedHandler(
分享到:
评论

相关推荐

    2106.00487v3

    2106.00487v3

    计算机求职面经内容与技巧分享.pdf

    内容概要:本文详细介绍了计算机求职面试的内容、技巧和备战策略,涵盖技术面、项目面、行为面三大部分。技术面重点在于算法和计算机基础知识,包括操作系统、网络、数据库等方面,并强调掌握高频算法题的解题方法和技巧。项目面要求候选人能够提炼项目的深度与亮点,运用STAR法则结构化描述项目经历,突出技术难点和解决方案。行为面主要考察候选人的软实力,如沟通能力、团队协作和解决问题的能力。高效备战策略方面,建议分阶段复习,优化简历,利用各种资源进行模拟面试。实战技巧部分提供了沟通心态管理、白板代码实战以及薪资谈判的具体指导。最后,文章还指出了常见误区,如盲目刷题、过度包装项目和忽视非技术问题的回答。 适合人群:计算机专业的应届毕业生和有工作经验的求职者,特别是希望进入互联网大厂、外企或独角兽企业的技术人员。 使用场景及目标:①帮助求职者理解计算机岗位面试的核心内容和技术要求;②提供系统的备考计划和资源推荐,提高面试准备效率;③传授面试实战技巧,增强求职者的自信心和表现力;④提醒求职者避免常见误区,确保面试过程顺利。 阅读建议:本文内容详实,建议读者按照文中提供的步骤逐步实施,结合自身实际情况调整策略。同时,注重实践练习,多参与模拟面试,不断总结经验教训,以提升面试成功率。

    MATLAB与CPLEX实现阶梯式碳交易和电制氢的综合能源系统热电优化

    内容概要:本文探讨了利用MATLAB和CPLEX实现综合能源系统(IES)的热电优化,重点介绍了如何通过引入阶梯式碳交易机制和电制氢技术来优化IES的碳排放和经济性能。文章详细解释了目标函数的定义、约束条件的设置以及调用CPLEX求解器的具体步骤。通过分段线性化处理阶梯碳价、优化电制氢过程中的电解槽和氢燃料电池的运行策略,最终实现了购能成本、碳排放成本和弃风成本的最小化。实验结果显示,引入氢能链路使系统碳减排量提升23%,并显著改善了系统的经济性和灵活性。 适合人群:从事能源系统优化的研究人员、工程师及相关领域的研究生。 使用场景及目标:适用于需要优化综合能源系统碳排放和经济性能的场景,旨在通过引入阶梯式碳交易和电制氢技术,降低系统运营成本,减少碳排放,提高能源利用效率。 其他说明:文中提供了详细的MATLAB代码示例,帮助读者理解和实现具体的优化方法。此外,强调了在实际应用中需要注意的技术细节,如单位换算和设备约束等。

    基于MATLAB/Simulink的四旋翼无人机控制算法仿真:PID、反步控制与滑模控制的应用与比较

    内容概要:本文详细介绍了使用MATLAB/Simulink对四旋翼无人机进行仿真的三种主要控制算法——PID控制、反步控制(Backstepping Control)和滑模控制(Sliding Mode Control)。首先,文章解释了每种控制算法的基本原理及其具体实现方法,提供了相应的MATLAB代码片段。接着,通过具体的仿真案例展示了三种控制算法在面对突加风扰情况下的性能表现,包括超调量、恢复时间和抗扰动能力等方面的对比。最后,提出了将不同控制算法组合使用的建议,以达到更好的综合性能。 适合人群:对无人机控制系统感兴趣的科研人员、工程师以及相关专业的学生。 使用场景及目标:适用于希望深入了解并掌握四旋翼无人机控制算法的设计与优化的研究者。目标是在理论学习的基础上,能够利用MATLAB/Simulink平台进行有效的仿真实验,从而提高实际项目的开发效率和技术水平。 其他说明:文中不仅提供了详细的数学推导和代码实现,还给出了具体的参数调整技巧和注意事项,帮助读者更好地理解和应用这些先进的控制算法。此外,作者鼓励读者尝试不同的控制策略组合,探索更多可能性。

    MATLAB实现基于源-荷双重不确定性的虚拟电厂日前随机优化调度

    内容概要:本文详细介绍了如何利用MATLAB和CPLEX进行虚拟电厂的日前随机优化调度。首先,通过蒙特卡洛方法生成大量光伏和负荷的随机场景,然后采用概率距离快速削减算法将这些场景缩减为少数典型场景。接着,构建了一个多场景耦合的线性规划模型,优化目标是在满足各类约束条件下使总运行成本最小化。文中还讨论了储能系统的充放电逻辑及其在不同场景下的行为特征,并展示了优化结果的可视化。 适合人群:从事电力系统优化、智能电网研究的专业人士,以及对随机优化调度感兴趣的科研人员和技术开发者。 使用场景及目标:适用于虚拟电厂、微网等复杂电力系统的日前调度优化,旨在提高系统运行经济性和稳定性,减少不确定性带来的风险。 其他说明:文中提供了详细的MATLAB代码示例,帮助读者理解和复现整个优化流程。此外,作者分享了一些实践经验,如场景削减技巧、约束条件设定等,有助于解决实际应用中的常见问题。

    基于三菱PLC和组态王的4x3堆垛式立体车库控制系统设计与实现

    内容概要:本文详细介绍了基于三菱FX3U系列PLC和组态王软件的4x3堆垛式立体车库控制系统的设计与实现。主要内容涵盖硬件架构、IO分配、梯形图编程、接线技巧、组态王画面设计以及安全逻辑等方面。文中通过具体实例展示了如何利用PLC进行运动控制、互锁保护、状态监测等功能,并分享了一些调试经验和优化方法。此外,作者还强调了接线规范和抗干扰措施的重要性,确保系统的稳定性和可靠性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定基础的人群。 使用场景及目标:适用于需要设计和实施自动化立体车库控制系统的项目。主要目标是帮助读者掌握三菱PLC编程技巧、组态王画面设计方法以及相关硬件选型和接线规范,从而提高工作效率并减少调试时间。 其他说明:文章不仅提供了详细的理论讲解,还结合实际案例进行了深入剖析,使读者能够更好地理解和应用所学知识。

    MATLAB与Simulink中Stewart平台并联机器人的运动学仿真及其实现

    内容概要:本文详细介绍了如何利用MATLAB及其Simulink和Simscape工具箱构建并仿真Stewart平台并联机器人。主要内容涵盖从零开始搭建机械结构、设置球铰链、编写逆运动学算法、处理奇异位形以及优化仿真精度等方面。文中提供了具体的代码片段和调试技巧,确保平台能够精确跟随预设轨迹,误差控制在0.1mm以内。此外,还讨论了如何进行PID整定、能量消耗分析等高级应用。 适合人群:从事机器人研究、运动控制领域的研究人员和技术人员,尤其是对并联机器人感兴趣的学习者。 使用场景及目标:适用于希望深入了解Stewart平台工作原理的研究人员,以及希望通过实例掌握MATLAB/Simulink仿真技能的技术人员。目标是通过动手实践,理解并联机器人的运动学特性,提高仿真效率和准确性。 其他说明:文章不仅提供理论指导,还包括大量实战经验和常见问题解决方案,帮助读者快速上手并解决实际问题。

    p114基于MT5模型的中文文本自动摘要工具.zip

    中文文本自动摘要生成,总共实现三种方式,第一种方式为TextRank,第二种方式为TextRank的变体,修改了相似度衡量方式,第三种方式为深度学习模型MT5生成。同时简单实现UI界面,方便使用。 ​TextRank的方法简单来说就是通过句子间的相似度关系实现对每个句子打分,分数最高的几个句子作为摘要。而mt5则是生成式seq2seq,可简单理解为通过前面的词预测后面的词。总体来看深度学习的mt5的效果会比TextRank好一些。 ​三种方式中,TextRank为无监督方法,不需要任何数据集训练即可使用。MT5模型使用了huggingface上面的开源模型[mT5_multilingual_XLSum](https://huggingface.co/csebuetnlp/mT5_multilingual_XLSum),并使用了NLPCC2017的[task3](http://tcci.ccf.org.cn/conference/2017/taskdata.php)数据集进行微调。 ### TextRank 简单来讲通过句子间的相似度关系实现对每个句子打分,分数最高的几个句子作为摘要。 ##### TF-IDF 简单来说就是我们将每个句子编码成向量,然后使用向量之间的余弦值来衡量相似度。 ### MT5 T5 是 Google 出品的预训练模型,架构为Transformers,训练方式也就是常用的无监督预训练+有监督微调。具体而言没太多可讲的,就是大数据训练

    基于S7-200 PLC和组态王的自动洗车控制系统设计与实现

    内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王软件的自动洗车控制系统的设计与实现。首先对系统的硬件配置进行了介绍,包括PLC的选择、各种传感器和执行机构的连接方式。接着深入探讨了PLC的IO分配、梯形图编程逻辑,特别是针对喷淋、泡沫喷射、风机启动等关键步骤的定时控制。此外,还讲解了组态王的画面设计技巧,如状态指示灯、手动调试窗口以及动画效果的实现方法。文中分享了一些实际调试过程中遇到的问题及其解决方案,强调了硬件安装和软件编程同样重要。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和SCADA系统有一定了解的人群。 使用场景及目标:适用于需要搭建或优化自动洗车控制系统的场合,帮助读者掌握PLC编程技巧、提高故障排查能力,并能够灵活运用组态王进行人机界面设计。 其他说明:文章不仅提供了详细的理论指导,还结合了作者的实际经验教训,为读者提供了一个完整的项目实施案例。

    基于LABVIEW的西门子PLC数据采集处理程序设计与实现

    内容概要:本文详细介绍了一款基于LABVIEW开发的通用型PLC通讯与数据处理程序。该程序主要用于与西门子PLC进行通讯,完成数据采集、存储、回放、处理及报警显示等功能。文中具体介绍了各个功能模块的实现方法和技术要点,包括OPC协议通讯、内存和CSV文件存储、数据回放与处理、报警逻辑等。此外,作者还分享了一些开发过程中遇到的问题及其解决方案。 适合人群:从事工业自动化领域的工程师、技术人员,尤其是熟悉LABVIEW和PLC编程的专业人士。 使用场景及目标:适用于需要进行工业数据采集和处理的各种项目,旨在帮助开发者快速构建稳定可靠的数据采集系统,提高工作效率。 其他说明:文中提供了详细的代码示例和注意事项,有助于读者更好地理解和应用相关技术。同时,该程序具有良好的扩展性和灵活性,可以根据具体需求进行定制化开发。

    方形垫片落料冲孔复合模设计说明书.doc

    方形垫片落料冲孔复合模设计说明书.doc

    地中海风格居住空间设计 毕业设计说明书.doc

    地中海风格居住空间设计 毕业设计说明书.doc

    基于FPGA与Verilog的交通信号灯控制系统设计与实现

    内容概要:本文详细介绍了如何利用FPGA和Verilog语言设计并实现一个交通信号灯控制系统。首先,通过定义状态机作为核心控制单元,将交通灯的工作流程分为四个主要状态:南北绿灯、南北黄灯、东西绿灯和东西黄灯。接着,设计了一个25位宽的计数器用于精确控制各状态的持续时间,确保每个状态都能按时切换。此外,还实现了输出逻辑,根据当前状态控制各个方向的红绿灯。为了便于调试,文中提供了仿真方法以及一些实用的小技巧,如缩短时间参数以便于观察波形。最后,讨论了实际部署过程中需要注意的问题,如LED连接的安全措施和可能的功能扩展。 适合人群:对FPGA开发感兴趣的电子工程学生、嵌入式系统开发者和技术爱好者。 使用场景及目标:适用于希望深入了解FPGA编程及其应用场景的人群,特别是那些希望通过实际项目掌握Verilog语言和状态机设计的学习者。目标是帮助读者理解如何从理论到实践完成一个完整的FPGA项目。 其他说明:文中不仅涵盖了基本的设计思路和技术要点,还包括了许多实践经验分享,如如何避免常见的错误(例如状态切换时的毛刺),以及如何优化设计以适应不同环境的需求。

    2022213233陆 晗 (1).docx

    2022213233陆 晗 (1).docx

    generator-128.tflite

    一个深度卷积生成对抗网络(DCGAN)模型被用于图像增强(超分辨率、去噪等)

    as课程设计说明书.doc

    as课程设计说明书.doc

    基于Matlab的直流微电网模型构建与优化:功率波动及母线电压控制

    内容概要:本文详细介绍了如何利用Matlab/Simulink构建一个典型的直流微电网模型,涵盖光伏电池、锂电池组、直流负载以及VSC松弛母线四大组件。文章深入探讨了各个组件的关键控制算法和技术细节,如VSC的电流内环控制、光伏系统的MPPT算法、DAB转换器的移相控制以及负载端的降压转换器设计。同时,针对不同组件之间的协调控制进行了细致讨论,确保系统在面对功率波动时能够保持稳定的母线电压。文中还提供了许多实用的调试技巧和注意事项,帮助读者更好地理解和应用这些技术。 适合人群:从事电力电子、新能源领域的研究人员和工程师,特别是那些希望深入了解直流微电网建模及其控制策略的人士。 使用场景及目标:适用于研究和开发直流微电网系统的实验室环境,旨在提高系统的稳定性、可靠性和效率。主要目标是掌握直流微电网中各部件的工作原理及其相互协作机制,从而能够在实际项目中进行有效的系统设计和优化。 其他说明:文章不仅提供了详细的理论解释,还包括具体的MATLAB代码片段,便于读者动手实践。此外,作者分享了许多宝贵的实践经验,有助于避免常见的错误并提高仿真的准确性。

    西门子S7-1511 PLC PID控制与模拟量转换技术详解及应用

    内容概要:本文详细介绍了使用西门子S7-1511 PLC进行PID控制的具体方法和技术要点,涵盖硬件组态、模拟量转换、PID功能块配置以及WinCC画面设计等方面。首先讲解了硬件组态的关键步骤,如正确配置AI/AO通道参数,确保信号传输的稳定性。接着深入探讨了4~20mA信号与实际工程值之间的转换方法,提供了具体的SCL函数实现。对于PID控制部分,则着重讲述了PID_Compact功能块的应用,包括参数配置、手自动切换逻辑的设计等。此外,还特别强调了WinCC画面设计的三个重要元素:阀门状态动态显示、实时趋势图和操作面板。文中不仅给出了详细的代码示例,还分享了许多宝贵的调试经验和常见问题解决方案。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程有一定基础并希望深入了解PID控制机制的人士。 使用场景及目标:适用于需要精确控制阀门开度或其他类似应用场景的企业,旨在帮助技术人员掌握PID控制系统的搭建与优化技巧,提高生产效率和产品质量。 其他说明:文章内容丰富实用,既有理论指导又有实践经验分享,能够有效提升读者的实际操作能力。

    基于三菱PLC与显控触摸屏的自动锁螺丝机程序设计及应用

    内容概要:本文详细介绍了自动锁螺丝机程序的设计与实现,主要采用了显控触摸屏和三菱PLC(FX3GA或FX3U)。文章首先探讨了数据存储与配方实现,利用D1000-D7999寄存器区进行数据存储,并通过变址寄存器V和Z实现配方管理。其次,讨论了电批选择与螺丝位置调整的功能,支持示教调整每颗螺丝位置,提高了操作灵活性。再次,阐述了打螺丝颗数设置与起始位置设定,允许设定从任意一颗螺丝开始打,并支持最大50颗螺丝的设定。此外,还介绍了型号查询功能,通过触摸屏输入型号代码,快速调出对应的配方数据。最后,强调了系统的硬件配置及其在实际生产中的应用价值。 适合人群:从事自动化控制系统开发的技术人员,尤其是熟悉三菱PLC和显控触摸屏的工程师。 使用场景及目标:适用于需要高精度、高效能螺丝紧固作业的生产线,旨在提高生产效率,减少人工干预,降低错误率。 其他说明:文中提供了详细的PLC编程实例,帮助读者更好地理解和实现相关功能。同时,针对不同品牌电批的选择和控制进行了说明,有助于优化设备性能。

    基于S7-200 PLC和组态王的自动扶梯控制系统设计与调试

    内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王上位机的自动扶梯控制系统的设计与调试过程。系统硬件架构包括PLC主控单元、变频器和编码器等组件,通过合理的IO分配和梯形图编程实现扶梯的安全控制和高效运行。文章还分享了多个调试经验和常见问题解决方案,如编码器干扰、变频器过载报警以及组态王数据延迟等问题。此外,文中强调了安全回路设计的重要性,并展示了如何利用组态王进行远程监控和故障诊断。 适合人群:自动化工程师、电气工程师、PLC程序员及相关技术人员。 使用场景及目标:适用于需要设计和调试自动扶梯控制系统的工程项目。目标是提高系统的安全性、稳定性和效率,降低故障率,提升用户体验。 其他说明:本文不仅提供了详细的硬件选型和技术实现方法,还分享了许多宝贵的实践经验,对于从事类似项目的人员具有很高的参考价值。

Global site tag (gtag.js) - Google Analytics