S7 1200开放式通信 PLC做服务器端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TCPDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Socket tcpClient;
private CancellationTokenSource cts;
private byte[] setArray;
//Socket API 位于传输层和应用层
private void btn_Connect_Click(object sender, EventArgs e)
{
tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
tcpClient.Connect(IPAddress.Parse(this.txt_IP.Text), int.Parse(this.txt_Port.Text));
}
catch (Exception ex)
{
MessageBox.Show("连接失败:" + ex.Message);
return;
}
cts = new CancellationTokenSource();
Task.Run(new Action(() =>
{
ReceiveFromPLC();
}), cts.Token);
MessageBox.Show("连接成功");
}
private void ReceiveFromPLC()
{
while (!cts.IsCancellationRequested)
{
byte[] buffer = new byte[1024];
int length = -1;
try
{
length = tcpClient.Receive(buffer, SocketFlags.None);
}
catch (Exception)
{
//写入日志
break;
}
//数据解析
// 压力 DB100.DBD0
//状态 DB100.DBX4.0
//温度 DB100.DBW6
//start offset 数据类型
if (length == 100)
{
byte[] result = ByteArrayLib.GetByteArray(buffer, 0, 50);
setArray = ByteArrayLib.GetByteArray(buffer, 50, 50);
Invoke(new Action(() =>
{
foreach (Control item in this.Controls)
{
if (item is LabelShow ls)
{
//最好加一个判断 保证属性设置都是正确的
switch (ls.DataType)
{
case DataType.Bit:
ls.VarValue = BitLib.GetBitFromByteArray(result, ls.Start, ls.Offset).ToString();
break;
case DataType.Short:
ls.VarValue = ShortLib.GetShortFromByteArray(result, ls.Start).ToString();
break;
case DataType.UShort:
ls.VarValue = UShortLib.GetUShortFromByteArray(result, ls.Start).ToString();
break;
case DataType.Int:
ls.VarValue = IntLib.GetIntFromByteArray(result, ls.Start).ToString();
break;
case DataType.UInt:
ls.VarValue = UIntLib.GetUIntFromByteArray(result, ls.Start).ToString();
break;
case DataType.Float:
ls.VarValue = FloatLib.GetFloatFromByteArray(result, ls.Start).ToString();
break;
case DataType.Double:
ls.VarValue = DoubleLib.GetDoubleFromByteArray(result, ls.Start).ToString();
break;
default:
break;
}
}
}
}));
}
}
}
private void btn_Write_Click(object sender, EventArgs e)
{
float value = Convert.ToSingle(this.textBox1.Text);
byte[] res = ByteArrayLib.GetByteArrayFromFloat(value);
byte[] set = ByteArrayLib.ReplaceByteArray(setArray, 0, res);
tcpClient.Send(set, SocketFlags.None);
}
}
}





本文详细介绍了如何使用S7 1200系列PLC作为服务器端进行开放式通信。内容涵盖设置步骤、编程技巧以及可能遇到的问题解决方法,旨在帮助读者理解并实现PLC与外部设备间的高效数据交互。
8077

被折叠的 条评论
为什么被折叠?



