S7-s7 200 smart opcOPC Server 是不是就是Simatic net

运用VC#编程通过OPC方式实现PC机与西门子PLC通讯--同步篇
运用VC#编程通过OPC方式实现PC机与西门子PLC通讯--同步篇
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
西门子工业自动化群号:&
(技术交流加此群)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运用VC#编程通过OPC方式实现PC机与西门子PLC通讯--同步篇
1、&OPC服务介绍
  西门子提供的最新软件:Simatic&Net&PC-Software&CD&2005为各种组态软件的开发提供了一个统一的平台,它建立的PC站既为一些组态软件,如:WinCC、Protol等提供了与PLC的通讯平台,也提供了一套编程接口,可使用高级语言编程通过Simatic&Net访问PLC数据。本文讨论的主要就是这个编程接口,最新版的Simatic&NET支持五种编程方式:
&1&、ActiveX控件
  提供了一系列数据访问控件,以便于向VB6这种语言使用控件的方式与PLC通讯。
&2&、OPC自动化
为VB6、Dephi等语言运用OLE&自动化的方式进行编程。
&3&、OPC用户接口
  这是专门为VC++提供的一种高效编程方式,其灵活程度与执行效率比前面的两种方式均要高得多。
&4&、针对微软的.NET平台的OPC用户接口
  这也是一种非常灵活的编程接口,不过它针对的是.NET平台,其提供了大量的.NET类库,以便于像VC#、VB.NET等高级语言编程。本文将详细的介绍该接口。
&5&、OPL&XML接口
  顾名思义,主要是针对XML编程的。
  对于&2&、&3&、&4&编程方式,他们各自又可以分为同步访问方式和异步访问方式。按西门子的文档解释:同步通讯指的是当一个客户在访问服务器时,其他客户的访问必须等待,直到服务器处理完该客户的请求,才能继续进行下一个服务,异步访问与之正好相反,本文主要讲的是同步编程篇,异步篇以后再提供。
2、&配置OPC服务器
  要进行编程,必须先配置服务器。本文以Prfibus&DP网络为例,介绍PC站的配置。其内容主要来自西门子文档。
需要的软件:
Step7&V5.3
Simatic&Net&PC-Software&CD&2005&
需要的硬件:
  至少为CP5611或以上级别,笔记本可以为CP5511,带DP口的S7-300&PLC(若使用Simatic&NET的仿真功能可以不需要这些硬件,后面会介绍到)
  &1&、组态一个S7站,配置Profibus&DP网络,其DP地址设为3,并下载到PLC,然后把网线由MPI口转到DP口。S7站的配置这里就不介绍了。
  &2&、在&Step7&V5.3中建立一个新工程,插入一个PC站,并把该PC站的名字改成与你的计算机名字相同。打开该PC站的硬件组态界面。插入OPC服务器和连接卡CP5611(或者CP5511),他们在PC槽中处的位置可以任意,
  注:在插入CP5611时,应该选择与组态S7站一样的Profibus网络,并将网络地址设为2,一定不要与PLC的地址冲突。
  然后点击下面工具条标为红色的按钮:
  选中”OPC&Server”,然后插入一个新的连接,
  在弹出的对话框中选择连接类型为S7&Connection,
  在OK后,然后在新对话框的红色标志位置输入3,表示PLC的地址,
  并选择Address&Details…,设置CPU的槽号为2,
  OK后,然后编译并保存。
  &3&、然后建立OPC服务器,有两种方式,本文介绍较简单的一种。
  打开,Simatic&Net中的Station&Configurator,一般安装后,他会自动启动,并点击Import&Station…按钮,找到你刚才在Step&7中建立PC站时创建的
  XDBs文件夹下的XDB文件,然后导入成功。
  &4&、可以使用Simatic&Net中的OPC&Scout,并选择Simatic&NET服务,然后在它下面创建组,然后在组下创建变量,这样可以监控PLC数据,VC#编程不需要使用该程序,但熟悉使用OPC&Scout有利于了解Simatic&Net中的编程结构。
  说明:打开Simatic&Net中的Configuration&Console,选中S7进行如下的配置后,可以不需要PLC、CP5611等并可以模拟,
  上面的所有步骤,均可在Configuration&Console下,PC&Station的根树下,选择相应的帮助文档得到。
