对组态王OPC服务器值的读取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.Runtime.InteropServices;
namespace kingview
{
    
public partial class Form1 : Form
    {
        
/// <summary>
        
/// 与组态王建立连接
        
/// 每次应用程序启动时,必须用该函数与组态王建立连接
        
/// </summary>
        
/// <param name="node">node为节点(IP),如果是本机,其值为空</param>
        
/// <returns>返回错误码,见附录。</returns>
        [DllImport("kingvewcliend.dll")]
        
public static extern int StartCliend(string node);

        
/// <summary> 
        
/// 得到组态王SDK中列出的项目(包括变量及其域)总数 
        
/// </summary> 
        [DllImport("kingvewcliend.dll")]
        
public static extern int ReadItemNo();

        
/// <summary> 
        
/// 得到某个项目的名称 
        
/// <param name="sName">将返回组态王的项目的名称</param> 
        
/// <param name="wItemId">为用户写入的其要取的变量的索引号,其为ReadItemNo返回的范围内的某个数</param> 
        
/// <returns>返回错误码,见附录</returns> 
        
/// </summary> 
        [DllImport("kingvewcliend.dll")]
        
//[SecurityPermission(SecurityAction.Assert, Unrestricted = true)]

        
public static extern int GetItemNames(StringBuilder sName, int wItemId);


        
/// <summary> 
        
/// 将某个项目添加到采集列中 
        
/// <param name="sRegName">是要加入采集的项目名</param> 
        
/// <param name="TagId">TagId项目采集的标识号</param> 
        
/// <param name="TagDataType">项目的数据类型</param>
        
/// <returns>返回错误码,见附录</returns> 
        
/// </summary> 
        [DllImport("kingvewcliend.dll")]
        
public static extern int AddTag(string sRegName, ref int  TagId, ref int TagDataType);

        
/// <summary>
        
/// 向某个项目中有应用程序向组态王方向写数据
        
/// </summary>
        
/// <param name="TagId">为要采集项目的标识号</param>
        
/// <param name="bVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="lVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="fVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="sVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <returns>返回错误码,见附录</returns>
        [DllImport("kingvewcliend.dll")]
        
public static extern int WriteTag(ushort TagId, bool bVal, long lVal, float fVal, ref  char sVal);


        
/// <summary>
        
/// 从组态王中读某个项目的数据
        
/// </summary>
        
/// <param name="TagId">要采集的变量的表示号</param>
        
/// <param name="bVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="lVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="fVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <param name="sVal">bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值</param>
        
/// <returns>返回错误码,见附录</returns>
        [DllImport("kingvewcliend.dll")]
        
public static extern int ReadTag(int TagId, ref bool bVal, ref long lVal, ref Single fVal, StringBuilder sVal);

        
/// <summary>
        
/// 断开与组态王OPC的连接
        
/// </summary>
        
/// <returns>返回错误码,见附录</returns>
        [DllImport("kingvewcliend.dll")]
        
public static extern int StopCliend();

        
//        错误码含义
        
//0
        
//连接成功
        
//-1
        
//OPC SERVER已经被非法关闭
        
//-2
        
//找不到OPC SERVER的PROGID
        
//-3
        
//连接OPC SERVER不成功
        
//-4
        
//枚举ITEMS错误
        
//-5
        
//OPC SERVER没有定义ITEMS
        
//-6
        
//内存分配错误
        
//-7
        
//在向GROUP中加入ITEMS时出现错误
        
//-8
        
//未使用
        
//-9
        
//读ITEMS时出现错误
        
//-10
        
//不能识别的数据类型
        
//-11
        
//读ITEMS的质量戳时出现错误
        
//-12
        
//向ITEMS中写入数据时出现错误
        
//-13
        
//用户添加变量的变量名错误
        
//-14
        
//用户读取的变量序号越界


        
public Form1()
        {
            InitializeComponent();
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine(
"连接到本地服务器···");
            StartCliend(
"");
            Console.WriteLine(
"得到项的个数");
            
int itemCount = ReadItemNo();
            Console.WriteLine(
"得到项的个数为:"+itemCount.ToString());
            StringBuilder regname 
= new StringBuilder(256);
            
string[] name = new string[itemCount];
            Console.WriteLine(
"得到所有的Item····");
            
for (int i = 0; i < itemCount - 1; i++)
            {
                GetItemNames(regname, i);
                name[i] 
= regname.ToString();
            }
            Console.WriteLine(
"输出所有的Item····");
            
for (int i = 0; i < itemCount - 1; i++)
            {
                Console.WriteLine(name[i].ToString());
            }

            
int[] tagId =new int[itemCount];
            
int[] tagType =new int[itemCount];
            Console.WriteLine(
"开始将要监控的Item添加····");
            
for (int i = 0; i < itemCount - 1; i++)
            {
                AddTag(name[i].ToString(), 
ref tagId[i], ref tagType[i]);
            }

            
bool[] bVal = new bool[itemCount];
            
long[] lVal = new long[itemCount];
            Single[] fVal 
= new Single[itemCount];
            StringBuilder sVal 
=new StringBuilder(255);
            
string[] sValString = new string[itemCount];
            Console.WriteLine(
"开始读取数据····");
            
for (int x = 1; x <5; x++)
            {
                Console.WriteLine(
""+x.ToString()+"次读取数据:");
                
for (int i = 0; i < itemCount - 1; i++)
                {
                    ReadTag(tagId[i], 
ref bVal[i], ref lVal[i], ref fVal[i], sVal);
                    sValString[i] 
= sVal.ToString();
                    Console.WriteLine(
"item:" + name[i].ToString() + "值:" + sValString[i].ToString());
                }

            }
        }


    }
}
posted @ 2009-05-07 11:54  yongbin621  阅读(4574)  评论(2编辑  收藏  举报