mirror of
https://github.com/zhaopeiym/IoTClient
synced 2025-10-19 22:14:31 +08:00
SiemensClient 从发送命令到读取响应为最小单元
This commit is contained in:
parent
c817874462
commit
7e072b51ac
32
IoTClient.Tool/IndexForm.Designer.cs
generated
32
IoTClient.Tool/IndexForm.Designer.cs
generated
|
|
@ -31,6 +31,7 @@
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IndexForm));
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IndexForm));
|
||||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||||
this.ModBusTcp = new System.Windows.Forms.TabPage();
|
this.ModBusTcp = new System.Windows.Forms.TabPage();
|
||||||
|
this.modBusTcpControl1 = new IoTClient.Tool.ModBusTcpControl();
|
||||||
this.ModBusRtu = new System.Windows.Forms.TabPage();
|
this.ModBusRtu = new System.Windows.Forms.TabPage();
|
||||||
this.ModBusAscii = new System.Windows.Forms.TabPage();
|
this.ModBusAscii = new System.Windows.Forms.TabPage();
|
||||||
this.Siemens = new System.Windows.Forms.TabPage();
|
this.Siemens = new System.Windows.Forms.TabPage();
|
||||||
|
|
@ -46,9 +47,8 @@
|
||||||
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItemBlogPath = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItemBlogPath = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.商务合作ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.商务合作ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.modBusTcpControl1 = new IoTClient.Tool.ModBusTcpControl();
|
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.tabControl1.SuspendLayout();
|
this.tabControl1.SuspendLayout();
|
||||||
this.ModBusTcp.SuspendLayout();
|
this.ModBusTcp.SuspendLayout();
|
||||||
this.menuStrip1.SuspendLayout();
|
this.menuStrip1.SuspendLayout();
|
||||||
|
|
@ -85,6 +85,14 @@
|
||||||
this.ModBusTcp.Text = "ModBusTcp";
|
this.ModBusTcp.Text = "ModBusTcp";
|
||||||
this.ModBusTcp.UseVisualStyleBackColor = true;
|
this.ModBusTcp.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// modBusTcpControl1
|
||||||
|
//
|
||||||
|
this.modBusTcpControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.modBusTcpControl1.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.modBusTcpControl1.Name = "modBusTcpControl1";
|
||||||
|
this.modBusTcpControl1.Size = new System.Drawing.Size(880, 442);
|
||||||
|
this.modBusTcpControl1.TabIndex = 0;
|
||||||
|
//
|
||||||
// ModBusRtu
|
// ModBusRtu
|
||||||
//
|
//
|
||||||
this.ModBusRtu.Location = new System.Drawing.Point(4, 22);
|
this.ModBusRtu.Location = new System.Drawing.Point(4, 22);
|
||||||
|
|
@ -232,14 +240,6 @@
|
||||||
this.toolStripMenuItem4.Text = "交流群";
|
this.toolStripMenuItem4.Text = "交流群";
|
||||||
this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click);
|
this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem1
|
|
||||||
//
|
|
||||||
this.toolStripMenuItem1.ForeColor = System.Drawing.Color.White;
|
|
||||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
|
||||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(75, 21);
|
|
||||||
this.toolStripMenuItem1.Text = "版本 0.3.5";
|
|
||||||
this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
|
|
||||||
//
|
|
||||||
// 商务合作ToolStripMenuItem
|
// 商务合作ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.商务合作ToolStripMenuItem.ForeColor = System.Drawing.Color.White;
|
this.商务合作ToolStripMenuItem.ForeColor = System.Drawing.Color.White;
|
||||||
|
|
@ -248,13 +248,13 @@
|
||||||
this.商务合作ToolStripMenuItem.Text = "商务合作";
|
this.商务合作ToolStripMenuItem.Text = "商务合作";
|
||||||
this.商务合作ToolStripMenuItem.Click += new System.EventHandler(this.cooperationToolStripMenuItem_Click);
|
this.商务合作ToolStripMenuItem.Click += new System.EventHandler(this.cooperationToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// modBusTcpControl1
|
// toolStripMenuItem1
|
||||||
//
|
//
|
||||||
this.modBusTcpControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.toolStripMenuItem1.ForeColor = System.Drawing.Color.White;
|
||||||
this.modBusTcpControl1.Location = new System.Drawing.Point(3, 3);
|
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||||
this.modBusTcpControl1.Name = "modBusTcpControl1";
|
this.toolStripMenuItem1.Size = new System.Drawing.Size(75, 21);
|
||||||
this.modBusTcpControl1.Size = new System.Drawing.Size(880, 442);
|
this.toolStripMenuItem1.Text = "版本 0.3.6";
|
||||||
this.modBusTcpControl1.TabIndex = 0;
|
this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
|
||||||
//
|
//
|
||||||
// IndexForm
|
// IndexForm
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前版本
|
/// 当前版本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float CurrentVersion { get; set; } = 0.35f;
|
public float CurrentVersion { get; set; } = 0.36f;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 忽略版本
|
/// 忽略版本
|
||||||
|
|
|
||||||
|
|
@ -99,10 +99,14 @@ namespace IoTClient.Clients.PLC
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public byte[] SendPackage(byte[] command)
|
public byte[] SendPackage(byte[] command)
|
||||||
{
|
{
|
||||||
socket.Send(command);
|
//从发送命令到读取响应为最小单元,避免多线程执行串数据(可线程安全执行)
|
||||||
var headPackage = SocketRead(socket, SiemensConstant.InitHeadLength);
|
lock (this)
|
||||||
var dataPackage = SocketRead(socket, GetContentLength(headPackage));
|
{
|
||||||
return headPackage.Concat(dataPackage).ToArray();
|
socket.Send(command);
|
||||||
|
var headPackage = SocketRead(socket, SiemensConstant.InitHeadLength);
|
||||||
|
var dataPackage = SocketRead(socket, GetContentLength(headPackage));
|
||||||
|
return headPackage.Concat(dataPackage).ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -121,7 +125,7 @@ namespace IoTClient.Clients.PLC
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//兼容地址,如VD5012中的D
|
//兼容地址,如VD5012中的D
|
||||||
if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
//if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
||||||
//发送读取信息
|
//发送读取信息
|
||||||
var arg = ConvertArg(address);
|
var arg = ConvertArg(address);
|
||||||
byte[] command;
|
byte[] command;
|
||||||
|
|
@ -153,6 +157,14 @@ namespace IoTClient.Clients.PLC
|
||||||
socket?.Shutdown(SocketShutdown.Both);
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
socket?.Close();
|
socket?.Close();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSucceed = false;
|
||||||
|
result.Err = ex.Message;
|
||||||
|
result.ErrList.Add(ex.Message);
|
||||||
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
|
socket?.Close();
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (isAutoOpen) Dispose();
|
if (isAutoOpen) Dispose();
|
||||||
|
|
@ -173,7 +185,7 @@ namespace IoTClient.Clients.PLC
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//兼容地址,如VD5012中的D
|
//兼容地址,如VD5012中的D
|
||||||
if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
//if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
||||||
//发送读取信息
|
//发送读取信息
|
||||||
var arg = ConvertArg(address);
|
var arg = ConvertArg(address);
|
||||||
byte[] command = GetReadCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, length);
|
byte[] command = GetReadCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, length);
|
||||||
|
|
@ -201,6 +213,14 @@ namespace IoTClient.Clients.PLC
|
||||||
socket?.Shutdown(SocketShutdown.Both);
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
socket?.Close();
|
socket?.Close();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSucceed = false;
|
||||||
|
result.Err = ex.Message;
|
||||||
|
result.ErrList.Add(ex.Message);
|
||||||
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
|
socket?.Close();
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (isAutoOpen) Dispose();
|
if (isAutoOpen) Dispose();
|
||||||
|
|
@ -782,7 +802,7 @@ namespace IoTClient.Clients.PLC
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//兼容地址,如VD5012中的D
|
//兼容地址,如VD5012中的D
|
||||||
if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
//if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
||||||
//发送写入信息
|
//发送写入信息
|
||||||
var arg = ConvertArg(address);
|
var arg = ConvertArg(address);
|
||||||
byte[] command = GetWriteByteCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, value);
|
byte[] command = GetWriteByteCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, value);
|
||||||
|
|
@ -806,6 +826,14 @@ namespace IoTClient.Clients.PLC
|
||||||
socket?.Shutdown(SocketShutdown.Both);
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
socket?.Close();
|
socket?.Close();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSucceed = false;
|
||||||
|
result.Err = ex.Message;
|
||||||
|
result.ErrList.Add(ex.Message);
|
||||||
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
|
socket?.Close();
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (isAutoOpen) Dispose();
|
if (isAutoOpen) Dispose();
|
||||||
|
|
@ -827,7 +855,7 @@ namespace IoTClient.Clients.PLC
|
||||||
{
|
{
|
||||||
Array.Reverse(data);
|
Array.Reverse(data);
|
||||||
//兼容地址,如VD5012中的D
|
//兼容地址,如VD5012中的D
|
||||||
if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
//if (address.Length >= 2 && !"0123456789".Contains(address[1].ToString())) address = address.Remove(1, 1);
|
||||||
//发送写入信息
|
//发送写入信息
|
||||||
var arg = ConvertArg(address);
|
var arg = ConvertArg(address);
|
||||||
byte[] command = GetWriteCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, data);
|
byte[] command = GetWriteCommand(arg.TypeCode, arg.BeginAddress, arg.DbBlock, data);
|
||||||
|
|
@ -851,6 +879,14 @@ namespace IoTClient.Clients.PLC
|
||||||
socket?.Shutdown(SocketShutdown.Both);
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
socket?.Close();
|
socket?.Close();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSucceed = false;
|
||||||
|
result.Err = ex.Message;
|
||||||
|
result.ErrList.Add(ex.Message);
|
||||||
|
socket?.Shutdown(SocketShutdown.Both);
|
||||||
|
socket?.Close();
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (isAutoOpen) Dispose();
|
if (isAutoOpen) Dispose();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -8,7 +9,7 @@ namespace IoTServer.Common
|
||||||
public class DataPersist
|
public class DataPersist
|
||||||
{
|
{
|
||||||
string prefix;
|
string prefix;
|
||||||
static Dictionary<string, string> data = new Dictionary<string, string>();
|
static ConcurrentDictionary<string, string> data = new ConcurrentDictionary<string, string>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
|
|
@ -27,7 +28,7 @@ namespace IoTServer.Common
|
||||||
public string Read(string key)
|
public string Read(string key)
|
||||||
{
|
{
|
||||||
key = prefix + key;
|
key = prefix + key;
|
||||||
if (data.Keys.Contains(key))
|
if (data.ContainsKey(key))
|
||||||
{
|
{
|
||||||
return data[key];
|
return data[key];
|
||||||
}
|
}
|
||||||
|
|
@ -46,14 +47,14 @@ namespace IoTServer.Common
|
||||||
/// <param name="value"></param>
|
/// <param name="value"></param>
|
||||||
public void Write(string key, string value)
|
public void Write(string key, string value)
|
||||||
{
|
{
|
||||||
key = prefix + key;
|
key = prefix + key;
|
||||||
if (data.Keys.Contains(key))
|
if (data.ContainsKey(key))
|
||||||
{
|
{
|
||||||
data[key] = value;
|
data[key] = value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data.Add(key, value);
|
data.TryAdd(key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,7 +68,7 @@ namespace IoTServer.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void Clear()
|
public static void Clear()
|
||||||
{
|
{
|
||||||
data = new Dictionary<string, string>();
|
data = new ConcurrentDictionary<string, string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -104,7 +105,7 @@ namespace IoTServer.Common
|
||||||
File.SetAttributes(path, FileAttributes.Hidden);
|
File.SetAttributes(path, FileAttributes.Hidden);
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrWhiteSpace(dataString))
|
if (!string.IsNullOrWhiteSpace(dataString))
|
||||||
data = JsonConvert.DeserializeObject<Dictionary<string, string>>(dataString);
|
data = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(dataString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,8 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="IoTClient" Version="0.0.14" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\IoTClient\IoTClient.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ namespace IoTServer.Servers.PLC
|
||||||
socketServer.Bind(ipEndPoint);
|
socketServer.Bind(ipEndPoint);
|
||||||
|
|
||||||
//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10
|
//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10
|
||||||
socketServer.Listen(10);
|
socketServer.Listen(100);
|
||||||
|
|
||||||
Task.Run(() => { Accept(socketServer); });
|
Task.Run(() => { Accept(socketServer); });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
34
README.md
34
README.md
|
|
@ -50,6 +50,40 @@ ModBusRtuClient client = new ModBusRtuClient("COM3", 9600, 8, StopBits.One, Pari
|
||||||
//其他读写操作和ModBusTcpClient的读写操作一致
|
//其他读写操作和ModBusTcpClient的读写操作一致
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## SiemensClient读写操作
|
||||||
|
```
|
||||||
|
//1、实例化客户端 - 输入正确的IP和端口
|
||||||
|
SiemensClient client = new SiemensClient(SiemensVersion.S7_200Smart, "127.0.0.1",102);
|
||||||
|
|
||||||
|
//2、写操作
|
||||||
|
client.Write("Q1.3", true);
|
||||||
|
client.Write("V2205", (short)11);
|
||||||
|
client.Write("V2209", 33);
|
||||||
|
|
||||||
|
//3、读操作
|
||||||
|
var value1 = client.ReadBoolean("Q1.3").Value;
|
||||||
|
var value2 = client.ReadInt16("V2205").Value;
|
||||||
|
var value3 = client.ReadInt32("V2209").Value;
|
||||||
|
|
||||||
|
//4、如果没有主动Open,则会每次读写操作的时候自动打开自动和关闭连接,这样会使读写效率大大减低。所以建议手动Open和Close。
|
||||||
|
client.Open();
|
||||||
|
|
||||||
|
//5、读写操作都会返回操作结果对象Result
|
||||||
|
var result = client.ReadInt16("V2205");
|
||||||
|
//5.1 读取是否成功(true或false)
|
||||||
|
var isSucceed = result.IsSucceed;
|
||||||
|
//5.2 读取失败的异常信息
|
||||||
|
var errMsg = result.Err;
|
||||||
|
//5.3 读取操作实际发送的请求报文
|
||||||
|
var requst = result.Requst;
|
||||||
|
//5.4 读取操作服务端响应的报文
|
||||||
|
var response = result.Response;
|
||||||
|
//5.5 读取到的值
|
||||||
|
var value4 = result.Value;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 其他更多详细使用请[参考](https://github.com/zhaopeiym/IoTClient/tree/master/IoTClient.Tool/Controls)
|
||||||
|
|
||||||
# IoTClient Tool效果图
|
# IoTClient Tool效果图
|
||||||

|

|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user