C# 读写西门子 PLC数据并实现语音报警文档格式.docx
- 文档编号:8257761
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:15
- 大小:184.94KB
C# 读写西门子 PLC数据并实现语音报警文档格式.docx
《C# 读写西门子 PLC数据并实现语音报警文档格式.docx》由会员分享,可在线阅读,更多相关《C# 读写西门子 PLC数据并实现语音报警文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
选择“添加新的驱动程序”->
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<
NumItems+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());
//三个参数:
语速,音量,内容
publicvoidSpeechVideo_Read(intrate,intvolume,stringspeektext)
{
speech.Rate=rate;
speech.Volume=volume;
speech.SpeakAsync(speektext);
}
if(Value1>
80)//语音报警测试
SpeechVideo_Read(0,80,"
当前液位为"
+Value1.ToString()+"
液位高报警"
);
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();
//去除两端空格
//过去计算机名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服务器是否启动!
成功获取OPC服务器!
catch(Exceptionerr)
ShowMessage(err.ToString());
privatevoidShowMessage(stringstr)//文本框消息提示
TextBox3.AppendText(str+"
\r\n"
TextBox3.ScrollToEnd();
privatevoidBtn3_Click(objectsender,RoutedEventArgse)//连接OPC服务器
if(OpcServerList.Text=="
请先选择OPC服务器!
if(Server.ServerState==Convert.ToInt32(OPCServerState.OPCDisconnected))
Server.Connect(OpcServerList.Text);
Btn3.Content="
断开OPC服务器"
;
成功连接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];
5;
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);
Server.Disconnect();
连接OPC服务器"
;
OPC服务器连接已断开!
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;
开始读取数据"
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);
//异步读取数据完成,数据处理
if(d[1]>
80)
+d[1].ToString()+"
SpeechVideo_Read(0,80,"
if(d[2]<
10)
+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异步写数据
//将输入的数据赋给数组,然后在转成Array给AsycWr_Value、
//将输入数据的Item对于服务器句柄赋给数据,然后转成Array类型给SerHandles
privatevoidGroup_AsyncWriteComplete(intTransactionID,intNumItems,refArrayClientHandles,refArrayErrors)
ShowMessage(NumItems.ToString()+"
个数据写入成功!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 读写西门子 PLC数据并实现语音报警 读写 西门子 PLC 数据 实现 语音 报警