Files
CheryFianlAssemblyLineNew/PLCModule/PLCModule/FormDebugSiemensS7.cs
T
HM-CN\zhengxuan.zhang 8cf3fb42d6 #总装移交版本
2025-03-07 11:44:37 +08:00

668 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HslCommunication.Profinet;
using System.Threading;
using HslCommunication.Profinet.Siemens;
using HslCommunication;
namespace PLCModule
{
public partial class FormDebugSiemensS7 : Telerik.WinControls.UI.ShapedForm
{
public FormDebugSiemensS7(SiemensPLCS siemensPLCS)
{
InitializeComponent();
siemensTcpNet = new SiemensS7Net(siemensPLCS);
}
private SiemensS7Net siemensTcpNet = null;
private void FormSiemens_Load(object sender, EventArgs e)
{
panel2.Enabled = false;
rddlAddr3.SelectedIndex = 0;
userCurve1.SetLeftCurve("A", new float[0], Color.Tomato);
}
private void Language(int language)
{
if (language == 2)
{
Text = "Siemens Read PLC Demo";
label1.Text = "Ip:";
label3.Text = "Port:";
button1.Text = "Connect";
button2.Text = "Disconnect";
label21.Text = "Address:";
label6.Text = "address:";
label7.Text = "result:";
button_read_bool.Text = "Read Bit";
button_read_byte.Text = "r-byte";
button_read_short.Text = "r-short";
button_read_ushort.Text = "r-ushort";
button_read_int.Text = "r-int";
button_read_uint.Text = "r-uint";
button_read_long.Text = "r-long";
button_read_ulong.Text = "r-ulong";
button_read_float.Text = "r-float";
button_read_double.Text = "r-double";
button_read_string.Text = "r-string";
label8.Text = "length:";
label11.Text = "Address:";
label12.Text = "length:";
button25.Text = "Bulk Read";
label13.Text = "Results:";
label16.Text = "Message:";
label14.Text = "Results:";
button26.Text = "Read";
label10.Text = "Address:";
label9.Text = "Value:";
label19.Text = "Note: The value of the string needs to be converted";
button_Write_bool.Text = "Write Bit";
button_write_short.Text = "w-short";
button_write_ushort.Text = "w-ushort";
button_write_int.Text = "w-int";
button_write_uint.Text = "w-uint";
button_write_long.Text = "w-long";
button_write_ulong.Text = "w-ulong";
button_write_float.Text = "w-float";
button_write_double.Text = "w-double";
button_write_string.Text = "w-string";
groupBox1.Text = "Single Data Read test";
groupBox2.Text = "Single Data Write test";
groupBox3.Text = "Bulk Read test";
groupBox4.Text = "Message reading test, hex string needs to be filled in";
groupBox5.Text = "Timed reading, curve display";
label15.Text = "Address:";
label18.Text = "Interval";
button27.Text = "Start";
label17.Text = "This assumes that the type of data is determined for short:";
button_write_byte.Text = "w-byte";
}
}
private void FormSiemens_FormClosing(object sender, FormClosingEventArgs e)
{
isThreadRun = false;
}
/// <summary>
/// 统一的读取结果的数据解析,显示
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="result"></param>
/// <param name="address"></param>
/// <param name="textBox"></param>
private void readResultRender<T>(OperateResult<T> result, string address, Telerik.WinControls.UI.RadTextBox textBox)
{
if (result.IsSuccess)
{
textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") + $"[{address}] {result.Content}{Environment.NewLine}");
}
else
{
rleMessage.Text = (DateTime.Now.ToString("[HH:mm:ss] ") + $"[{address}] 读取失败{Environment.NewLine}原因:{result.ToMessageShowString()}");
}
}
/// <summary>
/// 统一的数据写入的结果显示
/// </summary>
/// <param name="result"></param>
/// <param name="address"></param>
private void writeResultRender(OperateResult result, string address)
{
if (result.IsSuccess)
{
rleMessage.Text = (DateTime.Now.ToString("[HH:mm:ss] ") + $"[{address}] 写入成功");
}
else
{
rleMessage.Text = (DateTime.Now.ToString("[HH:mm:ss] ") + $"[{address}] 写入失败{Environment.NewLine}原因:{result.ToMessageShowString()}");
}
}
#region Connect And Close
private void button1_Click(object sender, EventArgs e)
{
// 连接
System.Net.IPAddress address;
if (!System.Net.IPAddress.TryParse(textBox1.Text, out address))
{
rleMessage.Text = ("Ip地址输入不正确!");
return;
}
siemensTcpNet.IpAddress = textBox1.Text;
try
{
OperateResult connect = siemensTcpNet.ConnectServer();
if (connect.IsSuccess)
{
rleMessage.Text = ("连接成功!");
button2.Enabled = true;
button1.Enabled = false;
panel2.Enabled = true;
}
else
{
rleMessage.Text = ("连接失败!");
}
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
// 断开连接
siemensTcpNet.ConnectClose();
button2.Enabled = false;
button1.Enabled = true;
panel2.Enabled = false;
}
#endregion Connect And Close
#region
private void button_read_bool_Click(object sender, EventArgs e)
{
// 读取bool变量
readResultRender(siemensTcpNet.ReadBool(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_byte_Click(object sender, EventArgs e)
{
// 读取byte变量
readResultRender(siemensTcpNet.ReadByte(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_short_Click(object sender, EventArgs e)
{
// 读取short变量
readResultRender(siemensTcpNet.ReadInt16(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_ushort_Click(object sender, EventArgs e)
{
// 读取ushort变量
readResultRender(siemensTcpNet.ReadUInt16(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_int_Click(object sender, EventArgs e)
{
// 读取int变量
readResultRender(siemensTcpNet.ReadInt32(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_uint_Click(object sender, EventArgs e)
{
// 读取uint变量
readResultRender(siemensTcpNet.ReadUInt32(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_long_Click(object sender, EventArgs e)
{
// 读取long变量
readResultRender(siemensTcpNet.ReadInt64(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_ulong_Click(object sender, EventArgs e)
{
// 读取ulong变量
readResultRender(siemensTcpNet.ReadUInt64(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_float_Click(object sender, EventArgs e)
{
// 读取float变量
readResultRender(siemensTcpNet.ReadFloat(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_double_Click(object sender, EventArgs e)
{
// 读取double变量
readResultRender(siemensTcpNet.ReadDouble(textBox3.Text), textBox3.Text, textBox4);
}
private void button_read_string_Click(object sender, EventArgs e)
{
// 读取字符串
readResultRender(siemensTcpNet.ReadString(textBox3.Text, ushort.Parse(textBox5.Text)), textBox3.Text, textBox4);
}
#endregion
#region
private void button_Write_bool_Click(object sender, EventArgs e)
{
// bool写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, bool.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_byte_Click(object sender, EventArgs e)
{
// byte写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, byte.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_short_Click(object sender, EventArgs e)
{
// short写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, short.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_ushort_Click(object sender, EventArgs e)
{
// ushort写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, ushort.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_int_Click(object sender, EventArgs e)
{
// int写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, int.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_uint_Click(object sender, EventArgs e)
{
// uint写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, uint.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_long_Click(object sender, EventArgs e)
{
// long写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, long.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_ulong_Click(object sender, EventArgs e)
{
// ulong写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, ulong.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_float_Click(object sender, EventArgs e)
{
// float写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, float.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_double_Click(object sender, EventArgs e)
{
// double写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, double.Parse(textBox7.Text)), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
private void button_write_string_Click(object sender, EventArgs e)
{
// string写入
try
{
writeResultRender(siemensTcpNet.Write(textBox8.Text, textBox7.Text), textBox8.Text);
}
catch (Exception ex)
{
rleMessage.Text = (ex.Message);
}
}
#endregion
#region
private void button25_Click(object sender, EventArgs e)
{
try
{
OperateResult<byte[]> read = siemensTcpNet.Read(textBox6.Text, ushort.Parse(textBox9.Text));
if (read.IsSuccess)
{
textBox10.Text = "结果:" + HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content);
}
else
{
rleMessage.Text = ("读取失败:" + read.ToMessageShowString());
}
}
catch (Exception ex)
{
rleMessage.Text = ("读取失败:" + ex.Message);
}
}
private void button3_Click(object sender, EventArgs e)
{
// 订货号
OperateResult<string> read = siemensTcpNet.ReadOrderNumber();
if (read.IsSuccess)
{
textBox10.Text = "订货号:" + read.Content;
}
else
{
rleMessage.Text = ("读取失败:" + read.ToMessageShowString());
}
}
#endregion
#region
private void button26_Click(object sender, EventArgs e)
{
try
{
OperateResult<byte[]> read = siemensTcpNet.ReadFromCoreServer(HslCommunication.BasicFramework.SoftBasic.HexStringToBytes(textBox13.Text));
if (read.IsSuccess)
{
textBox11.Text = "结果:" + HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content);
}
else
{
rleMessage.Text = ("读取失败:" + read.ToMessageShowString());
}
}
catch (Exception ex)
{
rleMessage.Text = ("读取失败:" + ex.Message);
}
}
#endregion
#region
// 外加曲线显示
private Thread thread = null; // 后台读取的线程
private int timeSleep = 300; // 读取的间隔
private bool isThreadRun = false; // 用来标记线程的运行状态
private void button27_Click(object sender, EventArgs e)
{
// 启动后台线程,定时读取PLC中的数据,然后在曲线控件中显示
if (!isThreadRun)
{
if (!int.TryParse(textBox14.Text, out timeSleep))
{
rleMessage.Text = ("间隔时间格式输入错误!");
return;
}
button27.Text = "停止";
isThreadRun = true;
thread = new Thread(ThreadReadServer);
thread.IsBackground = true;
thread.Start();
}
else
{
button27.Text = "启动";
isThreadRun = false;
}
}
private void ThreadReadServer()
{
while (isThreadRun)
{
Thread.Sleep(timeSleep);
try
{
//OperateResult<short> read = siemensTcpNet.ReadInt16( textBox12.Text );
//OperateResult<short> read = siemensTcpNet.ReadByte(textBox12.Text);
//if (read.IsSuccess)
//{
// // 显示曲线
// if (isThreadRun) Invoke(new Action<short>(AddDataCurve), read.Content);
//}
OperateResult<byte> read = siemensTcpNet.ReadByte(textBox12.Text);
if (read.IsSuccess)
{
// 显示曲线
if (isThreadRun) Invoke(new Action<short>(AddDataCurve), read.Content);
}
}
catch (Exception ex)
{
rleMessage.Text = ("读取失败:" + ex.Message);
}
}
}
private void AddDataCurve(short data)
{
userCurve1.AddCurveData("A", data);
}
#endregion
#region
private void Test1()
{
OperateResult<bool> read = siemensTcpNet.ReadBool("M100.4");
if (read.IsSuccess)
{
bool m100_4 = read.Content;
}
else
{
// failed
string err = read.Message;
}
OperateResult write = siemensTcpNet.Write("M100.4", true);
if (write.IsSuccess)
{
// success
}
else
{
// failed
string err = write.Message;
}
}
private void Test2()
{
byte m100_byte = siemensTcpNet.ReadByte("M100").Content;
short m100_short = siemensTcpNet.ReadInt16("M100").Content;
ushort m100_ushort = siemensTcpNet.ReadUInt16("M100").Content;
int m100_int = siemensTcpNet.ReadInt32("M100").Content;
uint m100_uint = siemensTcpNet.ReadUInt32("M100").Content;
float m100_float = siemensTcpNet.ReadFloat("M100").Content;
double m100_double = siemensTcpNet.ReadDouble("M100").Content;
string m100_string = siemensTcpNet.ReadString("M100", 10).Content;
HslCommunication.Core.IByteTransform ByteTransform = new HslCommunication.Core.ReverseBytesTransform();
}
private void Test3()
{
// 读取操作,这里的M100可以替换成I100,Q100,DB20.100效果时一样的
bool M100_7 = siemensTcpNet.ReadBool("M100.7").Content; // 读取M100.7是否通断,注意M100.0等同于M100
byte byte_M100 = siemensTcpNet.ReadByte("M100").Content; // 读取M100的值
short short_M100 = siemensTcpNet.ReadInt16("M100").Content; // 读取M100-M101组成的字
ushort ushort_M100 = siemensTcpNet.ReadUInt16("M100").Content; // 读取M100-M101组成的无符号的值
int int_M100 = siemensTcpNet.ReadInt32("M100").Content; // 读取M100-M103组成的有符号的数据
uint uint_M100 = siemensTcpNet.ReadUInt32("M100").Content; // 读取M100-M103组成的无符号的值
float float_M100 = siemensTcpNet.ReadFloat("M100").Content; // 读取M100-M103组成的单精度值
long long_M100 = siemensTcpNet.ReadInt64("M100").Content; // 读取M100-M107组成的大数据值
ulong ulong_M100 = siemensTcpNet.ReadUInt64("M100").Content; // 读取M100-M107组成的无符号大数据
double double_M100 = siemensTcpNet.ReadDouble("M100").Content; // 读取M100-M107组成的双精度值
string str_M100 = siemensTcpNet.ReadString("M100", 10).Content;// 读取M100-M109组成的ASCII字符串数据
// 写入操作,这里的M100可以替换成I100,Q100,DB20.100效果时一样的
siemensTcpNet.Write("M100.7", true); // 写位,注意M100.0等同于M100
siemensTcpNet.Write("M100", (byte)0x33); // 写单个字节
siemensTcpNet.Write("M100", (short)12345); // 写双字节有符号
siemensTcpNet.Write("M100", (ushort)45678); // 写双字节无符号
siemensTcpNet.Write("M100", 123456789); // 写双字有符号
siemensTcpNet.Write("M100", (uint)3456789123); // 写双字无符号
siemensTcpNet.Write("M100", 123.456f); // 写单精度
siemensTcpNet.Write("M100", 1234556434534545L); // 写大整数有符号
siemensTcpNet.Write("M100", 523434234234343UL); // 写大整数无符号
siemensTcpNet.Write("M100", 123.456d); // 写双精度
siemensTcpNet.Write("M100", "K123456789");// 写ASCII字符串
OperateResult<byte[]> read = siemensTcpNet.Read("M100", 10);
{
if (read.IsSuccess)
{
byte m100 = read.Content[0];
byte m101 = read.Content[1];
byte m102 = read.Content[2];
byte m103 = read.Content[3];
byte m104 = read.Content[4];
byte m105 = read.Content[5];
byte m106 = read.Content[6];
byte m107 = read.Content[7];
byte m108 = read.Content[8];
byte m109 = read.Content[9];
}
else
{
// 发生了异常
}
}
}
#endregion
private void userCurve1_Load(object sender, EventArgs e)
{
}
private void btnMouseHover(object sender, EventArgs e)
{
this.BeginInvoke((EventHandler)delegate
{
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor = System.Drawing.Color.FromArgb(14, 72, 87);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor2 = System.Drawing.Color.FromArgb(14, 72, 87);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor3 = System.Drawing.Color.FromArgb(14, 72, 87);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor4 = System.Drawing.Color.FromArgb(14, 72, 87);
});
}
private void btnMouseLeave(object sender, EventArgs e)
{
this.BeginInvoke((EventHandler)delegate
{
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor = System.Drawing.Color.FromArgb(16, 116, 139);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor2 = System.Drawing.Color.FromArgb(16, 116, 139);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor3 = System.Drawing.Color.FromArgb(16, 116, 139);
((Telerik.WinControls.Primitives.FillPrimitive)(((Telerik.WinControls.UI.RadButton)sender).GetChildAt(0).GetChildAt(0))).BackColor4 = System.Drawing.Color.FromArgb(16, 116, 139);
});
}
private void rbtnWriteAddr3_Click(object sender, EventArgs e)
{
writeResultRender(siemensTcpNet.Write(rddlAddr3.Text, byte.Parse(rtbValue3.Text)), rddlAddr3.Text);
}
private void rbtnWriteAddr2_Click(object sender, EventArgs e)
{
writeResultRender(siemensTcpNet.Write(rtbAddr2.Text, byte.Parse(rtbValue2.Text)), rtbAddr2.Text);
}
private void rlabClear_Click(object sender, EventArgs e)
{
textBox4.Clear();
}
private void btnWriteAddr1Value_Click(object sender, EventArgs e)
{
writeResultRender(siemensTcpNet.Write(rtbAddr1.Text, byte.Parse(rtbValue1.Text)), rtbAddr1.Text);
}
}
}