你当前的位置:首页 > 编程技巧 >

运用VC#编程通过OPC方式实现PC机与西门子PLC通讯--同步篇

返回文章列表 作者:老耿 时间:01-27 来源:大测控  字体:【

5、 向指定组中指定的一系列项变量写入数据的公开方法
/// 
/// 一次性写入多个值
/// 
/// 指定组名
/// 由服务器给每个项分配的标志号
/// 一系列值
/// 无错误,返回true,否则返回false
public bool Write(string groupName,int[] itemID,object[] values)
{
bool success=true;
IntPtr pErrors = IntPtr.Zero;

if(GetGroupByName(groupName) != null)
{
try
{ //同步写入
((IOPCSyncIO)GetGroupByName(groupName)).Write(itemID.Length,itemID,values,out pErrors); 
int[] errors = new int[itemID.Length]; 
Marshal.Copy(pErrors, errors, 0,itemID.Length);
for(int i=0;i
{
if (errors[i] != 0)
{
pErrors = IntPtr.Zero; 
success=false;
}
}
}
catch(System.Exception error)
{
success=false;

}
return success;
}
注:参数int[] itemID应该是与AddItems函数中的int[] itemsID参数相对应。

6、 编写获取变量值的函数
/// 一次性读取多个数据
/// 指定组名
/// >由服务器给每个项分配的标志号
/// 返回的值
/// 无错误,返回true,否则返回false
public bool Read(string groupName,int[] itemID,object[] result)
{
bool success=true;
//指向非托管内存
//指向非托管内存
IntPtr pItemValues = IntPtr.Zero;
IntPtr pErrors = IntPtr.Zero;
if(GetGroupByName(groupName)!=null)
{
try
{ //同步读取
((IOPCSyncIO)GetGroupByName(groupName)).Read(OPCDATASOURCE.OPC_DS_DEVICE,itemID.Length,itemID,out pItemValues,out pErrors); 
int[] errors = new int[itemID.Length]; 
Marshal.Copy(pErrors, errors, 0,itemID.Length);
OPCITEMSTATE[] pItemState=new OPCITEMSTATE[itemID.Length];
IntPtr pos = pItemValues;
for(int i=0;i
{
if (errors[i] == 0)
{
//从非托管区封送数据到托管区
pItemState[i] = (OPCITEMSTATE)Marshal.PtrToStructure(pos,typeof(OPCITEMSTATE));
pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMSTATE)));
result[i]=pItemState[i].vDataValue;
}
}
}
catch(System.Exception error)
{
return false;
}
}
return success;
}
  注:同Write()函数一样,参数int[] itemID应该是与AddItems函数中的int[] itemsID参数相对应。

  通过给类编写上面的几个最重要的函数,我们已经可以读写PLC数据了,下面给出例子。

  创建一个C#工程,添加对上面开发的类库的引用,并在窗体类的开头,声名:

int[] nt=new int[2];int[] nt1=new int[2];
S7Connection.SynServer server;
其中的SynServer即为上面开发的类。

<1>、创建服务器接口

在程序初始化处,添加:
server =new S7Connection.SynServer(S7Connection.ServerType.OPC_SimaticNET);

<2>、打开连接
string err;
server.Open(out err);

<3>、添加组

server.AddGroup("maiker",1,350,out err);
server.AddGroup("maiker1",1,350,out err);

<4>、添加项(即变量),同样在程序的初始化中,将一系列项添加到他们各自得组。

string[] m1={"S7:[DEMO]MB1","S7:[DEMO]MW3"};
string[] m2={"S7:[DEMO]MB6","S7:[DEMO]MW8"};
server.AddItems("maiker",m1,nt);
server.AddItems("maiker1",m2,nt1);

<5>、读写数据,这里以写数据为例:

obj[0]=this.textBox2.Text;
obj[1]=this.textBox3.Text;
if(radioButton1.Checked) 
{
server.Write("maiker",nt,obj);
}
else if(radioButton2.Checked)
{
server.Write("maiker1",nt1,obj);
}

  至此并完成了数据的通讯,如何,只要你把类库开发完善,在它的基础上再开发,会异常简单,本人已开发了完善的类库,上面的类库只是把最重要的部分讲解出来,我曾经在网上求助过很多次这方面的知识,无人应答。唉!太不容易了,等待Simatic NET软件花费了我一个月的时间,然后读几百页的英文文档,到开发程序,并测试花费了我一个星期的空闲时间,写这篇文章,又花费了我一个晚上的时间,不过我还是愿意把这些摸索出来的东西发给大家。


文章相关
现有0条评论 | 更多评论..

我要发表看法



  如果您还不是本站会员
欢迎加入
  • ※ 评论注意事项:
  • 不是会员或未登陆发表评论,评论人名字显示为匿名。
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规。
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任。
  • 本站管理人员有权保留或删除评论中的任意内容。
  • 参与本评论即表明您已经阅读并接受上述条款。
站内搜索
本栏热门
计算机及通讯技术已成为工业环境中大部分解决方案的核心部分,其在系统中的比重正在迅速增加。在工业控制中,交流电机的拖动越来越多的采用变频器完成,不仅作为一个单独的执行机构,而是随着不断的智能化,同远程计算机之间可以通过各种通讯方式结合成一个有机的整体。
自来水是保障城市经济发展和人民生活的重要基础设施,是保障城市繁荣发展、人民生活以及发展国民经济不可缺少的先决条件。从另一个方面来说,我国是一个高度缺水的发展中国家,随着改革开放的不断深入和发展以及人口数量的不断增长,无论从自来水产量和质量上,社会都对城市供水提供了更高的要求。而实现水厂与供水调度系统的自动化,是保证自来水安全
西门子提供的最新软件:Simatic Net PC-Software CD 2005为各种组态软件的开发提供了一个统一的平台,它建立的PC站既为一些组态软件,如:WinCC、Protol等提供了与PLC的通讯平台,也提供了一套编程接口,可使用高级语言编程通过Simatic Net访问PLC数据。
针对控制系统中上位机与S7-200系列PLC通信的实际问题,总结了几种监控计算机与S7-200系列PLC的通信方法,这几种方法在不同的控制系统中能较好解决监控计算机与S7-200系列PLC通信问题。西门子工控产品在工控领域应用市场中有较高的占有率,S7-200系列PLC是西门子SIMATIC PLC
西门子S7-200PLC是德国西门子公司生产的小型PLC。S7-200以其高可靠性、指令丰富、内置功能丰富、强劲的通讯能力、较高的性价比等特点,在工业控制领域中被广泛应用。S7-200PLC的突出特点之一是自由口通讯功能。如何实现S7-200PLC与个人计算机的互联通信,是S7-200PLC应用

设为首页| 加入收藏| 联系我们
Copyright 2004-2007 Www.plc365.coM All Rights Reserved
免费提供PLC可编程控制器编程资料,应用案例,软件下载
请使用1024*768分辨率浏览本站以达到最佳视觉效果