1200开放式通信做客户端
// ***********************************************************************
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 Form2 : Form
{
public Form2()
{
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, 100);
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;
}
}
if (item is TextSet2 ts)
{
//最好加一个判断 保证属性设置都是正确的
switch (ts.DataType)
{
case DataType.Bit:
ts.VarValue = BitLib.GetBitFromByteArray(result, ts.Start, ts.Offset).ToString();
break;
case DataType.Short:
ts.VarValue = ShortLib.GetShortFromByteArray(result, ts.Start).ToString();
break;
case DataType.UShort:
ts.VarValue = UShortLib.GetUShortFromByteArray(result, ts.Start).ToString();
break;
case DataType.Int:
ts.VarValue = IntLib.GetIntFromByteArray(result, ts.Start).ToString();
break;
case DataType.UInt:
ts.VarValue = UIntLib.GetUIntFromByteArray(result, ts.Start).ToString();
break;
case DataType.Float:
ts.VarValue = FloatLib.GetFloatFromByteArray(result, ts.Start).ToString();
break;
case DataType.Double:
ts.VarValue = DoubleLib.GetDoubleFromByteArray(result, ts.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);
}
private void textSet21_TextSetEvent(object sender, EventArgs e)
{
if (sender is TextSet2 ts)
{
// new FrmSet(this.tcpClient, this.setArray,ts.VarTitle,ts.VarValue,ts.Start).ShowDialog();
DialogResult dr = new FrmSet(this.tcpClient, this.setArray, ts.VarTitle, ts.VarValue, ts.Start).ShowDialog();
if (dr == DialogResult.OK)
{
string set = string.Empty;
}
}
}
}
}