MSMQ和.Net Remoting在MES开发中的应用

 1 引 言

    MES(制造执行系统)是近10年来在国际上迅速发展、面向车间层的生产管理技术与实时信息系统,是用来辅助生产管理人员收集现场资料并控制现场制造流程的应用软件,是企业改善制造流程、提高生产效益的工具。在其开发应用中,基于各类生产事件的消息通信机制是系统的莺要功能之一。保证消息通信的可靠性、稳定性并控制网络通信开销是MES消息通信机制开发的重点。在以往的开发应用中,现场各生产工位HMI利用Socket向MES服务器发送生产消息,服务器收到消息后作消息解析并生成生产事件,生产事件客户端采用轮询的方式获得相关生产事件并做出响应。其中,存在如下问题:

    (1)当网络发生故障时,Socket无法保证生产事件消息的送达,导致生产消息丢失;
    (2)当生产事件频发时,MES服务器处理负担增加,系统性能下降;
    (3)采用轮询方式。降低系统性能并增加网络通信开销。

2 系统解决方案分析

    利用微软消息队列MSMQ和.Net Remoting技术,能够有效避免上述问题,为构建MES生产事件消息通信机制提供良好的解决方案。

    2.1 利用MSMQ实现生产消息传递

    MSMQ(Microsoft Message Queue,微软消息队列)是一种利用队列机制实现应用程序问通信的技术,允许应用程序以异步的、非实时的方式互相传递信息。

    利用MSMQ来传递MES生产事件消息,借助MSMQ的“离线”发送消息的特性(客户端可以在与服务器无法建立连接的情况下即时发送消息,未送达的消息暂存于客户端的消息队列中,待连接成功建立后立即发送,而且保证消息只发送一次),可以有效避免消息的丢失和重传;同时,MSMQ的异步通信特性为服务器提供了良好的消息缓冲机制,有效降低了消息高峰时服务器端的负载。

    2.2 利用.Net Remoting实现生产消息订阅

    .Net Remoting是一种分布式对象技术,是在.NET框架中执行进程问通信的方式,它允许运行在另一机器上的应用程序、进程或者对象访问某机器上运行的对象,让远程对象看上去像本地的一样。

    在.Net Remotin只中使用事件,能方便实规远程事件回调机制,让服务器在接收到某个“消息”时,主动调用某个或多个客户端的响应方法。利用该技术,可以实现 MES中事件客户端灵活订阅服务器生产事件的功能,解决轮询方式造成的系统负担,提高系统的灵活性。

3 系统设计与实现

    3.1 系统设计

    将MSMQ和.Net Remoting引入MES生产事件消息通信机制,利用MSMQ实现生产事件消息的传递,利用.Net Rerooting实现生产事件的订阅。其中,MSMQ触发器实现生产事件消息的触发,.Net Remoting的事件回调作为触发器的调用对象,以COM组件的形式定义封装。系统的结构,如图1所示:


3.2 系统实现

    3.2.1 MSMQ消息传递实现要点

    MSMQ消息传递的实现过程主要包括:MSMQ组件安装与配置、消息队列建立、消息类定义、用于触发的COM组件定义、消息队列触发器建立和消息发送代码编写。以下,对其中的要点加以说明:

    (1)消息队列类型及引用

    服务器端定义的生产消息队列中,用于远程通信的队列,定义为公有类型;用于本地通信的队列,定义为私有类型。在引用方式上,有三种方法可以在代码中引用一个队列:通过路径、通过格式名、通过标签。两类不同消息队列采用不同的引用方式。

    ·公有队列:采用格式名方式,通过消息队列GUID引用,引用格式为MQPath=FORMATNAME:Public=QueueGUID,如 String MQPath=“FORMATNAME:Public=DOC7684-E289-4E99-A81A-FB6FA D3CDD18”;

    ·私有队列:采用路径方式.引用格式为MQPath=.\Private$\QueueName,如String MQPath=“.\Private$kAlarmEventQueue”。

    (2)消息类定义

    消息队列中传递的消息内容需要按生产事件类型进行封装,因此需要定义消息类,分别部署在客户端和服务端,用于发送封装和接收解析。按照生产事件的分类,分别定义四类消息类:报警事件消息类、生产事件消息类、计划事件消息类和停机事件消息类。其中报警事件消息类定义如图2所示:


图2 报警事件消息类定义可恢复属性配置


    (3)消息发送

    向消息队列发送消息分为:建立消息队列引用、建立消息对象和消息发送三个步骤。以报警事件发送为例,代码如下:

    //建立消息队列引用
    string QueueLoeation=@“.\PrivateSLAlarmEventQueue”;
    if(System.Messaging.MessageQueue.Exists(QueueLocation))
    queue=new System.Messaging.MessageQueue(QueueLocation);
    else
    queue=System.Messaging.MessageQueue.Create(QueueLocation);
    //建立消息对象
    System.Messaging.Message msg=new System.Messaging.Message();
    msg.Body=msgAlarmEvent;//指明消息体
    msg.Recoverable=true;//设置町恢复属性
    //消息发送
    queue.Send(msg);

    (4)消息接收

    从消息队列接收消息分为:建立消息队列引用、消息接收和消息解析(反序列化)三个步骤。此部分代码位于用于消息队列触发的COM组件定义中,以报警事件为例,代码如下:

    //建立消息队列引用
    System.Messaging.MessageQueue queue=new MessageQueue(@“.\Private$\AlarmEventQueue”);
    //消息接收,Peek方法使消息不从队列中删除
    System.Messaging.Message msg=queue.Peek();
    //消息解析,采用默认方式XmlMessageFormatter反序列化消息
    msg.Formatter=new XmlMessageFormatter(new Type({type of(MsgAlarmEvent)});
    MsgAlarmEvent MannEvent=(MsgAlarmEvent)msg.Body;

3.2.2 .Net Remoting事件订阅实现要点

    .Net Rerooting事件订阅实现过程主要包括:事件委托定义、远程事件类定义、远程事件对象发布(封装成Windows服务)、订阅事件回调(包含在消息队列触发的COM组件中)和客户端接口封装。以下对其中的要点加以说明:

    (1)事件委托定义

    按照生产事件的分类,分别定义四类不同的委托,以报警事件为例:
    public delegate void NotifyAlarmEventHandler(int alarmid,DateTime timestamp,int causeid,string alarmdesc);

    (2)远程事件类定义

    远程事件类的实例需要以引用的方式传递,因此该类需要继承MarshalByRefObject类(通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类)。同时复写MarshalByRefObjeet类的InitializeLifetimeService()方法,让其返回空以保证远程对象永远不会过期。类成员包括相应类型的事件委托和触发事件回调的方法。

    (3)One Way属性和事件委托链

    在远程对象中定义的触发事件回调的方法必须标记为“[OneWay]”,指明该方法为单向方法。否则,由于.Net Remoting是按照事件订阅的顺序来回调客户端方法的,服务器将一直等待当前回调返回才能触发下一个回调,这便影响了客户端对事件的响应速度,尤其当某砦客户端回调方法占用大量时间或执行发生异常时。另外,使用遍历事件委托链的方式来触发回调,可以处理客户端无法接收的错误,增强系统的健壮性。以报警远程事件类为例,其触发事件方法代码如下:

    [OneWay]
    public void SendEvent(int alarmid,DateTime timestamp,int eauseid,string alarmdesc){
    if(NotifyEvent!=null){
    Notif,rAlarmEventHandler tempEvent=null;
    foreach(Delegate del in NotifyEvent.GetlnvocationList()){
    try{tempEvent=(Notff)rAlarmEventHandler)del;
    tempEvent(alarmid,timestamp,causeid,alarmdesc);
    }catch{//处理客户端无法接收错误}
    }
    }else{//处理没有客户端订阅错误}
    }

    (4)客户端接口封装

    客户端接口封装需要为客户端提供远程对象获取接口、事件订阅接口、事件取消订阅接口和客户端回调方法定义接口。通过建立EventClient抽象类来封装这些接口,分别定义Initialize()、EventRegister()、EventUnRegister()和 AlarmEventOperate()等事件回调方法来实现。为了客户端能够A定义回调方法,AiarmEventOperate()等事件回调方法定义为抽象方法。

4 结束语

    本文创新点:将MSMQ和.Net Remoting技术引入MES生产事件消息通信机制,利用MSMQ实现生产事件消息的传递,利用.Net Remoting实现生产事件的订阅,通过MSMQ触发器实现两部分的紧密结合,有效解决了以往应用中遇到的问题,确保了生产消息的可靠送达、生产事件的灵活订阅和接收,提高了系统的可靠性和灵活性。

    在实际应用中,该生产事件消息通信机制成功应用于东风朝阳柴油机厂装配车间MES系统,取得了良好的效果。

 

 

你可能感兴趣的:(String,socket,制造,服务器,Microsoft,System)