3、&OPC编程
&1&、西门子的变量结构如下:
----------------------服务器------------------------------
/&OPC.SimaticNet&OPCServer.Wincc&....&(一系列类型的服务器)
/&Group1&Group2&Group3&...(把更新时间一致的变量统一为一个组)
/&Item1&Item2&...&(变量:I、Q、M、DB等,指向网络中某个PC站OPC&Server服务的某个连接)
-----------------------------------------------------------------------------------------------------------------&
  第一层是不同种类的服务器,如:OPC.SimaticNET类型,OPC.SimaticNET.DP类型,OPCServer.WinCC等一系列类型,这里选择OPC.SimaticNET类型。
第二层是Group,一个服务器下可以有多个组,可以把组理解为扫描周期相同的一系列变量的集合。在开发组态界面时,可以把一个界面中的所有变量统一到一个组中。
第三层是Item,项是指向网络中某个PC站OPC&Server服务的某个连接的一系列变量,如:I、Q、M、DB等
&2&、项的命名
  项即Item,在S7连接中针对的直接是PLC中的变量,因此它的命名很重要:
  格式:&:[]
其中的protocolID表示连接类型,在上面的组态PC站时可以选择,这里应该与它一致,类型有9种,最常用的为S7,即S7连接,其他类型请参看文档。
  Connectionname:顾名思义,即在上面的组态PC站时产生的连接名,如果使用仿真功能,连接名为DEMO&Variablename:变量名有一系列规则,这里举例说明,读者也可以使用OPC&Scout创建变量,学习程序是如何生成变量名的。
S7:[DEMO]MB1&:表示连接类型为S7,连接名为DEMO(这里为仿真),变量为MB1
S7:[DEMO]QB0,3:&表示为从QB0开始的三个连续变量。
S7:[DEMO]DB10,X4.6&:表示DB10的DBX4.6。
&3&、添加引用
  在VC#开发环境中添加对OpcRcw.Da库的引用引用,该库属于.NET库,不属于COM库,西门子虽然编写了类库,以提供对.NET平台的支持,但这些类库仍然难于编程,
  里面包含了大量的在托管和非托管区传输数据,因此我们需要在它的基础上再开发一个类库,以简化以后的编程,首先在类的开头使用命名空间:
