1
0
mirror of https://github.com/zhaopeiym/IoTClient synced 2025-10-12 21:20:37 +08:00

fixModbus fix

This commit is contained in:
BennyZhao 2021-05-09 11:13:19 +08:00
parent 2303af0082
commit 6bf49e48bb
6 changed files with 134 additions and 104 deletions

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Threading;
using Xunit;
namespace IoTClient.Tests.PLCTests
@ -36,7 +37,7 @@ namespace IoTClient.Tests.PLCTests
float float_number = int_number / 100;
var bool_value = short_number % 2 == 1;
string value_string = "BennyZhao"+ float_number;
string value_string = "BennyZhao" + float_number;
client.Write("Q1.3", bool_value);
Assert.True(client.ReadBoolean("Q1.3").Value == bool_value);
@ -64,7 +65,7 @@ namespace IoTClient.Tests.PLCTests
Assert.True(client.ReadFloat("V200").Value == float_number);
client.Write("V300", Convert.ToDouble(float_number));
Assert.True(client.ReadDouble("V300").Value == Convert.ToDouble(float_number));
client.Write("V2205", value_string);
Assert.True(client.ReadString("V2205").Value == value_string);
}
@ -298,5 +299,21 @@ namespace IoTClient.Tests.PLCTests
var result2 = client.Write("DB1.434.0", false);
client.Write("DB1.434.0", true);
}
[Fact]
public void ()
{
client.ReadInt16("V100", (value,isSucceed,err) =>
{
Debug.WriteLine($"V100:{value} err:{err}");
});
client.ReadInt16("V102", (value, isSucceed, err) =>
{
Debug.WriteLine($"V102:{value} err:{err}");
});
Thread.Sleep(1000 * 30);
}
}
}

View File

