首页 上一页 1 2 下一页 尾页

OPC Client 核心源码(MFC) 点击:10516 | 回复:38



叶帆

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 88回
  • 年度积分:0
  • 历史总积分:239
  • 注册:2003年9月03日
发表于:2005-12-02 22:01:00
楼主
好像技术一沾上工业,便有了很高的价值,大家三缄其口,谁都不点破这层窗户纸,好多的思路和源码都要从国外网站获得,国内总是有条件,有限制--就是不告诉你,怕教会徒弟,饿死师父吧。

研究了N天,开发了一个基于我的组态后台的OPC客户端驱动,考虑到驱动的特殊性,所以只开发了同步接口操作。测试一段时间后,还可以。现把核心代码公开出来,有点VC基础的人可以直接拿来用。

源码网址:http://blog.csdn.net/yefanqiu/archive/2005/12/02/542447.aspx



LUGANCHAO

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 1821回
  • 年度积分:0
  • 历史总积分:2757
  • 注册:2007年4月06日
发表于:2007-12-25 14:37:00
21楼
  顶起来

LUGANCHAO

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 1821回
  • 年度积分:0
  • 历史总积分:2757
  • 注册:2007年4月06日
发表于:2007-12-25 14:38:00
22楼
  顶起来

156944495

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:269
  • 注册:2007年12月18日
发表于:2009-04-28 13:42:19
23楼

学习中,虽然暂时看不懂,不过还是钦佩楼主

baishan

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 43回
  • 年度积分:0
  • 历史总积分:154
  • 注册:2005年1月11日
发表于:2009-04-28 13:45:00
24楼
是啊,我现在也看不懂,还是感谢楼主的这种奉献精神!

[明月夜]

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2009-04-29 10:38:14
25楼

非常感谢叶帆,见过你的博客,这里真会OPC编程的实在不多。

我会C+builder6.0编程,把你的VC代码已改到C++BUILDER很好用。

为了便于调用,我自已再次用类对它简单封装,已十分方便了,调用者

不需要什么接口一类的概念.

 

[明月夜]

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2009-04-29 10:48:28
26楼

 

typedef
class OPCGrp
{
public:
String GrpName; // 组名
int Rate; // 更新速率
IUnknown * ptrGroup; // 组指针
IOPCSyncIO * ptrSyncIO;

wchar_t ** Item; // 项名数组
int ItemCount; // 项数
IOPCItemMgt * ptrItem; // 项指针
DWORD * hItem; // 项句柄数组
OPCITEMSTATE * Data; // 存放数据
void ReadGrp(); // 读一组数据
void ReadBuf(VARIANT v[]); // 读一组数据到缓冲
void Read(int i,VARIANT &v); // 读一个数据,第i个
void Write(int i,VARIANT v); // 写一个数据,第i个
void Write(int i,int n,VARIANT v[]); // i起,写N个
OPCGrp();
OPCDATASOURCE DataSource; // 数据源 OPC_DS_CACHE/DEVICE
} OPCGrp;

typedef
class OPCServer
{
public:
String ID; // OPC标识串
String IP; // 远程 IP,本地为空
IOPCServer *opcObject;
OPCGrp *opcGrp[10]; // OPCGrp *[]
int GrpCount; // 组数
bool AddGrp(OPCGrp *grp); // 增加组对象
bool Connected; // 是否已联接
bool Connect(); // 连接
void Disconnect(); // 断开并释放资源
OPCServer();
} OPCServer;

//调用举例

OPCServer *opc=NULL;
void __fastcall TForm1::Button3Click(TObject *Sender)
{
bool opc_connected=false;
opc=new OPCServer;
opc->ID="KEPware.KEPServerEx.V4";
opc->IP=IP->Text.Trim();
opc_connected=opc->Connect();
if (!opc_connected)
{
ShowMessage("Connect Failed!");
return;
}
wchar_t *items[]={
L"Channel_4.Device_6.Word_2",
L"Channel_2.Device_3.Tag_2",
L"Channel_1.Device_1.Bool_1"
};
OPCGrp *grp1=new OPCGrp();
grp1->GrpName="Group1";
grp1->Rate=100;
grp1->Item=items;
grp1->ItemCount=3;
if (!opc->AddGrp(grp1))
{
ShowMessage("Add Group Failed!");
return;
}
VARIANT v[3];
while (opc->Connected && !Application->Terminated)
{
opc->opcGrp[0]->Read(0,v[0]);
opc->opcGrp[0]->Read(1,v[1]);
opc->opcGrp[0]->Read(2,v[2]);
Label1->Caption=v[0].iVal;
Label2->Caption=v[1].iVal;
Label3->Caption=v[2].boolVal?1:0;

Application->ProcessMessages();
}

}

