C# 读写西门子 PLC数据并实现语音报警.docx
- 文档编号:11607104
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:15
- 大小:184.94KB
C# 读写西门子 PLC数据并实现语音报警.docx
《C# 读写西门子 PLC数据并实现语音报警.docx》由会员分享,可在线阅读,更多相关《C# 读写西门子 PLC数据并实现语音报警.docx(15页珍藏版)》请在冰豆网上搜索。
C#读写西门子PLC数据并实现语音报警
C#读写西门子PLC数据并实现语音报警
1.西门子PLC配置及程序
2.Wincc和西门子通讯配置
3.C#OPC读取PLC数据(通过WINCC)
4.C#文字转语音
5.完整程序
先演示一下效果:
选择Wincc做OPCserver
4个变量值显示
点击“写数据”,会把上面textbox的3写入变量1和变量2,程序中设定的只能写这2个
1.西门子PLC配置及程序
1.1硬件配置
新建一个工程,插入一个带以太网的CPU(和WINCC通过以太网连接),如下:
IP地址设置
1.2软件设计
简易程序实现加减乘除累计
CPU设置M0.5每1S触发一次
以上做完后,我们下载到S7-PLCSIM就可以开始仿真了。
2.Wincc和西门子通讯配置
新建一个Wincc工程,打开变量管理:
3.C#文字转语音
引用自带的System.Speech
选择“添加新的驱动程序”->S7ProtocolSuite,然后新建一个TCP/IP连接:
添加变量:
此处我们仅仅是测试C#读取PLC数据,Wincc只是用作OPC服务器,因此只需要配置到这边就结束了,其它画面编辑什么的这里不做介绍。
3.C#OPC读取PLC数据(通过WINCC)
OPC的数据访问方法分别有同步访问、异步访问和订阅式数据采集方式三种。
之前在ABBPLC和C#通讯介绍了订阅式数据采集,此处再介绍一下异步读取数据,写入数据还是通过异步方法。
//OPC异步读取数据
privatevoidGroup_AsyncReadComplete(intTransactionID,intNumItems,refArrayClientHandles,refArrayItemValues,refArrayQualities,refArrayTimeStamps,refArrayErrors)
{
for(inti=1;i { d[Convert.ToInt32(ClientHandles.GetValue(i))]=Convert.ToDouble(ItemValues.GetValue(i)); } CurValue1.Text=d[1].ToString(); CurValue2.Text=d[2].ToString(); CurValue3.Text=d[3].ToString(); CurValue4.Text=d[4].ToString(); } 此处需要注意,ClientHandles当我每次重新换变量读取数据是,不是1~4这个顺序—_—,避免界面显示的变量值对于不上(如果直接D[i]=Convert.ToDouble(ItemValues.GetValue(i));变量和值就对于不上了…)因此按照客户端句柄来读取。 //OPC异步写入数据 privatevoidWBtn_Click(objectsender,RoutedEventArgse) { ArrayAsycWr_Value; ArraySerHandles; object[]tempWrData=newobject[3];//写入的数据必须是object类型的 int[]tempSerHandles=newint[3]; //将输入的数据赋给数组,然后转成Array给AsycWr_Value tempWrData[1]=(object)WriteText.Text; tempWrData[2]=(object)WriteText.Text; AsycWr_Value=(Array)tempWrData; //将输入数据对应的服务器句柄赋给变量,然后转成Array类型给SerHandles tempSerHandles[1]=Convert.ToInt32(sHandles.GetValue (1)); tempSerHandles[2]=Convert.ToInt32(sHandles.GetValue (2)); SerHandles=(Array)tempSerHandles; try { Group.AsyncWrite(2,refSerHandles,refAsycWr_Value,outErrors_Wr,TransactionID,outCancleID); } catch(Exceptione1) { ShowMessage(e1.ToString()); } 4.C#文字转语音 引用自带的System.Speech //三个参数: 语速,音量,内容 publicvoidSpeechVideo_Read(intrate,intvolume,stringspeektext) { speech.Rate=rate; speech.Volume=volume; speech.SpeakAsync(speektext); } if(Value1>80)//语音报警测试 { SpeechVideo_Read(0,80,"当前液位为"+Value1.ToString()+"液位高报警"); } 5.完整程序 usingSystem; usingSystem.Windows; usingSystem.Windows.Media; usingSystem.Speech.Synthesis; usingOPCAutomation; usingSystem.Net; usingSystem.Threading; namespaceABB语音报警 { publicpartialclassMainWindow: Window { OPCServerServer; OPCGroupsGroups; OPCGroupGroup; OPCItemsItems; privateboolFlag=true; double[]d=newdouble[100]; SpeechSynthesizerspeech=newSpeechSynthesizer(); ArraystrItemIDs; ArraycHandles; ArraysHandles; ArrayErros_read; ArrayErrors_Wr; intTransactionID=1; intCancleID; boolRead_Flag; objectRequestDataTypes=null; objectAccessPaths=null; publicMainWindow() { InitializeComponent(); Server=newOPCServer(); } privatevoidBtn2_click(objectsender,RoutedEventArgse)//获取OPC服务器 { if(TextBox1.Text=="") { MessageBox.Show("请先输入IP地址! "); } else { stringip=TextBox1.Text.Trim();//去除两端空格 try { //过去计算机名Win7貌似新的不行,Win10可以,因此此处还是采用老的方法 objectprogIds=Server.GetOPCServers(Dns.GetHostByAddress(ip).HostName); foreach(varitemin(Array)progIds) { OpcServerList.Items.Add(item);//所有OPC服务器放入Combox中 } OpcServerList.SelectedIndex=0;//默认选择第一个OPC服务器 if(OpcServerList.Text==null) { ShowMessage("获取服务器失败,请检查OPC服务器是否启动! "); } else { ShowMessage("成功获取OPC服务器! "); } } catch(Exceptionerr) { ShowMessage(err.ToString()); } } } privatevoidShowMessage(stringstr)//文本框消息提示 { TextBox3.AppendText(str+"\r\n"); TextBox3.ScrollToEnd(); } privatevoidBtn3_Click(objectsender,RoutedEventArgse)//连接OPC服务器 { if(OpcServerList.Text=="") { MessageBox.Show("请先选择OPC服务器! "); } else { try { if(Server.ServerState==Convert.ToInt32(OPCServerState.OPCDisconnected)) { Server.Connect(OpcServerList.Text); Btn3.Content="断开OPC服务器"; ShowMessage("成功连接OPC服务器! "); Groups=Server.OPCGroups; Groups.DefaultGroupDeadband=0;//缓冲区死区 Groups.DefaultGroupIsActive=true;//缓冲区活动激活 Groups.DefaultGroupUpdateRate=1000;//缓冲区刷新时间 Group=Groups.Add("group1"); Group.IsSubscribed=true;//缓冲区订阅Datachange事件 Items=Group.OPCItems; Group.AsyncWriteComplete+=Group_AsyncWriteComplete;//异步写入数据事件 Group.AsyncReadComplete+=Group_AsyncReadComplete;//异步读取数据事件 string[]tmpIDs=newstring[5]; int[]tmpCHandle=newint[5]; for(inti=1;i<5;i++) { tmpCHandle[i]=i; } tmpIDs[1]=OpcValve1.Text; tmpIDs[2]=OpcValve2.Text; tmpIDs[3]=OpcValve3.Text; tmpIDs[4]=OpcValve4.Text; strItemIDs=(Array)tmpIDs; cHandles=(Array)tmpCHandle; Items.AddItems(4,refstrItemIDs,refcHandles,outsHandles,outErros_read,RequestDataTypes,AccessPaths); } else { Server.Disconnect(); Btn3.Content="连接OPC服务器";; ShowMessage("OPC服务器连接已断开! "); } } catch(Exceptionerr) { ShowMessage(err.ToString()); } } } privatevoidBtn4_click(objectsender,RoutedEventArgse)//开始/停止读取数据 { if(Flag==true) { Threadth1=newThread(Asyc_Read)//新建读取数据线程 { IsBackground=true }; th1.Start(); Btn4.Content="停止读取数据"; Btn4.Background=Brushes.Green; Flag=false; Read_Flag=true; } else { Btn4.Content="开始读取数据"; Btn4.Background=newSolidColorBrush(Color.FromRgb(221,221,221)); Flag=true; Read_Flag=false; } } privatevoidAsyc_Read()//异步读取数据,间隔1秒 { while(Read_Flag) { Group.AsyncRead(4,refsHandles,outErros_read,TransactionID,outCancleID); Thread.Sleep(1000); } } //异步读取数据完成,数据处理 privatevoidGroup_AsyncReadComplete(intTransactionID,intNumItems,refArrayClientHandles,refArrayItemValues,refArrayQualities,refArrayTimeStamps,refArrayErrors) { for(inti=1;i { d[Convert.ToInt32(ClientHandles.GetValue(i))]=Convert.ToDouble(ItemValues.GetValue(i)); } CurValue1.Text=d[1].ToString(); CurValue2.Text=d[2].ToString(); CurValue3.Text=d[3].ToString(); CurValue4.Text=d[4].ToString(); if(d[1]>80) { ShowMessage("当前液位为"+d[1].ToString()+"液位高报警"); SpeechVideo_Read(0,80,"当前液位为"+d[1].ToString()+"液位高报警"); } if(d[2]<10) { ShowMessage("当前液位为"+d[2].ToString()+"液位低报警"); SpeechVideo_Read(0,80,"当前液位为"+d[2].ToString()+"液位低报警"); } } //rate: 范围为: -10~10;volume: 范围为: 0~100;speektext: 待转换声音的文字 publicvoidSpeechVideo_Read(intrate,intvolume,stringspeektext)//语速,音量,内容 { speech.Rate=rate; speech.Volume=volume; speech.SpeakAsync(speektext); } privatevoidWBtn_Click(objectsender,RoutedEventArgse)//OPC异步写数据 { ArrayAsycWr_Value; ArraySerHandles; object[]tempWrData=newobject[3];//写入的数据必须是object类型的 int[]tempSerHandles=newint[3]; //将输入的数据赋给数组,然后在转成Array给AsycWr_Value、 tempWrData[1]=(object)WriteText.Text; tempWrData[2]=(object)WriteText.Text; AsycWr_Value=(Array)tempWrData; //将输入数据的Item对于服务器句柄赋给数据,然后转成Array类型给SerHandles tempSerHandles[1]=Convert.ToInt32(sHandles.GetValue (1)); tempSerHandles[2]=Convert.ToInt32(sHandles.GetValue (2)); SerHandles=(Array)tempSerHandles; try { Group.AsyncWrite(2,refSerHandles,refAsycWr_Value,outErrors_Wr,TransactionID,outCancleID); } catch(Exceptione1) { ShowMessage(e1.ToString()); } } privatevoidGroup_AsyncWriteComplete(intTransactionID,intNumItems,refArrayClientHandles,refArrayErrors) { ShowMessage(NumItems.ToString()+"个数据写入成功! "); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 读写西门子 PLC数据并实现语音报警 读写 西门子 PLC 数据 实现 语音 报警