最近做的项目中需要和OPCServer连接,而且是局域网内的连接,DCOM配置就不说了,我们只是需要作出客户端,OPCServer是客户已经提供好的,并且给了DCOM的配置说明,按照说明配置就可以了。重点说说IOComp,我使用的是ILabel控件连接OPC。我先测试了一下拖拽一个ILabel到Form上,然后右键Edit,会看到有OPC的选项,我只是想把OPCServer的数据显示出来,所以我添加了Caption选项,computer填写的是要连接的OPCServer的IP地址,IP连接上之后其他的选择就可以了。在这里我出现的问题记录一下:
1. iocomp组件的添加,我使用的是BCB6,所以我在iocomp的source VCL中选择了iocomp65.bpk,直接点击就可以出现在BCB中,点击Compile,然后点击Install就可以了。但是在我第一次使用的时候,ILabel控件的OPC选项打开之后出现 OPC DLL Missing错误,可能是由于我的iocomp组件不是安装版的,所以找不到吧,我在环境变量的Path中加入了我的iocomp组件的路径,当然一定要指向到OPC文件夹。这样再次打开这个错误就消失了。
接着我继续实验,远程的连接还是不通的,我也从网络上找了各种的解决方案,可是都是不对的,然后有一个人和我出现了同样的错误,他的解决方案是把iocomp的OPC文件夹下的DLL动态文件(大概有4个),拷贝到C盘Windows——System32下面,我也在网上看到了一片别人配置的远程OPCServer的文章,也是这样执行的,或许就是对的,我这样做了,重启了一下电脑,再次连接成功了。很高兴的事情,纠结了很多天,终于成功了。注意问题:
2.在此期间,我从网上下载了别人写好的OPCClient,远程连接OPCServer是可以的,就是iocomp不行,以此来判断不是配置的问题,当然我也在防火墙当中添加了BCB6程序允许执行,并且添加DCOM 135端口。确定了是组件的问题,才进行针对性的解决。
此时我需要连接的OPCServer的Item实在是太多了,如果我一个一个的添加ILabel,然后在手动连接,那是一个笨方法,也是一个浩大的工程啊。这时候其他的同事提出了,使用程序生成ILabel,然后代码配置连接OPCServer。这是可以实现的,ILabel中有SetOPCServer的方法。注意问题:
3.因为对于BCB不是很熟悉,也是临时的学习了一下,我先在Form上放了一个ILabel,然后我在手动配置他的方法。其中是这样的,你要先添加上OPCItem对象,得到这个对象返回的Int变量,要不然,在为ILabel手动连接时,它不知道是为哪一个Item连接的,会报错的。下面是一段实例代码(仅供参考):
int j=iLabel1->OPCAddItem();
iLabel1->OPCItemActivate(j);
iLabel1->SetOPCItemComputerName(j,"192.168.1.20");
iLabel1->SetOPCItemServerName(j,"OPCMaster.DA.1");
iLabel1->SetOPCItemItemName(j,"Device_0.Group0.Tag1");
iLabel1->SetOPCItemPropertyName(j,"Caption");
iLabel1->SetOPCItemAutoConnect(j,true);
这样连接之后,我运行,还是不出来,到底哪里出错了,我真的是不知道。反复试验很多次也不行一个偶然的想法,我不是需要程序生成ILabel吗?那我肯定不能在Form中再添加了,所以我去掉了添加的ILable,改成了new一个。下面这样:
TiLabel *iLabel1 =new TiLabel(this);
iLabel1->Parent=Form1;
这次再试验就成功了,究竟是什么原因,我还真是不知道,我觉得在Form上放置一个,应该BCB会自动New一个对象才对,为什么这样赋值连接不上,希望知道的高人能够指点和我交流。好在我的许多的ILabel就是需要代码生成的,只是实验的时候我遇到的问题。这样,问题基本解决了。