[明月夜]

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2009-04-29 10:51:17
27楼

这样调用,非常简单,只有两个对象 OPCServer,    opcGrp, 

项与组 一起,  一个OPCServer可以有多个组,每个组都有一个项,

可以读写数据 功能足够了

 

 

MG...

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 245回
  • 年度积分:0
  • 历史总积分:818
  • 注册:2006年3月04日
发表于:2009-06-10 14:52:02
28楼
正开始学习 vc 如何调试 OPC server( siemens).

1718号民工

  • 精华:0帖
  • 求助:0帖
  • 帖子:16帖 | 391回
  • 年度积分:0
  • 历史总积分:611
  • 注册:2007年7月19日
发表于:2009-07-09 11:48:21
29楼

谢谢,从中可以学到很多平时学不到的了!

世元

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 17回
  • 年度积分:0
  • 历史总积分:77
  • 注册:2007年7月08日
发表于:2009-10-11 14:33:15
30楼

这个我还不懂,哪位大师给讲讲好吗。

xl_fire

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2009年6月12日
发表于:2009-11-10 15:39:56
31楼
高手,做好把数字改为枚举吧! 那样多好!!!

guoln1010

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2009年5月20日
发表于:2011-09-19 15:40:30
32楼
高手啊!使用异步读,同步写。我也在学习OPC,但是现在遇到一个问题,我采用的同步读写的方式,利用定时器从PLC读取数据信号,但是不知道什么时候数据过来,所以采用的是0.1S的定时器,可视问题出来了,就是每读一次数据内存就会上涨4K,后来发现是没有释放。就在关闭程序的时候添加了释放代码,可视问题依旧没能解决,希望叶凡看到能帮忙解决一下

guoln1010

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2009年5月20日
发表于:2011-09-19 15:41:30
33楼
采用的同步读写方式,但是每读一次数据,内存就会上涨4K
C/C++ codeif(b_enable)
{
hRet=pOPCSync->Read(OPC_DS_CACHE,2,hServerAI,&pItemValue,&pErrors);
if(hRet!=S_OK)
{
KillTimer(2);
MessageBox("通信失败");
}
CoTaskMemFree(pErrors);
m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);
//m_nPlcSystemTimeSecond=V_R4(&pItemValue[1].vDataValue);
m_LABEL1.Format("%d",m_bStartEnd);
UpdateData(false);
}

有关释放的程序Assembly code if(b_enable)
{
pOPCItemMgt->RemoveItems(2,hServerAI,&pErrors);
pOPCItemMgt->RemoveItems(2,hServerAO,&pErrors);
pServer->RemoveGroup(hOPCServerGroup,TRUE);
pOPCSync->Release();
pOPCItemMgt->Release();
pServer->Release();
ppUnknown->Release();
}

guoln1010

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2009年5月20日
发表于:2011-09-19 15:42:13
34楼
看这个精华帖已经有年头了,不知道能不能招来高手帮忙解决一下

andlu

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 107回
  • 年度积分:0
  • 历史总积分:333
  • 注册:2004年9月03日
发表于:2011-12-27 10:10:12
35楼


工程项目监控软件源码三合一

1.vb6开发的锅炉监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数据记录

和查询界面及相关报表功能,历史曲线查询。(下位机是西门子S7-200,以太网通讯)

2.delphi7开发的回转窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数

据记录和查询界面及相关报表功能。(下位机是OMRON CJ1G,以太网通讯)

3.VC++6.0开发的石灰窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数
据记录和查询界面及相关报表功能,历史曲线查询。(数据源是OPC Server,报表纯手工编写,具有很大
的灵活性)。

目前都已经稳定运行在自控项目上了。这些源码稍作修改就可以应用在其他项目上。

有需要的请联系QQ:790013363

EMAIL:lgr980423@126.com  可以先运行打包安装文件,查看效果。有偿服务,非诚勿扰!

岳轻航

  • 精华:0帖
  • 求助:3帖
  • 帖子:20帖 | 1090回
  • 年度积分:5
  • 历史总积分:3153
  • 注册:2010年8月04日
发表于:2012-11-15 10:04:33
36楼

楼主说的很有道理 

sgq406

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 6回
  • 年度积分:0
  • 历史总积分:71
  • 注册:2018年4月24日
发表于:2018-07-19 10:00:36
37楼

想请问一下我在运行时,远程的opc server可以创建,但是添加组失败是什么原因,调试的时候出现报错为“0X00080012:并不是所有需求的接口都存在”(数控系统为西门子840d)

sssaaa900

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 75回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2018年11月29日
发表于:2018-11-29 10:23:56
38楼

学习OPC中,有资源必须先下看看


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页