c# 与组态王 OPC Server通讯问题

小海贼 2016-12-27 02:54:50
我在用c#于组态王opcserver通讯是碰到一个问题:
我在c#程序中设置组态变量,如果这个变量时布尔型的能成功,但这个变量时float的怎么也写不成功,每次写入后该变量就会变成0了;写入函数的返回值也是0,是表示成功写入的;
我在c#中的写入代码是:
-------------首先我与组态王OPC通讯是基于组态王的客户端组件:kingvewcliend.dll,这个我是在组态王安装目录下找到的
----------- 相关的方法我也是在网上找的http://blog.csdn.net/xwnxwn/article/details/45008117
[DllImport("kingvewcliend.dll")]
public static extern int StartCliend(string node);
[DllImport("kingvewcliend.dll")]
public static extern int ReadItemNo();

[DllImport("kingvewcliend.dll")]
//[SecurityPermission(SecurityAction.Assert, Unrestricted = true)]
public static extern int GetItemNames(StringBuilder sName, int wItemId);
[DllImport("kingvewcliend.dll")]
public static extern int AddTag(string sRegName, ref int TagId, ref int TagDataType);

[DllImport("kingvewcliend.dll")]
public static extern int WriteTag(ushort TagId, bool bVal, long lVal, float fVal, StringBuilder sVal);

[DllImport("kingvewcliend.dll")]
public static extern int ReadTag(int TagId, ref bool bVal, ref long lVal, ref Single fVal, StringBuilder sVal);

[DllImport("kingvewcliend.dll")]
public static extern int StopCliend();

---------------下面的是我写入的代码
float f=100F;//要向段长设定这个字段写入100这个值
MyStartCliend("127.0.0.1");
int iTagID = 0;
int iTagType = 0;
int iRet;
try
{
iRet = AddTag("段长设定.Value", ref iTagID, ref iTagType);
bool blV = true;
long lV = (long)f;//这个是我测试一下的,我怕是要写入长整型,最初是设置为0的,也是一样结果
StringBuilder sb = new StringBuilder(0);
iRet = WriteTag((ushort)iTagID, blV, lV, f, sb);
AddMsg(string.Format("字段类型:{0},写入{1}返回值为{2}", iTagType, f, iRet));// 用于返回写入结果
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
--------------------结束
以上代码中“段长设定”是我在组态王中定义的一个变量




...全文
1221 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小海贼 2016-12-28
  • 打赏
  • 举报
回复
看来,我要白花这60个积分了,帖一直往下沉....
qq_36504065 2016-12-27
  • 打赏
  • 举报
回复
引用 1 楼 小海贼的回复:
不会没人明白我在说什么吧?
我看懂了组态王因为用过
  • 打赏
  • 举报
回复
不明觉厉,顶一下
小海贼 2016-12-27
  • 打赏
  • 举报
回复
不会没人明白我在说什么吧?
下面这段代码是网上抄来的,相信有人也找到过这段,实际上真正运行的时候就会发现其实是有问题的,我把它修改了下,能正常读写了。 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

111,092

社区成员

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

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

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