我对面的桌子没了

来源:互联网 发布:淘宝网上代理卖东西 编辑:程序博客网 时间:2024/04/27 17:17

昨天晚上奋战到2点,把老杜要的程序搞定了,今天发过去了。还不知道怎样呢,今天继续沉闷,对面的桌子也没有了。

需要写一点程序的总结了。

关于最近所作的程序的总结。程序完成的功能是能够通过局域网上的一台计算机控制一个网络内的另外一台计算机中的画面切换功能。

完成这个功能需要两台机器配合,运行组态的计算机可以通过FB系统功能实现画面切换,操作的计算机能够控制组态计算机的变量。假设A机运行组态,B机作为控制操作站。A机中的变量的改变能够驱动执行FB进而完成画面切换,那么B机中要实现的任务就是改变A机中的变量。

2个方法可完成这个功能,第一、通过OPC实现,第二、通过Socket来实现。鉴于自身的经验和技术水平,采用第二种方式,也就是Socket来实现。

还是采用LY.FMLib这个名称空间中的类来实现。DeviceData用来处理数据,只不过增加了dChangeArray这么一个数组,该数组的作用是接受外部传递过来的彝族需要改变的数据。净数据,完全不涉及命令的格式。具体拼装完整的命令格式的工作交由FMSocket这个类来完成。

在FMSocket这个类中,增加了一组方法,说是一组方法,是因为我决定采用异步调用的方式来完成一次通信。主方法如下:

  /// <summary>
  /// 改变开关量数据
  /// </summary>
  public void ChangeDData()
  {   
   int DataLen;
   int CmdLen;

   try
   {
    DataLen=this.ExData.dChangeArray.Length; //需要改变的字节数组的长度
    CmdLen=DataLen+this.ReChange.Length;  //命令字节数组的总长度

    CmdWithData=new byte[CmdLen];
    System.Buffer.BlockCopy(this.ReChange,0,CmdWithData,0,this.ReChange.Length);
    CmdWithData[ReChange.Length-1]=(byte)this.ExData.dChangeArray.Length;
    System.Buffer.BlockCopy(this.ExData.dChangeArray,0,CmdWithData,this.ReChange.Length,this.ExData.dChangeArray.Length);
    DevSocket.BeginSend(CmdWithData,0,CmdWithData.Length,0,new AsyncCallback(this.ChangeCallback),DevSocket);
   }
   catch(SocketException e)
   {
    this.OnError(EventArgs.Empty,e.Message);
   }
  }

与该方法对应的回调方法如下: 

  /// <summary>
  /// 改变数据的方法的回调方法
  /// </summary>
  /// <param name="ar"></param>
  private void ChangeCallback(IAsyncResult ar)
  {
   DevSocket=(Socket)ar.AsyncState;
   try
   {
    int SC=DevSocket.EndSend(ar);
   }
   catch(SocketException e)
   {
    this.OnError(EventArgs.Empty,e.Message);
   }
  }

我在主方法和回调方法中都设置了错误捕获的代码。希望保证Socket的调用是成功的,在发生失败的时候能够提示用户相关的错误信息。

而且我在LY.FMLib这个名称空间中定义了发生错误的委托,这样希望能够给用户一个友好的提示。委托是这样的:

public delegate void ErrorEvHandler(object sender,EventArgs e,String ErrMsg);

我把通信过程中捕获到的错误用一种错误消息转发出去。

注意,我在程序(FMSocket.cs)中定义了一个数组:

private byte[] ReChange={0x3E,0x2A,212,0,0,0,0}; //请求改变开关量的命令

该数组是根据要求Fameview的要求设定的。其中的“212”就是说要改变开关变量的数据。在上述方法中使用了CmdLen来拼成一个完整的数据包,然后发送到指定的端口中,剩下的事情就是等待回调的完成了。回调正确完成时也就是远程计算机中的变量被更改的时候了。

这个都不是主要的问题,主要的问题是界面上的,它耗费了我大部分时间,下次再说。