using&System.Runtime.InteropS
using&OpcRcw.Da;
using&System.C
1、&在类的开头部分生名变量
private&string&serverType="";
private&IOPCServer&pIOPCS&//&OPC&server接口
private&Object&pobjGroup1;&//&Pointer&to&group&object&
private&int&nSvrGroupID;&//&server&group&handle&for&the&added&group&
private&System.Collections.Hashtable&groupsID=new&Hashtable(11);&//用于记录组名和组ID号
private&System.Collections.Hashtable&hitemsID=new&Hashtable(17);&//用于记录项名和项ID号
private&Guid&iidRequiredI
private&int&hClientGroup&=&0;&//客户组号
private&int&hClientItem=0;&//Item号
2、&创建服务器,编写Open()方法
///&创建一个OPC&Server接口
///&返回错误信息
///&若为true,创建成功,否则创建失败
public&bool&Open(out&string&error)
error="";bool&success=
Type&svrComponenttyp&;
//获取&OPC&Server&COM&接口
iidRequiredInterface&=&typeof(IOPCItemMgt).GUID;
svrComponenttyp&=&System.Type.GetTypeFromProgID(serverType);
//创建接口
pIOPCServer&=(IOPCServer)System.Activator.CreateInstance(svrComponenttyp);
catch&(System.Exception&err)&//捕捉失败信息
error="错误信息:"+err.Msuccess=
3、&在服务器上添加用于添加Group的函数
///&添加组
///&/创建时,组是否被激活
///&//组的刷新频率,以ms为单位
///&返回错误信息
///&若为true,添加成功,否则添加失败
public&bool&AddGroup(string&groupName,int&bActive,int&updateRate,out&string&error)
int&dwLCID&=&0x407;&//本地语言为英语&
int&pRevUpdateR
float&deadband&=&0;
//&处理非托管COM内存
GCHandle&hD
IntPtr&pTimeBias&=&IntPtr.Z
hDeadband&=&GCHandle.Alloc(deadband,GCHandleType.Pinned);
pIOPCServer.AddGroup(groupName,&//组名
bActive,&//创建时,组是否被激活
updateRate,&//组的刷新频率,以ms为单位
hClientGroup,&//客户号
pTimeBias,&//这里不使用
(IntPtr)hDeadband,
dwLCID,&//本地语言
out&nSvrGroupID,&//移去组时,用到的组ID号
out&pRevUpdateRate,&//返回组中的变量改变时的最短通知时间间隔
ref&iidRequiredInterface,
out&pobjGroup1);&//指向要求的接口
hClientGroup=hClientGroup+1;
int&groupID=nSvrGroupID;
groupsID.Add(groupName,groupID);
catch&(System.Exception&err)&//捕捉失败信息
error="错误信息:"+err.M
if&(hDeadband.IsAllocated)&hDeadband.Free();
if(error=="")
4、&向指定的组中添加变量的函数
///&添加多个项到组
///&指定组名
///&指定项名
///&由函数返回的服务器确定的项ID号
///&无错误,返回true,否则返回false
public&bool&AddItems(string&groupName,string[]&itemsName,int[]&itemsID)
bool&success=
OPCITEMDEF[]&ItemDefArray=new&OPCITEMDEF[itemsName.Length];
for(int&i=0;i&ITEMSNAME.LENGTH;I++)
hClientItem=hClientItem+1;
ItemDefArray[i].szAccessPath&=&"";&//&可选的通道路径,对于Simatiic&Net不需要。
ItemDefArray[i].szItemID&=&itemsName[i];&//&ItemID,&see&above
ItemDefArray[i].bActive&=&1;&//&item&is&active
ItemDefArray[i].hClient&=&hClientI&//&client&handle&
ItemDefArray[i].dwBlobSize&=&0;&//&blob&size
ItemDefArray[i].pBlob&=&IntPtr.Z&//&pointer&to&blob&
ItemDefArray[i].vtRequestedDataType&=&2;&//Word数据类型
//初始化输出参数
IntPtr&pResults&=&IntPtr.Z
IntPtr&pErrors&=&IntPtr.Z
//&添加项到组
((IOPCItemMgt)GetGroupByName(groupName)).AddItems(itemsName.Length,ItemDefArray,out&pResults,out&pErrors);
//&Unmarshal&to&get&the&server&handles&out&fom&the&m_pItemResult&
//&after&checking&the&errors
int[]&errors&=&new&int[itemsName.Length];&
Marshal.Copy(pErrors,&errors,&0,itemsName.Length);
IntPtr&pos&=&pR
for(int&i=0;i
if&(errors[i]&==&0)
OPCITEMRESULT&result&=&(OPCITEMRESULT)Marshal.PtrToStructure(pos,&typeof(OPCITEMRESULT));
itemsID[i]&=&result.hS
this.hitemsID.Add(itemsName[i],result.hServer);
pos&=&new&IntPtr(pos.ToInt32()&+&Marshal.SizeOf(typeof(OPCITEMRESULT)));
catch&(System.Exception&err)&//&catch&for&error&in&adding&items.
//&释放非托管内存
if(pResults&!=&IntPtr.Zero)
Marshal.FreeCoTaskMem(pResults);
pResults&=&IntPtr.Z
if(pErrors&!=&IntPtr.Zero)
Marshal.FreeCoTaskMem(pErrors);
pErrors&=&IntPtr.Z&
  说明:使用该函数时,在类的开头,应该先声明整数数据,以用于保存由本函数返回的服务器对每一项分配的Item&ID号:
5、&向指定组中指定的一系列项变量写入数据的公开方法
///&一次性写入多个值
///&指定组名
///&由服务器给每个项分配的标志号
///&一系列值
///&无错误,返回true,否则返回false
public&bool&Write(string&groupName,int[]&itemID,object[]&values)
bool&success=
IntPtr&pErrors&=&IntPtr.Z
if(GetGroupByName(groupName)&!=&null)
{&//同步写入
((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.Z&
catch(System.Exception&error)
注:参数int[]&itemID应该是与AddItems函数中的int[]&itemsID参数相对应。
6、&编写获取变量值的函数
///&一次性读取多个数据
///&指定组名
///&&由服务器给每个项分配的标志号
///&返回的值
///&无错误,返回true,否则返回false
public&bool&Read(string&groupName,int[]&itemID,object[]&result)
bool&success=
//指向非托管内存
//指向非托管内存
IntPtr&pItemValues&=&IntPtr.Z
IntPtr&pErrors&=&IntPtr.Z
if(GetGroupByName(groupName)!=null)
{&//同步读取
((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&=&pItemV
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].vDataV
catch(System.Exception&error)
  注:同Write()函数一样,参数int[]&itemID应该是与AddItems函数中的int[]&itemsID参数相对应。
  通过给类编写上面的几个最重要的函数,我们已经可以读写PLC数据了,下面给出例子。
  创建一个C#工程,添加对上面开发的类库的引用,并在窗体类的开头,声名:
int[]&nt=new&int[2];int[]&nt1=new&int[2];
S7Connection.SynServer&
其中的SynServer即为上面开发的类。
&1&、创建服务器接口
在程序初始化处,添加:
server&=new&S7Connection.SynServer(S7Connection.ServerType.OPC_SimaticNET);
&2&、打开连接
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.T
obj[1]=this.textBox3.T
if(radioButton1.Checked)&
server.Write("maiker",nt,obj);
else&if(radioButton2.Checked)
server.Write("maiker1",nt1,obj);
  至此并完成了数据的通讯,如何,只要你把类库开发完善,在它的基础上再开发,会异常简单,本人已开发了完善的类库,上面的类库只是把最重要的部分讲解出来,我曾经在网上求助过很多次这方面的知识,无人应答。唉!太不容易了,等待Simatic&NET软件花费了我一个月的时间,然后读几百页的英文文档,到开发程序,并测试花费了我一个星期的空闲时间,写这篇文章,又花费了我一个晚上的时间,不过我还是愿意把这些摸索出来的东西发给大家。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看: 2476|回复: 0
在Windows 8 和 Windows Server 2012 上部署SIMATIC NET V12
在线时间1094 小时
主题帖子积分
问题描述 新 近发布的SIMATIC NET V12取代了先前的SIMATIC NET V8.2,除Windows7(x32/x64)和Windows Server 2008 R2外,还支持Windows8和Windows Server 2012,本例中介绍在Windows8和Windows Server 2012上如何部署SIMATIC NET V12以及OPC(S7) Server。注意:SIMATIC NET V12的详细发布信息可以参考以下链接:http://support./CN/view/zh/硬件和软件环境& & 本例中使用了两台PC机,分别作为工程师站(ES)和操作员站(OS)。工程师站用于组态OPC(S7) Server,操作员站用于运行OPC(S7) Server。
PC操作系统软件工程师站(ES)Field PG M3Windows7 Ultimate SP1 ENG x32STEP7 Professional&&V12 SP1 Update2,SIMATIC NET V12操作员站(OS)HP Compaq 8200 EliteWindows8.1 Enterprise CHN x64
Windows Server 2012 Data Center CHN x64SIMATIC NET V12
表1& &&&本例中在操作员站(OS)上安装了CP1613 A2,OPC(S7) Server使用它和CPU 317F-2PN/DP建立S7连接。注意:一般情况下,建议在工程师站(ES)上安装STEP7 Professional,在操作员站(OS)上安装SIMATIC NET。操作步骤1. 在Windows8上安装SIMATIC NET V121.1 运行SIMATIC NET V12的安装程序,默认情况下系统会提示因缺少.NET Framework 3.5而无法安装,如图1和图2所示。
NetV12_00.png (34.49 KB, 下载次数: 0)
09:59 上传
NetV12_01.png (10.07 KB, 下载次数: 0)
09:59 上传
图2. 1.2 根据系统提示在“控制面板” - “启用或关闭Windows功能”中选择.NET Framework 3.5进行安装,如图3所示。
NetV12_02.png (44.24 KB, 下载次数: 0)
09:59 上传
1.3 默 认情况下系统将连接到互联网进行在线下载安装,如果系统未连接到互联网,系统会提示无法安装。实际上Windows8的安装光盘中已经包含了.NET Framework 3.5,但并未将安装文件拷贝 至硬盘,需要手动安装。如果系统未连接到互联网,在“应用”中选择“命令提示符”,并选择“以管理员身份运行”,如图4所示。
09:59 上传
( 215 KB )
注意:也可以使用键盘上的Windows+X组合键,打开快捷菜单,选择“命令提示符(管理员)”。1.4 在 命令行中输入&DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /SourceDVD-ROM$:sourcessxs&, 其中&$DVD-ROM$&为Windows8安装光盘所在光驱编号,本例中为&O&,如图5所示。
NetV12_13.png (16.4 KB, 下载次数: 0)
09:59 上传
图5.注意:也可以使用虚拟光驱装载Windows8安装光盘的镜像文件,&$DVD-ROM$&为虚拟光驱编号。1.5 重新运行SIMATIC NET V12的安装程序,可以选择SIMATIC NET PC Software V12.0,如图6所示。
NetV12_14.png (34.42 KB, 下载次数: 0)
09:59 上传
图6.2. 在Windows Server 2012上安装SIMATIC NET V122.1 运行SIMATIC NET V12的安装程序,与Windows8的情况相同,默认情况下系统会提示因缺少.NET Framework 3.5而无法安装。2.2 根据系统提示在“服务器管理器”中选择“添加角色和功能”,如图7所示。
09:59 上传
图7. 2.2 根据向导提示选择“功能”-“.NET Framwork 3.5功能”,如图7和图8所示。
NetV12_24.png (71.73 KB, 下载次数: 0)
09:59 上传
NetV12_25.png (53.2 KB, 下载次数: 0)
09:59 上传
图9.2.3与Windows8的情况相同,默认情况下系统将连接到互联网进行在线下载安装,如果系统未连接到互联网,系统会提示无法安 装,如图10所示。
NetV12_27.png (52.53 KB, 下载次数: 0)
09:59 上传
图10.2.4实际上Windows Server 2012的安装光盘中已经包含了.NET Framework 3.5,但并未将安装文件拷贝 至硬盘,需要手动安装。如果系统未连接到互联网,可以参考条目1.3和1.4手动安装,也可以重新运行向导,在图9所示的“确 认”页中“指定备用源路径”为安装光盘或镜像文件的相应目录,即可完成安装,如图11和图12所示。
NetV12_28.png (65.37 KB, 下载次数: 0)
09:59 上传
NetV12_30.png (41.24 KB, 下载次数: 0)
09:59 上传
图12.3. 部署基于SIMATIC NET V12的OPC(S7) Server& &本 例介绍使用工程师站(ES)在操作员站(OS)上部署基于SIMATIC NET V12的OPC(S7) Server。由于SIMATIC NET V12不包含NCM,且当前版本的STEP7 Professional不支持Windows8和Windows Server2012,所以如果要在作为操作员站(OS)的Windows8和Windows Server 2012上部署OPC Server,需要从能够安装STEP7 Professional或NCM的工程师站(ES)上下载组态。注意:本例中操作员站(OS)的操作系统为Windows8,在Windows Server 2012上的部署与之类似。3.1 在工程师站(ES)上,打开TIA Portal,创建新项目,添加新设备。对于控制器选择相应的,并分配相应的IP地址,如图13和图14所示。
Net_V12_53.png (78.85 KB, 下载次数: 0)
09:59 上传
Net_V12_54.png (52.6 KB, 下载次数: 0)
09:59 上传
图14.3.2 对于PC系统选择OPC Server,在“设备和网络”-“设备视图”中添加CP1613 A2,并分配相应的IP地址,如图15和图16所示。
Net_V12_50.png (53.14 KB, 下载次数: 0)
09:59 上传
Net_V12_52.png (35.89 KB, 下载次数: 0)
09:59 上传
图16.3.3 在SIMATIC PC Station的属性中,输入操作员站(OS)的计算机名,并选择“PC名称和PC站名称相同”,如图17所示。
Net_V12_51.png (37.03 KB, 下载次数: 0)
09:59 上传
图17. 3.4 在“设备和网络”-“网络视图”中,在OPC Server和PLC之间建立S7连接,如图18所示。
Net_V12_55.png (28.39 KB, 下载次数: 0)
09:59 上传
图18.3.5 在工程师站(ES)上打开Simatic Shell,选择相应的网卡作为终端总线,用于连接操作员站(OS),如图19所示。
Shell01.png (42.95 KB, 下载次数: 0)
09:59 上传
图19.3.6 在操作员站(OS)上的“应用”中打开Siemens Automation - Communication Settings,如图20所示。
09:59 上传
( 306 KB )图20.3.7在Modules - CP1613 - Address中设置IP地址。CP1613/CP1623具有两个IP地址:NDIS(Network Driver Interface Specification/网络驱动接口规范)用于和办公室环境的PC机通信;Industrial Ethernet(RFC1006/ISO-on-TCP)用于和现场PLC通信。如图21所示。
NetV12_37.png (78.01 KB, 下载次数: 0)
09:59 上传
图21. 注意:仅NDIS支持ICMP(Internet Control Message Protocol)协议,即可用PING(Packet Internet Grope)命令检测网络通信状态。3.6 在操作员站(OS)上打开SIMATIC Shell,选择CP1613 A2作为终端总线,用于连接工程师站(ES),如图22所示。
NetV12_35.png (20.71 KB, 下载次数: 0)
09:59 上传
图22.3.7 在工程师站(ES)上向操作员站下载PC Station,在项目树中的PC Station上右键选择“在线组态PC站”,如图23所示。
Net_V12_61.png (59.24 KB, 下载次数: 0)
09:59 上传
图23.3.8 在“组态”对话框中选择相应的网卡和操作员站(OS)上,选择“组态”并确定,如图23和图24所示。
Net_V12_62.png (21.18 KB, 下载次数: 0)
09:59 上传
Net_V12_63.png (22.53 KB, 下载次数: 0)
09:59 上传
图24.3.9 组态完毕后,在操作员站(OS)上的Station Configuration Editor中,OPC Server和CP1613已经加载,如图26所示。
NetV12_34.png (18.24 KB, 下载次数: 0)
09:59 上传
图26.3.10 在“扩展的下载到设备”对话框中,选择相应的网络设置和目标设备,选择“装载”,如图27和图28所示。
Net_V12_60.png (46.29 KB, 下载次数: 0)
09:59 上传
Net_V12_64.png (25.56 KB, 下载次数: 0)
09:59 上传
图28.3.11 下载完毕后,在操作员站(OS)上的Station Configuration Editor中,OPC Server及其S7连接和CP1613已经加载,如图29所示。
NetV12_36.png (18.11 KB, 下载次数: 0)
09:59 上传
图29.3.12 在操作员站(OS)上,使用客户端OPC Scout V10测试通信数据,如图30和图31所示。
09:59 上传
09:59 上传
Powered bysimatic net支持多少用户_百度知道

我要回帖

更多关于 s7 200 opc server 的文章

 

随机推荐