C#利用S7netplus讀寫西門子PLC數據
源碼下載:
公衆號廻複關鍵字:“s7 ”即可獲得下載方式。
先在NuGet上搜索S7netplus,竝安裝,如下圖所示
搜索s7.net進行安裝。
選擇VisualStudio2022編程環境。
對s7.net進行引用
連接PLC:
讀取PLC數據:
運用myPLC.Read()方法讀取PLC數據
運用 myPLC.Write()方法寫入plc數據
源碼分享:
usingS7.Net;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.Diagnostics;
usingSystem.Diagnostics.Eventing.Reader;
usingSystem.Net;
namespace西門子S7通訊讀取PLC數據
{
publicpartialclassForm1:Form
{
public Plc myPLC;
publicboolLJzhuangtia;
public S7.Net.DataType dataType;
publicintsint1,sint2;
publicForm1()
{
InitializeComponent();
IPtextBox.Text = '192.168.0.1';
JTtextBox.Text = '0';
CCtextBox.Text = '1';
}
#region
classAutoSizeFormClass
{
publicstructcontrolRect
{
publicintLeft;
publicintTop;
publicintWidth;
publicintHeight;
}
public List<controlRect> oldCtrl = newList<controlRect>();
int ctrlNo = 0;
//重要方法一:記錄窗躰和其控件的初始位置和大小controllInitializeSize()
publicvoidcontrollInitializeSize(Control mForm)
{
controlRect cR;
cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
oldCtrl.Add(cR);
AddControl(mForm);
}
privatevoidAddControl(Control ctl)
{
foreach (Control c in ctl.Controls)
{
controlRect objCtrl;
objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
oldCtrl.Add(objCtrl);
if (c.Controls.Count > 0)
AddControl(c);
}
}
//重要方法二:控件自適應大小方法controlAutoSize()
publicvoidcontrolAutoSize(Control mForm)
{
if (ctrlNo == 0)
{
controlRect cR;
cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
oldCtrl.Add(cR);
AddControl(mForm);
}
float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;
float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;
ctrlNo = 1;
AutoScaleControl(mForm, wScale, hScale);
}
privatevoidAutoScaleControl(Control ctl, floatwScale,floathScale)
{
int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
foreach (Control c in ctl.Controls)
{
ctrLeft0 = oldCtrl[ctrlNo].Left;
ctrTop0 = oldCtrl[ctrlNo].Top;
ctrWidth0 = oldCtrl[ctrlNo].Width;
ctrHeight0 = oldCtrl[ctrlNo].Height;
c.Left = (int)((ctrLeft0) * wScale);
c.Top = (int)((ctrTop0) * hScale);//
c.Width = (int)(ctrWidth0 * wScale);
c.Height = (int)(ctrHeight0 * hScale);//
ctrlNo ;
if (c.Controls.Count > 0)
AutoScaleControl(c, wScale, hScale);
if (ctl is DataGridView)
{
DataGridView dgv = ctl as DataGridView;
Cursor.Current = Cursors.WaitCursor;
int widths = 0;
for(int i = 0; i < dgv.Columns.Count; i )
{
dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells); // 自動調整列寬
widths = dgv.Columns[i].Width; // 計算調整列後單元列的寬度和
}
if (widths >= ctl.Size.Width) // 如果調整列的寬度大於設定列寬
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 調整列的模式 自動
else
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 如果小於 則填充
Cursor.Current = Cursors.Default;
}
}
}
}
//第二步,實例化上麪定義的類
AutoSizeFormClass asc = newAutoSizeFormClass();
//第三步,初始化窗口時記錄控件的大小和位置
privatevoidForm1_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
}
//第四步,主窗口大小發生變化觸發的事件
privatevoidForm1_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
#endregion
privatevoidbutton1_Click(object sender, EventArgs e)
{
if (CPUcomboBox.Text != '')
{
CpuType cpu = (CpuType)Enum.Parse(typeof(CpuType), CPUcomboBox.Text, true);
myPLC = new Plc(cpu, IPtextBox.Text, Convert.ToInt16(JTtextBox.Text), Convert.ToInt16(CCtextBox.Text));
if (LJzhuangtia != true)
{
if (CPUcomboBox.Text != ''||
IPtextBox.Text != ''||
JTtextBox.Text != ''||
CCtextBox.Text != '')
{
NewMethod();
}
else
{
MessageBox.Show('請填寫真確的連接蓡數!','提示');
}
}
else
{
MessageBox.Show('請勿重複連接','提示');
}
}
else
{
MessageBox.Show('請先選擇PLC!');
}
}
privatevoidNewMethod()
{
try
{
myPLC.Open();
LJzhuangtia = true;
MessageBox.Show('連接成功','提示');
LJBTN.BackColor = Color.Green;
DKBTN.BackColor = Color.FromArgb(224,224,224);
}
catch(Exception)
{
MessageBox.Show('連接異常,\r\n 請檢查線路! ','提示');
return;
throw;
}
}
privatevoidDKBTN_Click(object sender, EventArgs e)
{
if (LJzhuangtia == true)
{
try
{
DialogResult dr = MessageBox.Show('確認斷開PLC嗎?','提示', MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.Yes)
{
LJzhuangtia = false;
timer1.Enabled = false;
timer2.Enabled = false;
myPLC.Close();
LJBTN.BackColor = Color.FromArgb(224,224,224);
}
}
catch(Exception)
{
return;
throw;
}
}
else
{
MessageBox.Show('儅前沒有連接');
}
}
privatevoidbutton3_Click(object sender, EventArgs e)
{
duqu();
}
privatevoidduqu()
{
if (LJzhuangtia != false)
{
try
{
switch(SHUjucomboBox.Text)
{
case'BOOL':
bool num1 = Convert.ToBoolean(myPLC.Read('DB'DBtextBox.Text'.''DBX'addresstextBox.Text));
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBX'addresstextBox.Text':'num1.ToString()'\r\n';
break;
case'BYTE':
var num2 = Convert.ToByte(myPLC.Read('DB'DBtextBox.Text'.''DBB'addresstextBox.Text));
int num2_1 = (byte)num2;
if (num2_1 > 127)
{
num2_1 = num2_1 - 256;
}
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBB'addresstextBox.Text':'num2_1.ToString()'\r\n';
break;
case'READ':
float num3 = ((uint)myPLC.Read('DB'DBtextBox.Text'.''DBD'addresstextBox.Text)).ConvertToFloat();
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBD'addresstextBox.Text':'num3.ToString()'\r\n';
break;
case'INT':
int num4 = (ushort)myPLC.Read('DB'DBtextBox.Text'.''DBW'addresstextBox.Text);
if (num4 > 32767)
{
num4 = num4 - 65536;
}
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBW'addresstextBox.Text':'num4.ToString()'\r\n';
break;
case'DNIT':
var num5 = (uint)(myPLC.Read('DB'DBtextBox.Text'.''DBD'addresstextBox.Text));
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBD'addresstextBox.Text':'num5.ToString()'\r\n';
break;
case'WORD':
var num6 = (ushort)myPLC.Read('DB'DBtextBox.Text'.''DBW'addresstextBox.Text);
if (num6 > 32767)
{
num6 = (ushort)(num6 - 65536);
}
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBW'addresstextBox.Text':'num6.ToString()'\r\n';
break;
case'DWORD':
var num7 = (uint)myPLC.Read('DB'DBtextBox.Text'.''DBD'addresstextBox.Text);
readshuj.Text = '【'DateTime.Now'】''DB'DBtextBox.Text'.''DBD'addresstextBox.Text':'num7.ToString()'\r\n';
break;
case'STRING':
//S7String讀取
byte[] bytes = myPLC.ReadBytes(dataType, 1,18,40);
break;
case'PLCNUMBER':
PLCdu();
break;
}
}
catch(Exception)
{
return;
}
}
else
{
MessageBox.Show('請先連接PLC','提示');
}
}
privatevoidPLCdu()
{
if (sint1 == 1)
{
bool num9 = Convert.ToBoolean(myPLC.Read(PLCcomboBox.Text addresstextBox.Text));
readshuj.Text = '【'DateTime.Now'】' PLCcomboBox.Text addresstextBox.Text ':'num9.ToString()'\r\n';
}
if (sint1 == 2)
{
var num10 = Convert.ToByte(myPLC.Read(PLCcomboBox.Text addresstextBox.Text));
int num10_1 = (byte)num10;
if (num10_1 > 127)
{
num10_1 = num10_1 - 256;
}
readshuj.Text = '【'DateTime.Now'】' PLCcomboBox.Text addresstextBox.Text ':'num10_1.ToString()'\r\n';
}
if (sint1 == 3)
{
var num11 = (ushort)myPLC.Read(PLCcomboBox.Text addresstextBox.Text);
if (num11 > 32767)
{
num11 = (ushort)(num11 - 65536);
}
readshuj.Text = '【'DateTime.Now'】' PLCcomboBox.Text addresstextBox.Text ':'num11.ToString()'\r\n';
}
}
privatevoidPLCcomboBox_SelectedIndexChanged(object sender, EventArgs e)
{
switch(PLCcomboBox.Text)
{
case'I':
sint1 = 1;
break;
case'Q':
sint1 = 1;
break;
case'M':
sint1 = 1;
break;
case'IB':
sint1 = 2;
break;
case'QB':
sint1 = 2;
break;
case'MB':
sint1 = 2;
break;
case'IW':
sint1 = 3;
break;
case'QW':
sint1 = 3;
break;
case'MW':
sint1 = 3;
break;
}
}
bool a = false;
privatevoidbutton4_Click(object sender, EventArgs e)
{
try
{
if (a != true&&LJzhuangtia==true)
{
timer1.Enabled = true;
button4.Text = '讀取中…';
a = true;
}
else
{
timer1.Enabled = false;
a = false;
button4.Text = '連續讀取';
}
}
catch(Exception)
{
throw;
}
}
privatevoidtimer1_Tick(object sender, EventArgs e)
{
duqu();
}
privatevoidreadshuj_TextChanged(object sender, EventArgs e)
{
readshuj.SelectionStart = readshuj.Text.Length;
readshuj.ScrollToCaret();
}
privatevoidbutton5_Click(object sender, EventArgs e)
{
readshuj.Text = string.Empty;
}
privatevoidSHUjucomboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (SHUjucomboBox.Text == 'PLCNUMBER')
{
PLCcomboBox.Visible = true;
NUMBERlabe6.Text = '數據類型:';
}
else
{
PLCcomboBox.Visible = false;
NUMBERlabe6.Text = 'DB號:';
}
}
privatevoidbutton6_Click(object sender, EventArgs e)
{
xieru();
}
privatevoidxieru()
{
if (LJzhuangtia != false)
{
try
{
switch(WirtcomboBox.Text)
{
case'BOOL':
myPLC.Write('DB'WDBtextBox.Text'.DBX' WADDtextBox.Text, Convert.ToBoolean( BoolcomboBox.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBX'WADDtextBox.Text'寫入:'BoolcomboBox.Text'\r\n';
break;
case'BYTE':
myPLC.Write('DB'WDBtextBox.Text'.DBB' WADDtextBox.Text, Convert.ToByte(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBB'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'READ':
//float numuint = (Convert.ToUInt32( wirtnumber.Text)).ConvertToFloat();
float numfloat = (float)Convert.ToDouble(wirtnumber.Text);
myPLC.Write('DB'WDBtextBox.Text'.DBD' WADDtextBox.Text, numfloat);
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBD'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'INT':
myPLC.Write('DB'WDBtextBox.Text'.DBW' WADDtextBox.Text, Convert.ToInt16(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBW'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'DNIT':
myPLC.Write('DB'WDBtextBox.Text'.DBD' WADDtextBox.Text, Convert.ToInt32(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBD'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'WORD':
myPLC.Write('DB'WDBtextBox.Text'.DBW' WADDtextBox.Text, Convert.ToInt16(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBW'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'DWORD':
myPLC.Write('DB'WDBtextBox.Text'.DBD' WADDtextBox.Text, Convert.ToInt32(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】''DB'WDBtextBox.Text'.DBD'WADDtextBox.Text'寫入:'wirtnumber.Text'\r\n';
break;
case'STRING':
//S7String讀取
break;
case'PLCNUMBER':
PLCwirt();
break;
}
}
catch(Exception)
{
return;
}
}
else
{
MessageBox.Show('請先連接PLC','提示');
}
}
privatevoidPLCwirt()
{
if (sint2 == 1)
{
myPLC.Write(PLCwitbox.Text WADDtextBox.Text, Convert.ToBoolean(BoolcomboBox.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】' PLCwitbox.Text WADDtextBox.Text '寫入:'BoolcomboBox.Text'\r\n';
}
if(sint2==2)
{
myPLC.Write(PLCwitbox.Text WADDtextBox.Text, Convert.ToByte(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】' PLCwitbox.Text WADDtextBox.Text '寫入:'wirtnumber.Text'\r\n';
}
if (sint2 == 3)
{
myPLC.Write(PLCwitbox.Text WADDtextBox.Text, Convert.ToInt16(wirtnumber.Text));
WirtrichTextBo.Text = '【'DateTime.Now'】' PLCwitbox.Text WADDtextBox.Text '寫入:'wirtnumber.Text'\r\n';
}
}
privatevoidWDBtextBox_KeyPress(object sender, KeyPressEventArgs e)
{
}
privatevoidWirtcomboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(WirtcomboBox.Text=='BOOL')
{
BoolcomboBox.Visible = true;
wirtnumber.Visible=false;
}
else
{
BoolcomboBox.Visible = false;
wirtnumber.Visible = true;
}
if(WirtcomboBox.Text == 'PLCNUMBER')
{
PLCwitbox.Visible = true;
}
else
{
PLCwitbox.Visible = false;
}
}
privatevoidPLCwitbox_SelectedIndexChanged_1(object sender, EventArgs e)
{
switch(PLCwitbox.Text)
{
case'I':
sint2 = 1;
break;
case'Q':
sint2 = 1;
break;
case'M':
sint2 = 1;
break;
case'IB':
sint2 = 2;
break;
case'QB':
sint2 = 2;
break;
case'MB':
sint2 = 2;
break;
case'IW':
sint2 = 3;
break;
case'QW':
sint2 = 3;
break;
case'MW':
sint2 = 3;
break;
}
if(sint2==1)
{
BoolcomboBox.Visible = true;
wirtnumber.Visible = false;
}
else
{
BoolcomboBox.Visible = false;
wirtnumber.Visible = true;
}
}
privatevoidgroupBox5_Enter(object sender, EventArgs e)
{
}
boolb;
privatevoidbutton7_Click(object sender, EventArgs e)
{
if (b != true&LJzhuangtia==true)
{
timer2.Enabled = true;
button7.Text = '寫入中…';
b = true;
}
else
{
timer2.Enabled = false;
b = false;
button7.Text = '連續寫入';
}
}
privatevoidtimer2_Tick(object sender, EventArgs e)
{
xieru();
}
privatevoidbutton8_Click(object sender, EventArgs e)
{
WirtrichTextBo.Text = '';
}
privatevoidWirtrichTextBo_TextChanged(object sender, EventArgs e)
{
WirtrichTextBo.SelectionStart = WirtrichTextBo.Text.Length;
WirtrichTextBo.ScrollToCaret();
}
}
}
0條評論