求助C# 读取组态王 OPC

dlh13 2017-06-27 02:44:12
我在使用C#读取组态王OPC时,可以将变量点全部读到,但变量点没有任何值,求大神指点
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 CollectorSystem
{
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)
{
//连接到本地服务器;
StartCliend("127.0.0.1");
//得到项的个数;
int itemCount = ReadItemNo();
StringBuilder regname = new StringBuilder(256);
string[] name = new string[itemCount];
//得到所有的Item;
for (int i = 0; i < itemCount - 1; i++)
{
GetItemNames(regname, i);
name[i] = regname.ToString();
}
//输出所有的Item;
//for (int i = 0; i < itemCount - 1; i++)
//{
// Console.WriteLine(name[i].ToString());
//}

int[] tagId =new int[itemCount];
int[] tagType =new int[itemCount];
//开始将要监控的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];
//开始读取数据;
for (int x = 1; x <5; x++)
{

for (int i = 43; 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());

// textBox1.Text = sValString[i].ToString();


}
}

}


}
}
...全文
551 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
SoulRed 2017-06-28
  • 打赏
  • 举报
回复
估计其中有逻辑错误
下面这段代码是网上抄来的,相信有人也找到过这段,实际上真正运行的时候就会发现其实是有问题的,我把它修改了下,能正常读写了。 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 { /// /// 与组建立连接 /// 每次应用程序启动时,必须用该函数与组建立连接 /// /// node为节点(IP),如果是本机,其值为空 /// 返回错误码,见附录。 [DllImport("kingvewcliend.dll")] public static extern int StartCliend(string node); /// /// 得到组SDK中列出的项目(包括变量及其域)总数 /// [DllImport("kingvewcliend.dll")] public static extern int ReadItemNo(); /// /// 得到某个项目的名称 /// 将返回组的项目的名称 /// 为用户写入的其要取的变量的索引号,其为ReadItemNo返回的范围内的某个数 /// 返回错误码,见附录 /// [DllImport("kingvewcliend.dll")] //[SecurityPermission(SecurityAction.Assert, Unrestricted = true)] public static extern int GetItemNames(StringBuilder sName, int wItemId); /// /// 将某个项目添加到采集列中 /// 是要加入采集的项目名 /// TagId项目采集的标识号 /// 项目的数据类型 /// 返回错误码,见附录 /// [DllImport("kingvewcliend.dll")] public static extern int AddTag(string sRegName, ref int TagId, ref int TagDataType); /// /// 向某个项目中有应用程序向组方向写数据 /// /// 为要采集项目的标识号 /// bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值 /// bVal、lVal、fVal、sVal为设定的数值,用户将根据变量的类型设定数值 /// b

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