求助:MATLAB与组态王的DDE通信 点击:1121 | 回复:5



方 舟

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2007年8月03日
发表于:2007-08-03 16:17:00
楼主
各位大虾,小弟实在想不出来错误出在哪,特来求教
情况说明:组态王作为服务器,MATLAB作为客户。MATLAB读取组态王的某个变量,计算后返回给另一个变量。
在MATLAB中编写了如下程序:
clear;
chann=ddeinit('VIEW','TAGNAME');
if chann~=0
    disp('DDE成功');
else
    disp('DDE失败');
end;
b2='仿真PLC2.STATIC10';
a2=ddereq(chann,b2);
rc1=ddeadv(chann,b2,'a4=fun3(a2)','a2');
rc2=ddepoke(chann,'仿真PLC.STATIC20',a4);
ddeterm(chann);
组态王作为服务器,打开自带的范例kingdeom1。
添加两个仿真PLC,分别命名仿真PLC和仿真PCL2,对应的寄存器为STATIC20和STATIC10.
在数据词典里,设置原料罐液位和反应罐液位为I/O实型,分别对应仿真PCL2和仿真PCL。目地是用原料罐液位来控制反应罐液位。在命令语言内,将控制反应罐液位的语句全部注释掉。
   根据我设想,启动组态王系统并在MATLAB运行上面那段程序后,MATLAB将读取“原料罐液位”的数据,然后经过fun3()这个函数的计算,然后把结果反馈给组态王的“反应罐液位”变量。
   但是实际运行结果是,能够建立通道,也能够读取原料罐液位的数据,但是无法计算并返回反应罐液位的数值。在运行的系统中,仿真PLC2.STATIC10(原料罐液位)的数值是不断变化的,理论上ddeadv(chann,b2,'a4=fun3(a2)','a2')应该不断的执行a4=fun3(a2)语句才是。第一次捣鼓DDE,也不知道哪弄错了。



死亡骑士

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 1774回
  • 年度积分:0
  • 历史总积分:2630
  • 注册:2006年7月17日
发表于:2007-08-03 16:34:00
1楼
弄MATLAB的应该不多啊 这里

F.Nash

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 41回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2004年5月28日
发表于:2007-08-03 17:24:00
2楼
rc1和rc2的返回值是多少?根据返回值再来进行后面的poke!

方 舟

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2007年8月03日
发表于:2007-08-04 14:11:00
3楼
加了如下一段
if rc1==1
    disp('rc=1');
    rc2=ddepoke(chann,'仿真PLC.STATIC20',a4);
else
    disp('rc=0');
end;
运行后,输出:
rc=1
??? Undefined function or variable 'a4'.
请问是什么原因出错呢?rc1=1按理说是ddeadv(chann,b2,'a4=fun3(a2)','a2');被执行了的意思。不明白这a4是怎么出错的。

yuxuan818

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 32回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2006年3月14日
发表于:2007-11-05 16:44:00
4楼
我也在做组态王和matlab的dde,opc通讯,
加我Q一起讨论吧.
84158143

yuxuan818

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 32回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2006年3月14日
发表于:2007-11-05 16:44:00
5楼
我也弄组态王和MATLAB

热门招聘
相关主题

官方公众号

智造工程师