OPC服务器中数据文件的管理和维护 (opc服务器的数据文件)
OPC服务器是工业自动化中的重要组件,其可以实现控制设备的通信和数据采集。在OPC服务器中,数据文件的管理和维护是至关重要的,这不仅有助于保障数据的安全性,也能提高OPC服务器的运行效率。本文将着重介绍。
一、数据文件管理
OPC服务器中的数据文件包括历史数据文件和配置文件。历史数据文件是记录OPC服务器过去采集的数据,主要用于数据分析和故障处理。配置文件则包括OPC服务器的相关配置,例如通信协议、设备名称、采集周期等。
1、历史数据文件管理
历史数据文件是OPC服务器中非常重要的一部分,因此其管理至关重要。在管理历史数据文件时,应该注意以下几点。
(1)定期备份历史数据文件
定期备份历史数据文件可以保障历史数据的安全性,避免因为误删除或系统故障等原因导致历史数据文件的丢失。备份周期可以按照实际需要进行设置,一般建议每天备份一次。
(2)设置历史数据文件存储时间
OPC服务器中的历史数据文件可以按照时间进行存储,一般建议设置历史数据文件存储时间为6个月。对于一些重要数据,可以将存储时间延长至12个月。
(3)删除过期的历史数据文件
一旦历史数据文件存储时间到达设置的周期,就应该及时删除过期的历史数据文件。这样可以不仅可以释放存储空间,还可以保障历史数据文件的完整性和一致性。
2、配置文件管理
OPC服务器的配置文件包括OPC服务器的相关配置信息,例如通信协议、设备名称、采集周期等。在管理配置文件时,应该注意以下几点。
(1)备份配置文件
与历史数据文件类似,配置文件也应该进行定期备份,以保障配置文件的安全性。备份周期可以按照实际需求进行设置。
(2)配置文件的一致性
在配置文件的管理中,应该保障配置文件的一致性。例如,在修改设备名称等重要信息时,需要同步修改相关的配置文件,以避免因为配置文件不一致而导致的系统故障。
(3)配置文件的安全性
配置文件中包含了OPC服务器的相关配置信息,因此其安全性非常重要。应该设置相关权限,以保障配置文件的安全性,避免配置文件被恶意篡改或访问。
二、数据文件维护
数据文件的维护是保障OPC服务器正常运行的关键步骤。在进行数据文件维护时,应该注意以下几点。
1、历史数据文件维护
在维护历史数据文件时,应该注意以下几点。
(1)压缩历史数据文件
历史数据文件的压缩可以释放存储空间,提高OPC服务器的运行效率。压缩周期可以按照实际需求进行设置,一般建议每天压缩一次。
(2)删除历史数据文件中的冗余数据
历史数据文件中可能会存在冗余数据,这些数据占据了存储空间,同时也可能影响到数据的分析和处理。因此,应该定期删除历史数据文件中的冗余数据。
2、配置文件维护
在维护配置文件时,应该注意以下几点。
(1)定期检查配置文件的一致性
在配置文件的维护中,应该定期检查配置文件的一致性。如果发现配置文件不一致,应该及时进行修正,以避免因为配置文件的不一致而导致的系统故障。
(2)更新配置文件
随着OPC服务器的使用,可能会有一些配置信息需要更新或修改,例如通信协议、设备名称、采集周期等。在更新或修改配置文件时,应该先备份原有的配置文件,并在修改后进行测试和验证,以确保修改后的配置文件的正确性和有效性。
三、结语
是保障OPC服务器正常运行的关键步骤,因此其重要性不言而喻。在进行数据文件的管理和维护时,应该注意数据文件的安全性、一致性和运行效率,以确保OPC服务器的正常运行。
相关问题拓展阅读:
如何在C#中实现OPC数据访问64
1、 配置OPC服务器
对于服务器的配置与同步通讯的配置一样,这里不需再讲解,若有不清楚的,可以参阅之前发布的
2、 OPC编程
变量组、项的命名规则与同步通讯的一样,这里不再描叙,下面主要就开发一个异步通讯类 AsynServer来讲解如何编程。
、引用
在VC#开发环境中添加对OpcRcw.Da库以及OpcRcw.Comn库的引用,该库属于.NET库,不属于COM库,西门子虽然编写了类库,以提供对.NET平台的支持,但这些类库仍然难于编程,里面包含了大量的在托管和非托管区传输数据,因此我们需要在它的基础上再开发一个类库,以简化以后的编程,首先在类的开头使用命戚汪伍名空间:
using OpcRcw.Comn;
using OpcRcw.Da;
using System.Runtime.InteropServices;
using System.Collections;
、编程
异步编程的原理就是在OPC服务器那边检测当前活动的变量组,一但检测到某一个变量,譬如变量Q0.0从1变成0,就会执行一个回调函数,以实现针对变量发生变化时需要实现的动作,在这里可以采用委托来实现该功能。
1、 在命名空间的内部、类 AsynServer声明之前添加委托的申明:
// 定义用于返回发生变化的项的值和其对应的客户句柄
public delegate void DataChange(object values,int itemsID);
2、 该类继承于西门子提高或供的库接口IOPCDataCallback
public class AsynServer:IOPCDataCallback
在类的开头部分声明变量:
struct groupStru
{
public int groupID;
public object groupObj;
}
internal const int LOCALE_ID = 0x407; //本地语言
private Guid iidRequiredInterface;
private string serverType=””;
private int hClientGroup = 0; //客户组号
private int nSvrGroupID; // server group handle for the added group
private Hashtable hashGroup; //用于把组收集到一起
private int hClientItem=0; //Item号
3、编写构造函数,接收委托参数已确定当数据发生变化时需要执行的方法入口点:
//创建服务器
//svrType 服务器类型的枚举
//dataChange 提供用于在数据发生变化时需要执行的函数入口
public AsynServer(ServerType svrType,DataChange dataChange)
{
switch(svrType)
{
case ServerType.OPC_SimaticHMI_PTPRO:
serverType=”OPC.SimaticHMI.PTPro”;break;
case ServerType.OPC_SimaticNET:
serverType=”OPC.SimaticNET”;break;
case ServerType.OPC_SimaticNET_DP:
serverType=”OPC.SimaticNET.DP”;break;
case ServerType.OPC_SimaticNET_PD:
serverType=”OPC.SimaticNET.PD”;break;
case ServerType.OPCServer_WinCC:
serverType=”OPCServer.WinCC”;break;
}
hashGroup=new Hashtable(11);
dtChange=dataChange;
}
4、创建服务器
// 创建一个OPC Server接陵拦口
//error 返回错误信息
//若为true,创建成功,否则创建失败
public bool Open(out string error)
{
error=””;bool success=true;
Type svrComponenttyp ;
//获取 OPC Server COM 接口
iidRequiredInterface = typeof(IOPCItemMgt).GUID;
svrComponenttyp = System.Type.GetTypeFromProgID(serverType);
try
{
//创建接口
pIOPCServer =(IOPCServer)System.Activator.CreateInstance(svrComponenttyp);
error=””;
}
catch (System.Exception err) //捕捉失败信息
{
error=”错误信息:”+err.Message;success=false;
}
return success;
}
5、 编写添加Group的函数
///
/// 添加组
///
///
///
///
///
/// 若为true,添加成功,否则添加失败
public bool AddGroup(string groupName,int bActive,int updateRate,out string error)
{
error=””;bool success=true;
int dwLCID = 0x407; //本地语言为英语
int pRevUpdateRate;
float deadband = 0;
// 处理非托管COM内存
GCHandle hDeadband;
IntPtr pTimeBias = IntPtr.Zero;
hDeadband = GCHandle.Alloc(deadband,GCHandleType.Pinned);
try
{
pIOPCServer.AddGroup(groupName, //组名
bActive, //创建时,组是否被激活
updateRate, //组的刷新频率,以ms为单位
hClientGroup, //客户号
pTimeBias, //这里不使用
(IntPtr)hDeadband,
dwLCID, //本地语言
out nSvrGroupID, //移去组时,用到的组ID号
out pRevUpdateRate, //返回组中的变量改变时的最短通知时间间隔
ref iidRequiredInterface,
out pobjGroup1); //指向要求的接口
hClientGroup=hClientGroup+1;
groupStru grp=new groupStru();
grp.groupID=nSvrGroupID;grp.groupObj=pobjGroup1;
this.hashGroup.Add(groupName,grp);//储存组信息
// 对异步操作设置回调,初始化接口
pIConnectionPointContainer = (IConnectionPointContainer)pobjGroup1;
Guid iid = typeof(IOPCDataCallback).GUID;
pIConnectionPointContainer.FindConnectionPoint(ref iid,out pIConnectionPoint);
pIConnectionPoint.Advise(this,out dwCookie);
}
catch (System.Exception err) //捕捉失败信息
{
error=”错误信息:”+err.Message;success=false;
}
finally
{
if (hDeadband.IsAllocated) hDeadband.Free();
}
return success;
}
6、 编写激活、或者取消激活组的函数
在同步编程中对于组的激活或者取消激活没有实质的意义,但在异步通讯编程中却异常重要,这是因为OPC服务器只对当前处于活动状态的组中的变量进行监控,同时这也是很有必要的,因为我们可以把不同界面中的变量编程不同的组,即同一界面中的变量规成一个组,而在某一时刻提供给用户的只有一个界面,让该界面中用到的组处于活动状态,这样执行委托调用时只会执行于该界面中有关的变量检测,而如果让所有的组处于活动状态,则当前没有显示给用户的界面用到的变量若发生变化也会触发对委托函数的调用,这根本是没有必要的,同时会大大降低程序的性能,请严格控制组的激活。
///
/// 激活或者取消激活组
///
///
///
///
/// 若为true,添加成功,否则添加失败
public bool AciveGroup(string groupName,bool toActive,out string error)
{
error=””;bool success=true;
//通过名称获取组
object grp=((groupStru)hashGroup).groupObj;
IOPCGroupStateMgt groupStateMgt=(IOPCGroupStateMgt)grp;
//初始化传递参数
IntPtr pRequestedUpdateRate = IntPtr.Zero; //由客户指定的Item更新间隔时间
int nRevUpdateRate = 0; //由服务器返回的能够更新的最短时间间隔
IntPtr hClientGroup = IntPtr.Zero; //客户组
IntPtr pTimeBias = IntPtr.Zero;
IntPtr pDeadband = IntPtr.Zero;
IntPtr pLCID = IntPtr.Zero;
// 激活或者取消激活组
int nActive = 0;
GCHandle hActive = GCHandle.Alloc(nActive,GCHandleType.Pinned);
if(toActive)
hActive.Target = 1;
else
hActive.Target = 0;
try
{
groupStateMgt.SetState(pRequestedUpdateRate,out nRevUpdateRate,hActive.AddrOfPinnedObject(),pTimeBias,pDeadband,pLCID,hClientGroup);
}
catch(System.Exception err)
{
error=”错误信息:”+err.Message;success=false;
}
finally
{
hActive.Free();
}
return success;
}
7、 向指定的组中添加变量的函数
///
/// 向指定的组添加一系列项
///
///
///
///
/// 无错误,返回true,否则返回false
public bool AddItems(string groupName,string itemsName,int itemsID)
{
bool success=true;
OPCITEMDEF ItemDefArray=new OPCITEMDEF;
for(int i=0;i {
hClientItem=hClientItem+1; //客户项自动加1
ItemDefArray.szAccessPath = “”; // 可选的通道路径,对于Simatiic Net不需要。
ItemDefArray.szItemID = itemsName; // ItemID, see above
ItemDefArray.bActive = 1; // item is active
ItemDefArray.hClient = hClientItem; // client handle ,在OnDataChange中会用到
ItemDefArray.dwBlobSize = 0; // blob size
ItemDefArray.pBlob = IntPtr.Zero; // pointer to blob
ItemDefArray.vtRequestedDataType = 4; //DWord数据类型
}
//初始化输出参数
IntPtr pResults = IntPtr.Zero;
IntPtr pErrors = IntPtr.Zero;
try
{
// 添加项到组
object grp=((groupStru)hashGroup).groupObj;
((IOPCItemMgt)grp).AddItems(itemsName.Length,ItemDefArray,out pResults,out pErrors);
int errors = new int;
IntPtr pos = pResults;
Marshal.Copy(pErrors, errors, 0,itemsName.Length);
for(int i=0;i、 重新创建一个工程,添加对上面编写的异步类的引用,并在类的开头部分添加变量声明:
//声明委托
private S7Connection.DataChange dt;
//声明服务器
S7Connection.AsynServer server;
、初始化服务器数据
dt=new S7Connection.DataChange(DataChange);
server =new AsynServer(S7Connection.ServerType.OPC_SimaticNET,dt);
string err;
server.Open(out err);
server.AddGroup(“maiker”,1,300,out err);
server.AddItems(“maiker”,m1,nt1);
server.AddGroup(“maiker1”,1,300,out err);
server.AddItems(“maiker1”,m2,nt2);
nt=nt1;nt=nt1;
、添加两个单选按钮,用于选择某个组,并编写相应的程序
string err,err1;
if(server==null) return;
if(radioButton1.Checked)
{ nt=nt1;nt=nt1;
server.AciveGroup(“maiker”,true,out err);
server.AciveGroup(“maiker1”,false,out err1);
}
else
{
nt=nt2;nt=nt2;
server.AciveGroup(“maiker1”,true,out err);
server.AciveGroup(“maiker”,false,out err1);
}
、添加文本框、按钮等,并编写委托执行函数:
private void DataChange(object obj,int itemsID)
{
for(int j=0;j {
if(itemsID==nt)
this.textBox1.Text=obj.ToString();
if(itemsID==nt)
this.textBox4.Text=obj.ToString();
}
}
其中参数obj用于返回当前发生变化的变量的结果值,而itemsID返回当前发生变化的变量的ID号,其与添加变量时服务器返回的ID号对应。以上就是一个基本的测试函数,其相对同步编程来说,应该还简单一些。
3、 同步编程与异步编程的使用场合
一般来讲,同步编程需要使用定时器来循环检测变量,而异步编程则不需要,当服务器检测到数据发生变化时,可以直接调用传入的函数,从这方面来讲,使用异步编程更简单一些,但同步编程使用外部的定时器控制,编程则会更加灵活,一般只监控变量时可以使用异步编程,而当需要写入数据时可以使用同步编程,但这也不是绝对的,我曾编写了一个标准监控程序,没有使用异步编程。
4、 关于开发监控界面的说明
毫无疑问,我们应该开发一系列控件,用于简化界面的设计,否则工作量会异常大。设计一个标准模块,用于之一次运行监控软件时添加变量,并可以设定当前已经组态的界面中的各控件元素与之关联,这样在以后再运行该软件时,不需要再设定,就可以直接连接变量,并进行相应的变化。否则若在编程时编写代码进行关联,其工作量将会异常大。
浙大中控opc服务器在电脑怎么查找
ForeverCreditOPCServer服务器软件,简称OPCServer。
OPC客户端的使用方法:
建立和删除OPC设备:
组态王
中纤袭支持多OPC服务器。
在使用OPC服务器之前,需要先在组态王中建立OPC服务器设备。
在组态王工程浏览器的设备”项目中选中OPC服务器”,工程浏览器的右侧内容区显示当前工程中定义的OPC设备和新建OPC”图标。
双击新建”图标,组态王开始自动搜索当前的
计算机系统
中已经安装的所有OPC服务器,然后弹出查看OPC服务器”对话框。
OPC设备定义:
网络节点
名”编辑框中为要查看OPC服务器的计算机名称,默认为本机”。
如果需要查看网络上的其它站点的OPC服务器,在编辑框中输入节点的UNC路径。
如计算机名称为数据采集站”,则输入数据采集站”,然后单击查找”毁掘兄按钮,如果查找成功,则在右边的OPC服务器”列表中显示目标站点的所有已安装的OPC服务器名称,如果没有查找到,则提示查找失败。
OPC服务器信息”文本框中显示OPC服务器”列表中选中的OPC服务器的相关说明信息,如选中KingView.View.1”,则在信息中显示KingView.View”。
读写方式”是用来定义该OPC设备对应的OPC变量在进行读写数据时采用同步或异步方式,尝试恢复间隔”和最长恢复时间”用来设置当组态王与OPC服务器之间的通讯出现故障时,系统尝试恢复通讯的策略参数。
订阅频率”,目前组态王异步读是按照订阅的方式实现的,可以根据不同的需要进行设置,使用动态优化”是组态王对通讯过程采取动态管理的办法。
尝试恢复间隔”,最长恢复时间”,使用动态优化”的具体含义与IO设备定义向导中的相同。
用户可以在列表中选择所需的OPC服务器。
单击确定”按钮,查看OPC服务器”对话框自动关闭,OPC设备建立成功。
OPC服务器的建立:
对于已经建立的OPC设备,如果您确认不再需要,可以将它删除。
选中要删除的OPC设备,单击鼠标右键,在弹出散搭的快捷菜单中选择删除,弹出的提示信息,如果选择是”,则将该设备从组态王中删除。
如何通过OPC自定义接口来实现客户端数据的读取?
通过OPC自定义接口来实现客户端数据的读取步骤如下。
1:使用OPC DA进行Client的读写操作时,我们使用Custom接口,出此之外还有Automation接口。以下是Custome接口开发时涉及到的三个关键对象:OpcServer、OpcGroup、OpcItem。
2:在客户端开发时,要使用OpcServer对象来实现客户端与Opc服务器之间的连接。一个OpcServer对象下有多个OpcGroup,一个OpcGroup下有多个逗配OpcItem,在自定义接口下的Client开发,是以Group为单位的操作,数据读写都是通过OpcGroup进行的。
3:我们可以不写OPC Client程序来测试,如何通过OPCServer与PLC之间的交互。首先当我们安装完毕SimaticNet之后,需码指迹要对Station Configuration Editor进行配迟并置。
4:当我们组态完毕时,如何判断组态是否正确,在SimaticNet的目录上有个叫Opc Scout(Opc Scout V10)的软件,列出来了本机所有的Server,我们能使用名为OPC.SimaticNET的Server。
opc服务器的数据文件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于opc服务器的数据文件,OPC服务器中数据文件的管理和维护,如何在C#中实现OPC数据访问64,浙大中控opc服务器在电脑怎么查找,如何通过OPC自定义接口来实现客户端数据的读取?的信息别忘了在本站进行查找喔。