当前位置:首页 » 编程软件 » opc编程

opc编程

发布时间: 2022-09-11 14:32:48

㈠ c#编程用opc的方式读写plc中的寄存器

PLC数据要通过串口编程或socket编程来获龋PLC一般通过RS232串口或RS485串口,与电脑进行数据通讯,或者扩展以太模块(总线扩展,或串口加装),通过以太网进行数据通讯。对应于不同的接口,通讯程序也不一样,RS232可直接接入电脑,RS485要通过

㈡ 什么是OPC技术求解

在过去,为了存取现场设备的数据信息,每一个应用软件开发商都需要编写专用的接口函数。由于现场设备的种类繁多,且产品的不断升级,往往给用户和软件开发商带来了巨大的工作负担。通常这样也不能满足工作的实际需要,系统集成商和开发商急切需要一种具有高效性、可靠性、开放性、可互操作性的即插即用的设备驱动程序。在这种情况下,OPC标准应运而生。OPC标准以微软公司的OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的,在OPC技术中使用的是OLE 2技术,OLE标准允许多台微机之间交换文档、图形等对象。
COM是Component Object Model的缩写,是所有OLE机制的基础。COM是一种为了实现与编程语言无关的对象而制定的标准,该标准将Windows下的对象定义为独立单元,可不受程序限制地访问这些单元。这种标准可以使两个应用程序通过对象化接口通讯,而不需要知道对方是如何创建的。例如,用户可以使用C++语言创建一个Windows对象,它支持一个接口,通过该接口,用户可以访问该对象提供的各种功能,用户可以使用Visual Basic,C,Pascal,Smalltalk或其它语言编写对象访问程序。在Windows NT4.0操作系统下,COM规范扩展到可访问本机以外的其它对象,一个应用程序所使用的对象可分布在网络上,COM的这个扩展被称为DCOM(Distributed COM)。
通过DCOM技术和OPC标准,完全可以创建一个开放的、可互操作的控制系统软件。OPC采用客户/服务器模式,把开发访问接口的任务放在硬件生产厂家或第三方厂家,以OPC服务器的形式提供给用户,解决了软、硬件厂商的矛盾,完成了系统的集成,提高了系统的开放性和可互操作性。
OPC服务器通常支持两种类型的访问接口,它们分别为不同的编程语言环境提供访问机制。这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VisualBasic、Delphi、PowerBuilder等编程语言开发OPC服务器的客户应用。而自定义接口是专门为C++等高级编程语言而制定的标准接口。OPC现已成为工业界系统互联的缺省方案,为工业监控编程带来了便利,用户不用为通讯协议的难题而苦恼。

㈢ OPC 应用程序开发 可以用C#吗还可以用哪些

可以用C#,VB,DELPHI,C++等,大多高级语言都可以。
不过,用现成的OPC开发包,更好些。

㈣ 新人不懂OPC是什么东西

OPC(OLE for Process Control),是一个工业标准,用于过程控制的OLE。

管理这个标准的国际组织是OPC基金会,OPC基金会现有会员已超过220家。遍布全球,包括世界上所有主要的自动化控制系统、仪器仪表及过程控制系统的公司。

基于微软的OLE(现在的Active X)、COM (部件对象模型)和DCOM (分布式部件对象模型)技术。OPC包括一整套接口、属性和方法的标准集,用于过程控制和制造业自动化系统。

OPC 基于Microsoft公司的 Distributed interNet Application (DNA) 构架和 Component Object Model (COM) 技术的,根据易于扩展性而设计的。OPC规范定义了一个工业标准接口。

OPC是以OLE/COM机制作为应用程序的通讯标准。OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。

(4)opc编程扩展阅读

OPC技术原理

OPC标准以微软公司的OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的。

COM和DCOM技术

COM(组件对象模型)是所有OLE机制的基础,它是WINDOWS系统中一种为了实现与编程语言无关的对象而制定的标准。这种标准可以使两个应用程序通过对象化接口通讯,而不需要知道对方是如何创建的。

COM规范扩展到可访问本机以外的其它对象,一个应用程序所使用的对象可分布在网络上,这个扩展被称为DCOM。OPC是作为工业标准定义的特殊的COM接口。

㈤ 如何在C++中实现OPC访问

OPC的文档网上很多,我在这里要介绍的主题是使用C++通过自动化接口来访问OPC Server,写这篇文章的目的是我在网上没有搜索到这方面的文档,如果我有这方面的需要,我想在网上一定也有其他朋友有这个需要,希望能对这些朋友有一些帮助。
使用C++来访问OPC Server, 相对于使用自定义接口来说,自动化接口要简单很多,因为这和Visual Basic使用的是同一个接口,使用过Visual Basic来访问OPC Server的朋友一定能有这个体会。首先是准备好开发环境,一般测试是在模拟环境中进行,这样比较保险,可以使用一些免费的模拟OPC Server。我这里准备的是Matrikon的模拟服务器,模拟器安装以后。编程环境是VC++ 6.0,使用200X和2010也都大同小异。

