C#访问OPC.SimaticNet的客户端

2023-08-13  本文已影响0人  大龙10

一、SimaticNet

  SimaticNet是西门子全集成自动化系统中的一个重要组成部分,它为完善的工业自动化控制系统的通讯提供部件和网络,同时提供多个OPCServer,为数据的外部访问提供接口。
  采用不同的通信方式,通过OPC.SimaticNET,现场数据可以方便地提供给用户

二、OPC的读写方式

  在实际使用中,主要包括对现场数据的读写操作。
  OPC读数有三种方式:同步、异步、订阅。

三、OPC访问接口方式

  OPC主要包含两种接口:
  CUSTOM标准接口和OLE自动化标准接口,自定义接口是服务商必须提供的,而自动化接口则是可选的。

四、OPC.SimaticNet的数据访问

五、C#访问OPC.SimaticNet的客户端程序

建立连接S7_connection_1

五、C#自动化接口

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Text;
        using System.Windows.Forms;
        using System.Collections;
        using OPCSiemensDAAutomation;//引用连接库

1、第一步

添加下列命名空间(首先在COM组件中添加相应组件)
using OPCSiemensDAAutomation;

2、第二步

定义OPC相关变量

        OPCServer MyOpcServer; //定义OPCServer
        OPCGroup MyOpcGroup; //定义组
        OPCItem MyOpcItem1; //Item
        OPCItem MyOpcItem2; //值
        long[] ServerHandle = new long[2]; //Item的句柄

3、第三步

建立连接及对象

MyOpcServer = new OPCServer();
MyOpcServer.Connect("OPC.SimaticNet", "192.168.0.102");
MyOpcGroup = MyOpcServer.OPCGroups.Add("MyGroup1");
MyOpcItem1 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT0",1);
MyOpcItem2 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT2", 2);
ServerHandle[0] = MyOpcItem1.ServerHandle;
ServerHandle[1] = MyOpcItem2.ServerHandle;

4、第四步

同步读数据

        private void Btn_Read_S_Click(object sender,EventArgs e)//同步读数据
            {
          ……
          MyOpcItem1.Read(1,out ItemValues,out Qualities, out TimeStamps);
        //ItemValues,Qualities,TimeStamps分别是值,质量码
        //也可以通过调用SyncRead函数,参数可参考异步读函数
            ……
        }

5、第四步

同步写数据

private void Btn_Write_S_Click(object sender,EventArgs e)
         {
          ……
          MyOpcItem1.Write(Txt_W1.Text);
        //也可以通过调用SyncWrite函数,参数可参考异步写函数
        ……
        }

6、第五步

异步事件定义。
在异步操作情况下,需要定义相应的异步事件.

MyOpcGroup.DataChange +=new DIOPCGroupEvent_DataChangeEventHandler(MyOpcGroup_DataChange); //
     //订阅方式下数据改变
iteComplete +=new   DIOPCGroupEvent_AsyncWriteCompleteEventHandler(MyOpcGroup_WriteComplete);
//写完成事件
MyOpcGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(MyOpcGroup_ReadComplete);
//读完成事件
MyOpcGroup.AsyncCancelComplete += new
DIOPCGroupEvent_AsyncCancelCompleteEventHandler(MyOpcGroup_CancelComplete);
        //取消操作事件        在使用中注意,其事件函数要按照特定接口:
    
void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,
ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)
    
void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles,
        ref Array Errors)
    
void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array
        ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,
        ref System.Array TimeStamps,ref System.Array Errors)
    
void MyOpcGroup_CancelComplete(int CancelID)

7、第六步

订阅方式读

        void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,
        ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)
            {
          ……
        //注意数据改变时,Item数量要通过NumItems得到,也就是说只有数据改变时,才对一遍,所以降低了服务器负担。要注意读语句写法。
        ……
        }

8、第七步

异步读

        private void Btn_Read_A_Click(object sender,EventArgs e)//异步读事件
                {
        int[] handle = new int[3] {ServerHandle[0], ServerHandle[1],0};//注意方式
        Array MyServerHandles = (Array)handle;
        Array errors;
        int cancelID;
          ……
        MyOpcGroup.AsyncRead(2, ref MyServerHandles, out errors, READASYNC_ID, out cancelID);
        ……
         }
    
        void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array   ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,   
        ref System.Array TimeStamps,ref System.Array Errors)
                {
          ……
        //注意TransactionID的对应
        ……
        }

9、第八步

异步写

        private void Btn_Write_A_Click(object sender,EventArgs e)
            {
          ……
        MyOpcGroup.AsyncWrite(2,ref MyServerHandles, ref Myvalues,out errors,WRITEASYNC_ID,out cancelID);
          ……
        }
    
        void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles  ref Array Errors)
                {
          ……
        }

10、第九步

释放对象

        private void Btn_Disconn_Click(object sender,EventArgs e)
        {
          ……
        }

11、OPCItem的数据类型:

    在通过自定义接口访问时,
        ItemArray[1].szAccessPath = "";
         ItemArray[1].szItemID = "S7:[S7 connection_1]DB10,Real4";//地址,不同数据类型表示
             ItemArray[1].bActive = 1;//是否激活
             ItemArray[1].hClient = 2;//表示ID
             ItemArray[1].dwBlobSize = 0;
             ItemArray[1].pBlob =IntPtr.Zero;
             ItemArray[1].vtRequestedDataType = 5;

             ItemArray[2].szAccessPath = "";
             ItemArray[2].szItemID = "S7:[S7 connection_1]DB10,STRING26.10";//地址,不同数据类型表示方法不同
             ItemArray[2].bActive = 1;//是否激活
             ItemArray[2].hClient = 3;//表示ID
             ItemArray[2].dwBlobSize = 0;
             ItemArray[2].pBlob =IntPtr.Zero;
                ItemArray[2].vtRequestedDataType = 8;

六、资料

# [电子发烧友]博客:
https://m.elecfans.com/article/1895379.html
上一篇 下一篇

猜你喜欢

热点阅读