C#和西门子CPU进行S7通讯
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using S7.Net;
namespace S7_Test
{
public partial class Form1 : Form
{
public Plc s7_plc;
byte[] data = new byte[2];
public Form1()
{
InitializeComponent();
}
private void btn_Connect_Click(object sender, EventArgs e)
{
s7_plc = new Plc(CpuType.S71500, txt_PLC_IP.Text, 0, 1);
//开辟一个后台线程
Task task = Task.Run(() =>
{
Communicaton();
});
}
private void Communicaton()
{
listBox1.Invoke(new Action(() =>
listBox1.Items.Add("正在连接到PLC……")
));
s7_plc.Open();
bool temp1 = true;
while (true)
{
try
{
if (s7_plc.IsConnected & temp1)
{
temp1 = false;
listBox1.Invoke(new Action(() =>
listBox1.Items.Add("PLC连接成功!")
));
}
else
{
if (!s7_plc.IsConnected)
{
temp1 = true;
listBox1.Invoke(new Action(() =>
listBox1.Items.Add("PLC连接中断!")
));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
Thread.Sleep(1000);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btn_Read_Click(object sender, EventArgs e)
{
if (s7_plc.IsConnected == false)
{
MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);//检查PLC是否连接;
}
else
{
try
{
string[] arr = (txt_read_addr.Text.ToUpper()).Split('.');//将txt_read_addr文本框中的数据转为大写字母,并用“.”拆分后存放到arr数组中
string valuetype = arr[1].Substring(0, 3);//取数组中的第二个元素的前三位,用以确认读取的PLC数据类型
//西门子PLC数据类型:DBX(位,bool)DBB(字节,byte)DBW(字,word)DBD(双字,dword)
//以下是按不同的数据类型,对PLC数据进行读取
if (valuetype == "DBX")
{
bool test1 = (bool)s7_plc.Read(txt_read_addr.Text.ToUpper());
ShowMsg(txt_read_addr.Text ":" test1.ToString());
}
else if (valuetype == "DBB")
{
//short test2 = ((ushort)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToShort();
byte test2 = Convert.ToByte(s7_plc.Read(txt_read_addr.Text.ToUpper()));
ShowMsg(txt_read_addr.Text ":" test2.ToString());
}
else if (valuetype == "DBW")
{
short test3 = ((ushort)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToShort();
ShowMsg(txt_read_addr.Text ":" test3.ToString());
}
else if (valuetype == "DBD")
{
//double test5 = ((uint)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToFloat();
double test5 = ((uint)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToFloat();
ShowMsg(txt_read_addr.Text ":" test5.ToString());
}
else
{
MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
}
//listBox1.Items.Add("读取结果B0:" data[0].ToString());
//listBox1.Items.Add("读取结果B1:" data[1].ToString());
}
catch (Exception ex)
{
MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
}
}
}
private void btn_Write_Click(object sender, EventArgs e)
{
if (s7_plc.IsConnected == false)
{
MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);
}
else
{
try
{
string[] arr = (txt_write_addr.Text.ToUpper()).Split('.');
string valuetype = arr[1].Substring(0, 3);
if (valuetype == "DBX")
{
s7_plc.Write(txt_write_addr.Text.ToUpper(), Convert.ToBoolean(txt_value.Text));
}
else if (valuetype == "DBB")
{
var value = byte.Parse(txt_value.Text);
s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
}
else if (valuetype == "DBW")
{
var value = short.Parse(txt_value.Text);
s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
}
else if (valuetype == "DBD")
{
//double value = double.Parse(txt_value.Text);
Double value = Double.Parse(txt_value.Text);
s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
}
else
{
MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
}
}
catch (Exception Ex)
{
MessageBox.Show("请检查输入的“地址”或“值”是否错误!", "输入提示", MessageBoxButtons.OK);
}
}
}
private void btn_Disconnect_Click(object sender, EventArgs e)
{
s7_plc.Close();
}
private void ShowMsg(string v)
{
//txt_result.AppendText(v "\r\n");//将读取的PLC数据追加到“结果”文本框中
listBox1.Items.Add("读取结果:" v);
}
private void btn_clear_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void Mouse_down(object sender, EventArgs e)
{
}
}
}
评论