如何把PC改技成plc培训网?

核心提示:10PLC/1PC组网通讯如何设置?
有10个315-2dp带西门子电量模块PAC3200通过PROFIBUS-DP连接,1个pc带5621卡,想用PC做OPC访问10个cpu,请问如何设置?1、pc设置是否为主站?2、cpu如何设置,因为已经带了一个PAC3200,能否与PC过来的PROFIBUS-DP共用CPU的DP口?3、实际中,我用pc连了1个CPU,s7连接方式,PLC设为主站,此时热插拔pc端的DP头,会导致PLC死机,
10PLC/1PC组网通讯如何设置?
有10个315-2dp带西门子电量模块PAC3200通过PROFIBUS-DP连接,1个pc带5621卡,想用PC做OPC访问10个cpu,请问如何设置?1、pc设置是否为主站?2、cpu如何设置,因为已经带了一个PAC3200,能否与PC过来的PROFIBUS-DP共用CPU的DP口?3、实际中,我用pc连了1个CPU,s7连接方式,PLC设为主站,此时热插拔pc端的DP头,会导致PLC死机,请问是否是PLC设置问题?
问题补充:非常感谢!还有一些问题求教大侠1、按照《通过PROFIBUS建立SIMATIC&NET&OPC&服务器与PLC&的S7连接》设置,是否每个PLC都是DP主站?其实PLC都是独立设置的,不用管PC是如何设置的?2、PC可以通过s7连接10个PLC站点吗?每个PLC包含PAC3200的话,DP站点实际上是20个?3、对于OB块,以OB80为例,如果OB80&未编程,CPU&变为STOP&方式,也就是说发生故障时,本来是死机的,现在变成停止运行了,并且可以通过OB80的变量来看到故障信息,是这样吗?4、前面讲的DP拔出死机,是不是属于OB87故障?如果OB87&未编程,CPU&不进入STOP&方式。那么此时CPU还是运行0B1吗?重新插上DP,还能正常通讯吗?
1、PC(WINCC)设置为主站。2、ROFIBUS-DP共用CPU的DP口?ROFIBUS-DP可以线性连接。通过PROFIBUS-DP连接,具体方法参见:&通过PROFIBUS建立SIMATIC&NET&OPC&服务器与PLC&的S7连接()&&&&&&:http://www2..cn/Download/Upload/AS/application/A0037.pdf相关文档:《PROFIBUS&DP连接器选型表及安装说明》连接:/manual/view.asp?id=423、PLC设为主站,此时热插拔pc端的DP头,会导致PLC死机?是的。如果不想使CPU停机,可以在添加一些相应的OB(组织块),不需编程。例如:CPU程序需要添加一些对应的OB组织块,当发生相应故障时如CPU不停机:OB81&&电源故障OB82&&诊断中断OB83&&插入/拔出模块中断OB85&&优先级错误OB86&&扩展机架,DP主站系统或者分布式I/O故障OB87&&通讯故障OB121编程错误OB122&&I/O访问错误相关文档:详见《组织块使用说明》下载:http://218.93.112.166/ec/C23/dl/xxzl/%E7%BB%84%E7%BB%87%E5%9D%97%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.pdf&S7-300400的系统软件和标准功能&下载:http://www2..cn/download/Upload/AS/manual/1023.pdf
【】【】【】【】【】
上一篇:下一篇:
投诉与建议
订阅精彩内容
销售热线:020-20287
项目洽谈:020-33145
联系传真:020-36394
技术热线:020-
公司地址:广州市中山大道建中路5号广海大厦海天楼室
在线留言系统&select name="site" class="left"&
&option value="网易" selected="selected"&新闻&/option&
&option value=""&网页&/option&
利用专业知识入侵多所高校的数据库22岁的达州人闫某是四川一所高校的大学生,主攻计算机专业。2015年7月,闫某准备参加四川省举办的一网络安全大赛,在对自己就读的学校教务处信息管理系统进行扫描时,闫某发现该系统存在漏洞,进而可以获取管...
用李彦宏的话说,这次“魏则西事件”引起网友的愤怒之情,超过了以往百度经历的任何危机。最根本的原因是,它或许已经触及百度最根本的商业模式。5月9日,调查组要求百度整改的内容包括:一、立即全面清理整顿医疗类等事关人民群众生命健康安全的商...
Mac Pro性能看起来已经不行了,那么它还能有什么用处吗?作为 Power Mac 的替代者,Mike of Key 工作室的朋友告诉我们,他们为了 Mac Pro 花费了不少金钱,而如今它在运行那些更新更高清的视频时,已经显得很...
“Raven Felix Null”在Reddit上自曝了这段非同寻常的“超VIP待遇”经历,因为很多IT系统都不认“Null”这个姓氏。如果在系统中强行填入这个单词,软件会拒绝验证。为了息事宁人,很多商家只能给吃哑巴亏。
另外,谷仓内部还设置有一个壁炉,内置的旋转楼梯则可以通往阁楼。这个建筑最令人印象深刻的部分在于它可以变形。谷仓的隔热百叶窗可以拉起来,这时候我们就能看到一个可以旋转的窗口,有点类似玻璃车库门。目前,这座谷仓建筑已经入围了史蒂芬·劳伦...
专利中展示的这款手柄和Wii U的手柄其实很像,中央位置有个很大的触屏,两侧有摇杆,还有左侧的D-pad按键区。除了肩键改成了滚轮,主要差别在于正面右边只有两个按键,而非常见的四个。据说滚轮在操作上会比较类似于电脑上的鼠标,也就是可以一直滚。
因为4月20日是国际大麻日,是美国大麻合法化的日子,所以大麻吸食者很喜欢数字。这也是“420英里”路标能有这么大吸引力的原因。可能是因为近年来科罗拉多州和华盛顿州放宽了大麻法律,才导致“420英里”的路标如此受欢迎。
拥有八位处理器和64KB内存的它在当时十分畅销,甚至一度占到了市场30%到40%的份额。这么经典的设定,怀念它的人自然多得很,于是乎这款Commodore64笔记本电脑就出现了。这个DIY作品非常精致,优雅的纯白外壳上标有Commo...
如果问您什么是幸福,怎样就能感受到幸福,我想有一部分人会说要WiFi......小编在玩笑后,和大家聊聊无线的重要性,很多人现在离不开手机,也就是无线网络,不管是在家里、办公室还是在商城和饭店,都会去寻找无线的存在,而网络也是成为我...
与上代产品miCoach Smart Run相比,Fit Smart智能手环将LCD彩色显示屏改成了与FuelBand SE类似的LED点阵式屏幕。不过分辨率是后者的两倍。在手环的背部,一个泛着绿光的感应器极有可能是心率监测器。
一提起饮料我想很多人都会想到可乐,而说到可乐我想大部分人对于它的造型也不会有太大的要求,而今天我们就给大家看一个非常有趣的事情,百事可乐的新造型。大家都知道可乐是高糖分的饮料,对于怕胖的人群来说,喝。
此前有玩家声称可以将迪兰的R9290轻松刷成R9290X,释放隐藏的256个流处理器,但因为缺乏更多作证而存在争议。现在好了,英国零售商OverClockersUK手里有一批具备开核潜质的VTX3DR9290,并公然为买家提供预刷开核服务,更良心的是还有两年质保。
临颍县瓦店镇陶庄村,有这样一位农民,别人需要忙乎两三天才能拔完的草,他只用半天时间就可以除完。这都得归功于他发明的除草神器。田金铭今年63岁,是临颍县瓦店镇陶庄村人。1月21日下午,记者经过瓦店镇陶庄村时,田金铭正在自家农田里忙碌,...
苹果智能手表 Apple Watch 一共有 4 个版本,349 美元的运动版;549 美元的标准版;1100 美元的爱马仕版以及 10000 美元以上的 Apple Watch Edition 版本。
曝光可以看出HTC舍弃了M系列前面板繁重的设计,改得非常简洁,上方的听筒变成了细长的条状设计,前置摄像头应该和传感器合并一起。另外HTC One A9舍弃了BoomSoun扬声器,但是下方有实体Home键以及HTC的LOGO,因此下...
摘要:如果一台 NDS 直接给摔成两半,我们除了默哀估计也没办法做什么了吧。不过 Anthony Thomas 可不这么想:折腾折腾,又是一部新游戏机。eBay 上什么东西都有得卖,包括一台只有下屏好使的 NDS Lite。
在接受采访中Green表示:“我登陆我不喜欢教师的电脑,并尝试在电脑上设置这些不适当的照片来惹恼他。”至于如何获得密码,他表示这名老师的密码非常简单,就是他的姓氏,而且在此前Green曾看到过他输入。
根据调查由于经济拮据,想要取消由Comcast提供的有线服务,所以她打电话联系了Comcast要求取消她家里的有线布局,不过Comcast给出的回复是要求她支付$60的费用,并多次推荐她继续保留有线服务并再签署两年的合约。
客户闻声挂断电话 竞争对手来电取笑“你公司怎么在太平间啊?”昨天上午,做玻璃门生意的刘先生接到一个电话,电话刚接通,对方就在电话里反问他:“你不是做玻璃门的吗?怎么电话铃声说你的地址在太平间?简直吓。
更幸运的是,他的妻子虽然起初并不看好丈夫要做的这件事情,却一直很支持他追随自己的心意。她表示看到丈夫成型的作品后还是十分钦佩他的。
&select name="site" class="left"&
&option value="网易" selected="selected"&新闻&/option&
&option value=""&网页&/option&
热门搜索:PLC与电脑连机要怎样设置?_百度知道文章 - 19&评论 - 2&trackbacks - 0
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=
//获取 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
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.SynS
其中的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);
阅读(...) 评论() &您现在所在的是:
→ 浏览主题:
* 帖子主题:
年度积分:50
历史总积分:50
注册时间:
买的上面那个板子像学习一下,但是通讯一直不成功,改怎么办?5分悬赏
lixuefeng7272
文章数:1060
年度积分:903
历史总积分:4614
注册时间:
你确定你能看懂英文版的。通讯口才是关键。
不要怕被别人利用,人家利用你说明你还有用
文章数:2103
年度积分:1330
历史总积分:3891
注册时间:
改不成0 就把PLC的改高点呀 为什么PLC一定要0呢
年度积分:50
历史总积分:50
注册时间:
买的第三个图那个板子,想自己学学,一开始通讯连不上,问客服,客服说把地址改成0,我死活该不过来,后来客服远程操作也改不过来。刚才用别人的电脑试了试,打开软件就是0,但通讯也连不上此帖发自手机工控论坛
文章数:1275
年度积分:889
历史总积分:4458
注册时间:
以下是引用sddtwx在 23:24:31的发言:
买的第三个图那个板子,想自己学学,一开始通讯连不上,问客服,客服说把地址改成0,我死活该不过来,后来客服远程操作也改不过来。刚才用别人的电脑试了试,打开软件就是0,但通讯也连不上
楼主,解决了吗?我也是遇到这样的问题。
工控学堂推荐视频:}

我要回帖

更多关于 plc pc 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信