为了演示简单,新建一个Win32控制台工程agOPC,新建agOPC.cpp源文件并加到工程里。

// --------------------------------- agOPC.cpp -----------------------------------------------
//在agOPC.cpp开头添加如下一行
#import "C:Program FilesMatrikonOPCCommonOPCAuto.dll" no_namespace
//这是通过OPCAuto.dll里所包含的类型库信息产生C++能访问的头文件,此时在工程的Debug文件夹下产生OPCAuto.tlh和OPCAuto.tli两个文件。

//添加需要的头文件
#pragma warning( disable : 4786 ) // 为了避免vector报出的C4786警告
#include< comdef.h> // 使用到了_bstr_t,_variant_t,_com_error都在这个文件里定义
#include< iostream>
#include< vector>
using namespace std;

//声明全局变量
typedef struct OLEInit {
OLEInit() { CoInitialize( NULL ); }
~OLEInit() { CoUninitialize(); }
} OLEInit;

OLEInit oleInit; // 必须在最前面定义,因为在使用COM之前必须初始化COM库,否则程序会崩溃
// 由于是全局变量oleInit的构造函数在所有对象的构造函数调用之前调用,
// 析构函数在所有对象的析构函数调用之后调用
IOPCAutoServerPtr opcSvr; // 这些智能指针类型在OPCAuto.tlh中定义
IOPCGroupsPtr opcGrps;
IOPCGroupPtr opcGrp;
vector<OPCItemPtr> opcItms; // 使用vector来保存三个测试Item。

//连接到OPC Server, 我所使用的参数是"Matrikon.OPC.Simulation.1"
void agOPCConn( const char *opcSvrName ) {
HRESULT hr;
hr = opcSvr.CreateInstance( __uuidof( OPCServer ) );
if( FAILED( hr ) ) {
cerr<< "OPCServer CreateInstance failed, hr = " << hr<< endl;
exit(1);
}
opcSvr->Connect( opcSvrName );
}

//断开和OPC Server的连接
void agOPCDisc() {
opcGrps->RemoveAll(); // 删除所有的组, 这个演示实例只有一个组
opcSvr->Disconnect(); // 断开和OPC Server的连接
}

//创建一个组
void agOPCCreateGroup() {
// OPCGroups是特殊的属性,执行的时候会调用OPCAuto.tlh中的IOPCGroupsPtr GetOPCGroups();
opcGrps = opcSvr->OPCGroups;
opcGrp = opcGrps->Add( _variant_t( "group1" ) ); // 组名随意取
}

//在组里添加三个不同类型的测试Item, 类型可以从Item的名字可以看出
void agOPCAddItems() {
OPCItemPtr opcItm;

opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.Int4" ), 1 );
opcItms.push_back( opcItm );

opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.Int2" ) , 1);
opcItms.push_back( opcItm );

opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.String" ) , 1);
opcItms.push_back( opcItm );
}

//用来显示读取的Item的值
void agDumpVariant(VARIANT *v)
{
switch(v->vt)
{
case VT_I2:
printf(" value(VT_I2) = %d ", v->iVal );
break;
case VT_I4:
printf(" value(VT_I4) = %ld ", v->lVal );
break;
case VT_BSTR:
printf(" value(VT_BSTR) = %ls ", v->bstrVal );
break;
default:
printf(" value(unknown type:%d) ", v->vt );
break;
}
}

//同步读取三个Item的值,同步在很多情况下都是简单有效的选择方案,其实读取的异步方式在C++中可以建立一个工作线程来执行同步读的操作,等有新的Item值的时候再通过某种线程间通信的方式告诉主线程“数据改变”的事件
void agOPCReadItems() {

_variant_t quality;
_variant_t timestamp;
SAFEARRAY *pServerHandles;
SAFEARRAY *pValues;
SAFEARRAY *pErrors;
SAFEARRAYBOUND rgsabound[ 1 ];
long dim[ 1 ];
long svrHdl;
vector<_variant_t> values;
vector<long> errs;
int i;
_variant_t value;
long err;

// VC数组索引从0开始,而在OPCAuto.dll需要中从1开始,所以是rgsabound[ 0 ].cElements = 4,而给pServerHandles赋值的时候应该给索引是1,2,3相应的赋值Server Handle
rgsabound[ 0 ].cElements = 4;
rgsabound[ 0 ].lLbound = 0;
pServerHandles = SafeArrayCreate( VT_I4, 1, rgsabound ); //构建一个1维数组,类型是VT_I4

for( i = 0; i < opcItms.size(); i++ ) {
svrHdl = opcItms[i]->ServerHandle;
dim[ 0 ] = i + 1;
// 给数组的每个元素赋值,对应的索引值是1, 2, 3
SafeArrayPutElement( pServerHandles, dim, &svrHdl );
}

opcGrp->SyncRead( OPCDevice,
3, // 读取的Item数目
& pServerHandles, // 输入的服务器端句柄数组
& pValues, // 输出的Item值数组
& pErrors, // 输出的Item错误状态数组
& quality, // 读取的值的状态
& timestamp ); // 读取的事件戳

for( i = 1; i <= opcItms.size(); i++ ) {
dim[ 0 ] = i;
SafeArrayGetElement( pValues, dim, &value ); // 读取Item值在value中
SafeArrayGetElement( pErrors, dim, &err ); // 读取错误状态值在err中
values.push_back( value );
errs.push_back( err );
}

for( i = 0; i < values.size(); i++ ) {
agDumpVariant( &values[ i ] ); // 显示读取的Item值
cout<< ", err = "<< errs[ i ]<< endl;
}

SafeArrayDestroy( pServerHandles );
SafeArrayDestroy( pValues );
SafeArrayDestroy( pErrors );
}