@ -688,7 +688,7 @@ namespace IoTClient.Clients.Modbus
var stationNumbers = addresses.Where(t => t.FunctionCode == functionCode).Select(t => t.StationNumber).Distinct();
foreach (var stationNumber in stationNumbers)
{
var addressList = addresses.Where(t => t.FunctionCode == functionCode && t.StationNumber == t.StationNumber)
var addressList = addresses.Where(t => t.FunctionCode == functionCode && t.StationNumber == stationNumber)
.DistinctBy(t => t.Address)
.ToDictionary(t => t.Address, t => t.DataType);
var tempResult = BatchRead(addressList, stationNumber, functionCode);

View File

@ -787,7 +787,7 @@ namespace IoTClient.Clients.Modbus
var stationNumbers = addresses.Where(t => t.FunctionCode == functionCode).Select(t => t.StationNumber).Distinct();
foreach (var stationNumber in stationNumbers)
{
var addressList = addresses.Where(t => t.FunctionCode == functionCode && t.StationNumber == t.StationNumber)
var addressList = addresses.Where(t => t.FunctionCode == functionCode && t.StationNumber == stationNumber)
.DistinctBy(t => t.Address)
.ToDictionary(t => t.Address, t => t.DataType);
var tempResult = BatchRead(addressList, stationNumber, functionCode);

View File

@ -11,6 +11,8 @@ using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace IoTClient.Clients.PLC
{
@ -204,10 +206,9 @@ namespace IoTClient.Clients.PLC
/// </summary>
/// <param name="address">地址</param>
/// <param name="length">读取长度</param>
/// <param name="isBit">是否Bit类型</param>
/// <param name="setEndian">暂未使用</param>
/// <param name="isBit">是否Bit类型</param>
/// <returns></returns>
public Result<byte[]> Read(string address, ushort length, bool isBit = false, bool setEndian = true)
public Result<byte[]> Read(string address, ushort length, bool isBit = false)
{
if (!socket?.Connected ?? true)
{
@ -268,71 +269,6 @@ namespace IoTClient.Clients.PLC
return result.EndTime();
}
/// <summary>
/// 读取字符串
/// </summary>
/// <param name="address">地址</param>
/// <param name="length">读取长度</param>
/// <returns></returns>
public Result<byte[]> ReadString(string address, ushort length)
{
if (!socket?.Connected ?? true)
{
var connectResult = Connect();
if (!connectResult.IsSucceed)
{
return new Result<byte[]>(connectResult);
}
}
var result = new Result<byte[]>();
try
{
//发送读取信息
var arg = ConvertArg(address);
arg.ReadWriteLength = length;
byte[] command = GetReadCommand(arg);
result.Requst = string.Join(" ", command.Select(t => t.ToString("X2")));
var sendResult = SendPackage(command);
if (!sendResult.IsSucceed)
return result.SetErrInfo(sendResult).EndTime();
var dataPackage = sendResult.Value;
byte[] requst = new byte[length];
Array.Copy(dataPackage, 25, requst, 0, length);
result.Response = string.Join(" ", dataPackage.Select(t => t.ToString("X2")));
result.Value = requst;
}
catch (SocketException ex)
{
result.IsSucceed = false;
if (ex.SocketErrorCode == SocketError.TimedOut)
{
result.Err = "连接超时";
result.ErrList.Add("连接超时");
}
else
{
result.Err = ex.Message;
result.Exception = ex;
result.ErrList.Add(ex.Message);
}
socket?.SafeClose();
}
catch (Exception ex)
{
result.IsSucceed = false;
result.Err = ex.Message;
result.Exception = ex;
result.ErrList.Add(ex.Message);
socket?.SafeClose();
}
finally
{
if (isAutoOpen) Dispose();
}
return result.EndTime();
}
/// <summary>
/// 分批读取默认按19个地址打包读取
/// </summary>
@ -572,6 +508,31 @@ namespace IoTClient.Clients.PLC
return result.EndTime();
}
/// <summary>
/// 定时读取,回调更新
/// </summary>
/// <param name="address"></param>
/// <param name="action"></param>
public void ReadInt16(string address, Action<short, bool, string> action)
{
Task.Run(() =>
{
while (true)
{
try
{
Thread.Sleep(400);
var value = ReadInt16(address);
action(value.Value, value.IsSucceed, value.Err);
}
catch (Exception ex)
{
action(0, false, ex.Message);
}
}
});
}
/// <summary>
/// 读取Int16
/// </summary>
@ -903,6 +864,70 @@ namespace IoTClient.Clients.PLC
//return Encoding.ASCII.GetString(, 1, length[0]);
}
/// <summary>
/// 读取字符串
/// </summary>
/// <param name="address">地址</param>
/// <param name="length">读取长度</param>
/// <returns></returns>
public Result<byte[]> ReadString(string address, ushort length)
{
if (!socket?.Connected ?? true)
{
var connectResult = Connect();
if (!connectResult.IsSucceed)
{
return new Result<byte[]>(connectResult);
}
}
var result = new Result<byte[]>();
try
{
//发送读取信息
var arg = ConvertArg(address);
arg.ReadWriteLength = length;
byte[] command = GetReadCommand(arg);
result.Requst = string.Join(" ", command.Select(t => t.ToString("X2")));
var sendResult = SendPackage(command);
if (!sendResult.IsSucceed)
return result.SetErrInfo(sendResult).EndTime();
var dataPackage = sendResult.Value;
byte[] requst = new byte[length];
Array.Copy(dataPackage, 25, requst, 0, length);
result.Response = string.Join(" ", dataPackage.Select(t => t.ToString("X2")));
result.Value = requst;
}
catch (SocketException ex)
{
result.IsSucceed = false;
if (ex.SocketErrorCode == SocketError.TimedOut)
{
result.Err = "连接超时";
result.ErrList.Add("连接超时");
}
else
{
result.Err = ex.Message;
result.Exception = ex;
result.ErrList.Add(ex.Message);
}
socket?.SafeClose();
}
catch (Exception ex)
{
result.IsSucceed = false;
result.Err = ex.Message;
result.Exception = ex;
result.ErrList.Add(ex.Message);
socket?.SafeClose();
}
finally
{
if (isAutoOpen) Dispose();
}
return result.EndTime();
}
#endregion
#region Write

View File

@ -60,7 +60,7 @@ namespace IoTClient.Interfaces
/// <param name="length"></param>
/// <param name="isBit"></param>
/// <returns></returns>
Result<byte[]> Read(string address, ushort length, bool isBit = false, bool setEndian = true);
//Result<byte[]> Read(string address, ushort length, bool isBit = false, bool setEndian = true);
/// <summary>
///
@ -158,7 +158,7 @@ namespace IoTClient.Interfaces
/// <param name="data">值</param>
/// <param name="isBit">值</param>
/// <returns></returns>
Result Write(string address, byte[] data, bool isBit = false);
//Result Write(string address, byte[] data, bool isBit = false);
/// <summary>
/// 写入数据

View File

@ -1299,7 +1299,7 @@
<param name="stationNumber">站号</param>
<param name="functionCode">功能码</param>
<param name="encoding">编码</param>
<param name="readLength">编码</param>
<param name="readLength">读取长度</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.Modbus.ModbusTcpClient.ReadCoil(System.String,System.Byte,System.Byte)">
@ -2570,22 +2570,13 @@
<param name="command"></param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.Read(System.String,System.UInt16,System.Boolean,System.Boolean)">
<member name="M:IoTClient.Clients.PLC.SiemensClient.Read(System.String,System.UInt16,System.Boolean)">
<summary>
读取字节数组
</summary>
<param name="address">地址</param>
<param name="length">读取长度</param>
<param name="isBit">是否Bit类型</param>
<param name="setEndian">暂未使用</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.ReadString(System.String,System.UInt16)">
<summary>
读取字符串
</summary>
<param name="address">地址</param>
<param name="length">读取长度</param>
<param name="isBit">是否Bit类型</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.BatchRead(System.Collections.Generic.Dictionary{System.String,IoTClient.Enums.DataTypeEnum},System.Int32)">
@ -2640,6 +2631,13 @@
<param name="address">地址</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.ReadInt16(System.String,System.Action{System.Int16,System.Boolean,System.String})">
<summary>
定时读取,回调更新
</summary>
<param name="address"></param>
<param name="action"></param>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.ReadInt16(System.String,System.UInt16)">
<summary>
读取Int16
@ -2760,6 +2758,14 @@
<param name="address">地址</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.ReadString(System.String,System.UInt16)">
<summary>
读取字符串
</summary>
<param name="address">地址</param>
<param name="length">读取长度</param>
<returns></returns>
</member>
<member name="M:IoTClient.Clients.PLC.SiemensClient.BatchWrite(System.Collections.Generic.Dictionary{System.String,System.Object})">
<summary>
批量写入
@ -3428,15 +3434,6 @@
<param name="batchNumber">批量读取数量</param>
<returns></returns>
</member>
<member name="M:IoTClient.Interfaces.IEthernetClient.Read(System.String,System.UInt16,System.Boolean,System.Boolean)">
<summary>
读取数据
</summary>
<param name="address">地址</param>
<param name="length"></param>
<param name="isBit"></param>
<returns></returns>
</member>
<member name="M:IoTClient.Interfaces.IEthernetClient.ReadByte(System.String)">
<summary>
@ -3522,15 +3519,6 @@
<param name="batchNumber">批量读取数量</param>
<returns></returns>
</member>
<member name="M:IoTClient.Interfaces.IEthernetClient.Write(System.String,System.Byte[],System.Boolean)">
<summary>
写入数据
</summary>
<param name="address">地址</param>
<param name="data"></param>
<param name="isBit"></param>
<returns></returns>
</member>
<member name="M:IoTClient.Interfaces.IEthernetClient.Write(System.String,System.Byte)">
<summary>
写入数据