C#通過S7.NET庫實(shí)現(xiàn)與西門子PLC數(shù)據(jù)交互
拉了換一個(gè)簡單的界面
PLC端設(shè)置
我新建了一個(gè)DB數(shù)據(jù)塊【DB1】,右鍵【DB1】,點(diǎn)擊【屬性】項(xiàng),【優(yōu)化的塊訪問】默認(rèn)是勾選,要想顯示數(shù)據(jù)塊中地址偏移量,需要把【優(yōu)化的塊訪問】勾選取消
PLC與C#數(shù)據(jù)類型對應(yīng)
Bit => bool
Byte => byte
word => ushort
DWord => uint
Int => short
DInt => int
Real => float
LReal => double
String => string
VS2019添加S7.NET庫引用
1、右鍵項(xiàng)目名,選擇圖中【管理NuGet程序包】2、在搜索框輸入【S7netplus】,我安裝的是第一個(gè)。
3、安裝完成引用里面會(huì)自動(dòng)添加【S7.NET】引用,如上圖所示。
連接PLC
public void Open();
this.myPlc.Open();
if (this.myPlc.PlcObject.IsConnected)
{
this.btnOpen.Enabled = false;
this.btnClose.Enabled = true;
this.tsslblIsConnected.BackColor = Color.Green;
this.tsslblIsConnected.Text = "PLC已連接";
this.tsslblIP.Text = this.myPlc.PlcObject.IP.ToString();
this.btnRead.Enabled = true;
this.btnWrite.Enabled = true;
switch (this.myPlc.PlcObject.CPU)
{
case CpuType.S7300:
this.tsslblCpuType.Text = "S7-300";
break;
case CpuType.S7400:
this.tsslblCpuType.Text = "S7-400";
break;
case CpuType.S71200:
this.tsslblCpuType.Text = "S7-1200";
break;
case CpuType.S71500:
this.tsslblCpuType.Text = "S7-1500";
break;
}
}
對于S7-1200和S7-1500,默認(rèn)為機(jī)架= 0,槽位= 0;對于S7-300和S7-400是默認(rèn)的機(jī)架= 0,槽位= 2;端口號默認(rèn)為102。
斷開PLC
public void Close();
this.myPlc.Close();
if (!this.myPlc.PlcObject.IsConnected)
{
this.btnOpen.Enabled = true;
this.btnClose.Enabled = false;
this.tsslblIsConnected.BackColor = Color.Red;
this.tsslblIsConnected.Text = "PLC未連接";
this.tsslblIP.Text = "***********";
this.tsslblCpuType.Text = "******";
this.btnRead.Enabled = false;
this.btnWrite.Enabled = false;
}
讀取單個(gè)數(shù)據(jù)
public object? Read(string variable);
if (this.tabControlRead.SelectedTab == this.tabControlRead.TabPages[0]) //讀取單個(gè)數(shù)據(jù)
{
try
{
this.txtReadResult.Text = DateTime.Now.ToString() + ":" + this.myPlc.Read(this.txtReadSingleAdr.Text.Trim().ToUpper()).ToString();
}
catch (Exception ex)
{
MessageBox.Show("讀取單個(gè)數(shù)據(jù)出現(xiàn)錯(cuò)誤!" + ex.Message, "提示信息");
}
}
我這里把輸入的地址的轉(zhuǎn)換為大寫字母;如果不轉(zhuǎn)換,輸入小寫字母會(huì)出現(xiàn)報(bào)錯(cuò)。
讀取數(shù)組數(shù)據(jù)
public object? Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount, byte bitAdr = 0);
switch (this.cboReadVarType.Text.Trim())
{
case "Bit":
foreach (var item in (System.Collections.BitArray)this.myPlc.Read(dataType, db, startByteAdr, VarType.Bit, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "Byte":
foreach (var item in (byte[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Byte, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "Word":
foreach (var item in (ushort[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Word, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "DWord":
foreach (var item in (uint[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DWord, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "Int":
foreach (var item in (short[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Int, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "DInt":
foreach (var item in (int[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DInt, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "Real":
foreach (var item in (float[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Real, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "LReal":
foreach (var item in (double[])this.myPlc.Read(dataType, db, startByteAdr, VarType.LReal, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "String":
foreach (var item in (string)this.myPlc.Read(dataType, db, startByteAdr, VarType.String, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "S7String":
foreach (var item in (string[])this.myPlc.Read(dataType, db, startByteAdr, VarType.S7String, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "S7WString":
foreach (var item in (string[])this.myPlc.Read(dataType, db, startByteAdr, VarType.S7WString, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "DateTime":
foreach (var item in (DateTime[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DateTime, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
case "DateTimeLong":
foreach (var item in (DateTime[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DateTimeLong, varCount, bitAdr))
{
this.rtxtReadResult.Text += item.ToString() + " ";
}
break;
}
讀取BIT數(shù)組時(shí)我這里使用【System.Collections.BitArray】強(qiáng)制轉(zhuǎn)換
讀取字節(jié)數(shù)組
public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count);文章來源:http://www.zghlxwxcb.cn/news/detail-635689.html
var bytes = this.myPlc.PlcObject.ReadBytes(DataType.DataBlock, 1, 0, 120);
string str = string.Empty;
str = "DB1.DBX0.0:\t" + Convert.ToBoolean(bytes[0].SelectBit(0)).ToString() + "\n";
str += "DB1.DBX0.1:\t" + Convert.ToBoolean(bytes[0].SelectBit(1)).ToString() + "\n";
str += "DB1.DBX0.2:\t" + Convert.ToBoolean(bytes[0].SelectBit(2)).ToString() + "\n";
str += "DB1.DBB1.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(1).Take(1).ToArray()), 16) + "\n";
str += "DB1.DBB2.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(2).Take(1).ToArray()), 16) + "\n";
str += "DB1.DBB3.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(3).Take(1).ToArray()), 16) + "\n";
str += "DB1.DBW4.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(4).Take(2).ToArray())) + "\n";
str += "DB1.DBW6.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(6).Take(2).ToArray())) + "\n";
str += "DB1.DBW8.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(8).Take(2).ToArray())) + "\n";
str += "DB1.DBW10.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(10).Take(2).ToArray())) + "\n";
str += "DB1.DBW12.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(12).Take(2).ToArray())) + "\n";
str += "DB1.DBW14.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(14).Take(2).ToArray())) + "\n";
str += "DB1.DBW16.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(16).Take(2).ToArray()), 16) + "\n";
str += "DB1.DBW18.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(18).Take(2).ToArray()), 16) + "\n";
str += "DB1.DBW20.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(20).Take(2).ToArray()), 16) + "\n";
str += "DB1.DBD22.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(22).Take(4).ToArray()), 16) + "\n";
str += "DB1.DBD26.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(26).Take(4).ToArray()), 16) + "\n";
str += "DB1.DBD30.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(30).Take(4).ToArray()), 16) + "\n";
str += "DB1.DBD34.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(34).Take(4).ToArray())) + "\n";
str += "DB1.DBD38.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(38).Take(4).ToArray())) + "\n";
str += "DB1.DBD42.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(42).Take(4).ToArray())) + "\n";
str += "DB1.DBD46.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(46).Take(4).ToArray())) + "\n";
str += "DB1.DBD50.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(50).Take(4).ToArray())) + "\n";
str += "DB1.DBD54.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(54).Take(4).ToArray())) + "\n";
str += "DB1.DBD58.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(58).Take(4).ToArray())) + "\n";
str += "DB1.DBD62.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(62).Take(4).ToArray())) + "\n";
str += "DB1.DBD66.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(66).Take(4).ToArray())) + "\n";
str += "DB1.DBD70.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(70).Take(8).ToArray())) + "\n";
str += "DB1.DBD78.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(78).Take(8).ToArray())) + "\n";
str += "DB1.DBD86.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(86).Take(8).ToArray())) + "\n";
str += "LocalTime:\t" + Convert.ToDateTime(S7.Net.Types.DateTimeLong.FromByteArray(bytes.Skip(96).Take(12).ToArray())) + "\n";
str += "SYSTime: \t\t" + Convert.ToDateTime(S7.Net.Types.DateTimeLong.FromByteArray(bytes.Skip(108).Take(12).ToArray())) + "\n";
str += "----------***********************-----------------\n";
我這里是讀取DB1數(shù)據(jù)塊的前120個(gè)字節(jié)的數(shù)據(jù),我這里使用了Skip()和Take()函數(shù),要使用這兩個(gè)函數(shù)需要添加
using System.Linq;文章來源地址http://www.zghlxwxcb.cn/news/detail-635689.html
修改單個(gè)數(shù)據(jù)
if (this.tabControlWrite.SelectedTab == this.tabControlWrite.TabPages[0]) //寫入單個(gè)數(shù)據(jù)
{
try
{
switch (this.cboWriteVarType.Text.Trim())
{
case "Bit":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToBoolean(this.rtxtWriteData.Text.Trim()));
break;
case "Byte":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToByte(this.rtxtWriteData.Text.Trim()));
break;
case "Word":
case "Int":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToInt16(this.rtxtWriteData.Text.Trim()));
break;
case "DWord":
case "DInt":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToInt32(this.rtxtWriteData.Text.Trim()));
break;
case "Real":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToSingle(this.rtxtWriteData.Text.Trim()));
break;
case "LReal":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToDouble(this.rtxtWriteData.Text.Trim()));
break;
case "String":
case "S7String":
case "S7WString":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), this.rtxtWriteData.Text.Trim());
break;
case "Timer":
break;
case "Counter":
break;
case "DateTime":
case "DateTimeLong":
this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToDateTime(this.rtxtWriteData.Text.Trim()));
break;
}
}
catch (Exception ex)
{
MessageBox.Show("寫入單個(gè)數(shù)據(jù)出現(xiàn)錯(cuò)誤!" + ex.Message, "提示信息");
}
到了這里,關(guān)于C#上位機(jī)與西門子PLC數(shù)據(jù)交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!