// 写入3个Item的值,为了演示实例简单,参数传递3个对应的Item值
void agOPCWriteItems( vector<_variant_t> values) {
_variant_t quality;
_variant_t timestamp;
SAFEARRAY *pServerHandles;
SAFEARRAY *pValues;
SAFEARRAY *pErrors;
long dim[ 1 ];
long svrHdl;
int i;

SAFEARRAYBOUND rgsabound[ 1 ];
rgsabound[ 0 ].cElements = values.size() + 1;
rgsabound[ 0 ].lLbound = 0;

pServerHandles = SafeArrayCreate( VT_I4, 1, rgsabound );
pValues = SafeArrayCreate(VT_VARIANT, 1, rgsabound);

for( i = 0; i < values.size(); i++ ) {
svrHdl = opcItms[i]->ServerHandle;
dim[ 0 ] = i + 1;
SafeArrayPutElement( pServerHandles, dim, &svrHdl );
SafeArrayPutElement( pValues, dim, &values[i] );
}

opcGrp->SyncWrite( 3,& pServerHandles, &pValues,& pErrors );

SafeArrayDestroy( pServerHandles );
SafeArrayDestroy( pValues );
SafeArrayDestroy( pErrors );
}

//main主程序
int main()
{
try
{
agOPCConn( "Matrikon.OPC.Simulation.1" );
agOPCCreateGroup();
agOPCAddItems();

// 第一次写和读
vector<_variant_t> values;
values.push_back( ( long )156 );
values.push_back( ( short )11 );
values.push_back( "opc" );
agOPCWriteItems( values );

agOPCReadItems();

cout << "---------------------------------------"<< endl;

// 第二次写和读
vector<_variant_t> values1;
values1.push_back( ( long )123456 );
values1.push_back( ( short )666 );
values1.push_back( "hello" );
agOPCWriteItems( values1 );

agOPCReadItems();
}
catch ( _com_error &e ) {
// 应该在上面的子函数里面捕捉异常,但为了演示简单,在主函数里面捕捉异常
_bstr_t bstrSource( e.Source( ) );
_bstr_t bstrDescription( e.Description( ) );
cout<< "Code = "<< e.Error()<< endl;
cout<< "Code meaning = "<< e.ErrorMessage()<< endl;
cout<< "Source = "<< ( LPCTSTR ) bstrSource<< endl;
cout<< "Description = "<< ( LPCTSTR ) bstrDescription<< endl;
}

return 0;
}

㈥ PLC与PC通讯程序用VB编程多还是用OPC编程多啊那个更好

首先需要明白两者的“职责”:VB是用于上位机的编程,属于计算机编程部分,OPC属于计算机的一种API“接口”,这种软件上的接口其实也属于驱动程序的一种,和硬件上的“接口”功能原理一样,OPC就是为了连通PLC和VB程序之间通讯的“桥梁”或“接口”。想你所说的OPC编程应该是通讯数据的交换寄存器的设置,通讯数据长度设置等。

因此PC和PLC之间的通讯(控制、监控、数据写入等)是通过VB调用OPC的“接口”数据来实现通讯的。

㈦ OPC数据采集如何编程

1.软硬件平台的配置 OPC服务器的搭建使用西门子公司提供的SIMATIC NET 2006...
2.OPC服务器的搭建
3.PC站的硬件机架的配置。双击桌面Station Configuration Editor快捷图标,打开 Station Con...
4.控制台的配置。从开始菜单中选择Simatic>Simatic net>Configura...
5.通过.NET平台编程实现OPC客户端 利用Visual Studio 2005开.

热点内容
18经验起床的服务器ip 发布:2024-11-01 12:30:15 浏览:39
这个锁屏密码是什么 发布:2024-11-01 12:24:51 浏览:91
相机存储卡排名 发布:2024-11-01 12:24:49 浏览:958
androidxml格式化 发布:2024-11-01 12:23:14 浏览:164
Vb6编译是错误不知道错误代码 发布:2024-11-01 12:16:23 浏览:159
局域网电脑访问服务器怎么提速 发布:2024-11-01 12:14:09 浏览:322
美创数据库 发布:2024-11-01 12:05:45 浏览:916
你改爱奇艺密码什么意思 发布:2024-11-01 12:04:48 浏览:408
矩阵分解python 发布:2024-11-01 11:58:23 浏览:367
如何查询微信支付密码修改记录 发布:2024-11-01 11:51:57 浏览:206