实例介绍
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)
{
}
}
}
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)
{
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论