Bug fix and test fix

This commit is contained in:
luosheng
2023-04-22 19:20:58 +08:00
parent 78c305d37e
commit da9eb30d00
19 changed files with 84 additions and 314 deletions

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.Modbus.NA200H</AssemblyName> <AssemblyName>Modbus.Net.Modbus.NA200H</AssemblyName>
<RootNamespace>Modbus.Net.Modbus.NA200H</RootNamespace> <RootNamespace>Modbus.Net.Modbus.NA200H</RootNamespace>
<PackageId>Modbus.Net.Modbus.NA200H</PackageId> <PackageId>Modbus.Net.Modbus.NA200H</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
<Product>Modbus.Net.Modbus</Product> <Product>Modbus.Net.Modbus</Product>

View File

@@ -12,13 +12,13 @@ namespace Modbus.Net.Modbus.SelfDefinedSample
/// 获取PLC时间 /// 获取PLC时间
/// </summary> /// </summary>
/// <returns>PLC时间</returns> /// <returns>PLC时间</returns>
Task<ReturnStruct<DateTime>> GetTimeAsync(); Task<ReturnStruct<DateTime>> GetTimeAsync(ushort startAddress);
/// <summary> /// <summary>
/// 设置PLC时间 /// 设置PLC时间
/// </summary> /// </summary>
/// <param name="setTime">设置PLC时间</param> /// <param name="setTime">设置PLC时间</param>
/// <returns>设置是否成功</returns> /// <returns>设置是否成功</returns>
Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime); Task<ReturnStruct<bool>> SetTimeAsync(ushort startAddress, DateTime setTime);
} }
} }

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.Modbus.SelfDefinedSample</AssemblyName> <AssemblyName>Modbus.Net.Modbus.SelfDefinedSample</AssemblyName>
<RootNamespace>Modbus.Net.Modbus.SelfDefinedSample</RootNamespace> <RootNamespace>Modbus.Net.Modbus.SelfDefinedSample</RootNamespace>
<PackageId>Modbus.Net.Modbus.SelfDefinedSample</PackageId> <PackageId>Modbus.Net.Modbus.SelfDefinedSample</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
<Product>Modbus.Net.Modbus</Product> <Product>Modbus.Net.Modbus</Product>

View File

@@ -30,11 +30,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
public GetSystemTimeModbusInputStruct(byte slaveAddress) public GetSystemTimeModbusInputStruct(byte slaveAddress, ushort startAddress)
{ {
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.GetSystemTime; FunctionCode = (byte)ModbusProtocolTimeFunctionCode.GetSystemTime;
StartAddress = 30000; StartAddress = startAddress;
GetCount = 5; GetCount = 5;
} }
@@ -162,11 +162,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample
/// </summary> /// </summary>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="time">时间</param> /// <param name="time">时间</param>
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time) public SetSystemTimeModbusInputStruct(byte slaveAddress, ushort startAddress, DateTime time)
{ {
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.SetSystemTime; FunctionCode = (byte)ModbusProtocolTimeFunctionCode.SetSystemTime;
StartAddress = 30000; StartAddress = startAddress;
WriteCount = 5; WriteCount = 5;
WriteByteCount = 10; WriteByteCount = 10;
Year = (ushort)time.Year; Year = (ushort)time.Year;

View File

@@ -39,11 +39,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample
/// 读时间 /// 读时间
/// </summary> /// </summary>
/// <returns>设备的时间</returns> /// <returns>设备的时间</returns>
public async Task<ReturnStruct<DateTime>> GetTimeAsync() public async Task<ReturnStruct<DateTime>> GetTimeAsync(ushort startAddress)
{ {
try try
{ {
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress); var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress, startAddress);
var outputStruct = var outputStruct =
await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>( await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>(
Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct); Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct);
@@ -73,11 +73,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample
/// </summary> /// </summary>
/// <param name="setTime">需要写入的时间</param> /// <param name="setTime">需要写入的时间</param>
/// <returns>写入是否成功</returns> /// <returns>写入是否成功</returns>
public async Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime) public async Task<ReturnStruct<bool>> SetTimeAsync(ushort startAddress, DateTime setTime)
{ {
try try
{ {
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime); var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, startAddress, setTime);
var outputStruct = var outputStruct =
await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>( await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>(
Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct); Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct);

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.Modbus</AssemblyName> <AssemblyName>Modbus.Net.Modbus</AssemblyName>
<RootNamespace>Modbus.Net.Modbus</RootNamespace> <RootNamespace>Modbus.Net.Modbus</RootNamespace>
<PackageId>Modbus.Net.Modbus</PackageId> <PackageId>Modbus.Net.Modbus</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
<Product>Modbus.Net.Modbus</Product> <Product>Modbus.Net.Modbus</Product>

View File

@@ -16,9 +16,7 @@ namespace Modbus.Net.Modbus
public ModbusAsciiProtocolLinker(string com, int slaveAddress) public ModbusAsciiProtocolLinker(string com, int slaveAddress)
: base(com, slaveAddress) : base(com, slaveAddress)
{ {
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new MatchController( ((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
new ICollection<(int, int)>[] {
new List<(int, int)> { (1, 1), (2, 2) }, new List<(int, int)> { (3, 3), (4, 4) } },
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")),
lengthCalc: content => lengthCalc: content =>
{ {

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using ProtocolUnit = Modbus.Net.ProtocolUnit<byte[], byte[]>; using ProtocolUnit = Modbus.Net.ProtocolUnit<byte[], byte[]>;
@@ -296,10 +297,14 @@ namespace Modbus.Net.Modbus
FunctionCode = (byte)translateAddress.Area; FunctionCode = (byte)translateAddress.Area;
StartAddress = (ushort)translateAddress.Address; StartAddress = (ushort)translateAddress.Address;
var writeByteValue = ValueHelper.GetInstance(endian).ObjectArrayToByteArray(writeValue); var writeByteValue = ValueHelper.GetInstance(endian).ObjectArrayToByteArray(writeValue);
if (writeByteValue.Length % 2 == 1) writeByteValue = writeByteValue.ToList().Append<byte>(0).ToArray();
WriteCount = WriteCount =
(ushort)(writeByteValue.Length / addressTranslator.GetAreaByteLength(translateAddress.AreaString)); (ushort)(writeByteValue.Length / addressTranslator.GetAreaByteLength(translateAddress.AreaString));
WriteByteCount = (byte)writeByteValue.Length; WriteByteCount = (byte)writeByteValue.Length;
WriteValue = writeByteValue; WriteValue = writeByteValue;
translateAddress = ((ModbusTranslatorBase)addressTranslator).AddressTranslate(startAddress, false, WriteCount == 1);
FunctionCode = (byte)translateAddress.Area;
StartAddress = (ushort)translateAddress.Address;
} }
/// <summary> /// <summary>
@@ -389,8 +394,18 @@ namespace Modbus.Net.Modbus
{ {
var r_message = (WriteDataModbusInputStruct)message; var r_message = (WriteDataModbusInputStruct)message;
var dataValue = Format(r_message.WriteValue); var dataValue = Format(r_message.WriteValue);
var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode, byte[] formattingBytes;
if (r_message.FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil || r_message.FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleRegister)
{
formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode,
r_message.StartAddress, dataValue);
}
else
{
formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode,
r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, dataValue); r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, dataValue);
}
return formattingBytes; return formattingBytes;
} }
@@ -406,142 +421,15 @@ namespace Modbus.Net.Modbus
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
if (functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil || functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleRegister)
{
writeCount = 1;
}
return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress, return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress,
writeCount); writeCount);
} }
} }
/// <summary>
/// 写数据输入
/// </summary>
public class WriteSingleCoilModbusInputStruct : IInputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="startAddress">开始地址</param>
/// <param name="writeValue">写入的数据</param>
/// <param name="addressTranslator">地址翻译器</param>
/// <param name="endian">端格式</param>
public WriteSingleCoilModbusInputStruct(byte slaveAddress, string startAddress, object writeValue,
ModbusTranslatorBase addressTranslator, Endian endian)
{
SlaveAddress = slaveAddress;
var translateAddress = addressTranslator.AddressTranslate(startAddress, false, true);
FunctionCode = (byte)translateAddress.Area;
StartAddress = (ushort)translateAddress.Address;
var writeByteValue =
FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil
? ((bool)writeValue
? new byte[] { 0xFF, 0x00 }
: new byte[] { 0x00, 0x00 })
: ValueHelper.GetInstance(endian).GetBytes(ushort.Parse(writeValue.ToString()));
WriteValue = writeByteValue;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; }
/// <summary>
/// 写入的数据
/// </summary>
public byte[] WriteValue { get; }
}
/// <summary>
/// 写数据输出
/// </summary>
public class WriteSingleCoilModbusOutputStruct : IOutputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param>
/// <param name="writeValue">写入的数据</param>
public WriteSingleCoilModbusOutputStruct(byte slaveAddress, byte functionCode,
ushort startAddress, object writeValue)
{
SlaveAddress = slaveAddress;
FunctionCode = functionCode;
StartAddress = startAddress;
WriteValue = writeValue;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; private set; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; private set; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; private set; }
/// <summary>
/// 写入的数据
/// </summary>
public object WriteValue { get; private set; }
}
/// <summary>
/// 写多个寄存器协议
/// </summary>
public class WriteSingleCoilModbusProtocol : ProtocolUnit
{
/// <summary>
/// 格式化
/// </summary>
/// <param name="message">写寄存器参数</param>
/// <returns>写寄存器协议核心</returns>
public override byte[] Format(IInputStruct message)
{
var r_message = (WriteSingleCoilModbusInputStruct)message;
var dataValue = Format(r_message.WriteValue);
var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode,
r_message.StartAddress, dataValue);
return formattingBytes;
}
/// <summary>
/// 反格式化
/// </summary>
/// <param name="messageBytes">设备返回的信息</param>
/// <param name="flag">当前反格式化的位置</param>
/// <returns>反格式化的信息</returns>
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var returnValue = functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil
? (object)(writeValue == 0xFF00) : writeValue;
return new WriteSingleCoilModbusOutputStruct(slaveAddress, functionCode, startAddress,
returnValue);
}
}
#endregion #endregion
/// <summary> /// <summary>

View File

@@ -28,7 +28,8 @@ namespace Modbus.Net.Modbus
int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content => lengthCalc: content =>
{ {
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; if (content[1] > 128) return 5;
else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
}, },
checkRightFunc: ContentCheck.Crc16CheckRight, checkRightFunc: ContentCheck.Crc16CheckRight,

View File

@@ -28,7 +28,8 @@ namespace Modbus.Net.Modbus
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content => lengthCalc: content =>
{ {
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; if (content[1] > 128) return 5;
else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
}, },
checkRightFunc: ContentCheck.Crc16CheckRight, checkRightFunc: ContentCheck.Crc16CheckRight,

View File

@@ -15,12 +15,12 @@ namespace Modbus.Net.Modbus
public ModbusRtuProtocolLinker(string com, int slaveAddress) public ModbusRtuProtocolLinker(string com, int slaveAddress)
: base(com, slaveAddress) : base(com, slaveAddress)
{ {
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new MatchController( ((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0) }, new List<(int, int)> { (1, 1) } },
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")),
lengthCalc: content => lengthCalc: content =>
{ {
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; if (content[1] > 128) return 5;
else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
}, },
checkRightFunc: ContentCheck.Crc16CheckRight, checkRightFunc: ContentCheck.Crc16CheckRight,

View File

@@ -23,8 +23,8 @@ namespace Modbus.Net.Modbus
/// <param name="port">端口</param> /// <param name="port">端口</param>
public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port) public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port)
{ {
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController( ((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController(
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } },
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6),
waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) :

View File

@@ -50,24 +50,10 @@ namespace Modbus.Net.Modbus
AsciiInUdp = 7 AsciiInUdp = 7
} }
/// <summary>
/// 写单个数据方法接口
/// </summary>
public interface IUtilityMethodWriteSingleCoil : IUtilityMethod
{
/// <summary>
/// 写数据
/// </summary>
/// <param name="startAddress">起始地址</param>
/// <param name="setContent">需要设置的数据</param>
/// <returns>设置是否成功</returns>
Task<ReturnStruct<bool>> SetSingleCoilAsync(string startAddress, object setContent);
}
/// <summary> /// <summary>
/// Modbus基础Api入口 /// Modbus基础Api入口
/// </summary> /// </summary>
public class ModbusUtility : BaseUtility<byte[], byte[], ProtocolUnit<byte[], byte[]>, PipeUnit>, IUtilityMethodWriteSingleCoil public class ModbusUtility : BaseUtility<byte[], byte[], ProtocolUnit<byte[], byte[]>, PipeUnit>
{ {
private static readonly ILogger<ModbusUtility> logger = LogProvider.CreateLogger<ModbusUtility>(); private static readonly ILogger<ModbusUtility> logger = LogProvider.CreateLogger<ModbusUtility>();
@@ -327,41 +313,5 @@ namespace Modbus.Net.Modbus
}; };
} }
} }
/// <summary>
/// 写数据
/// </summary>
/// <param name="startAddress">起始地址</param>
/// <param name="setContent">需要设置的数据</param>
/// <returns>设置是否成功</returns>
public async Task<ReturnStruct<bool>> SetSingleCoilAsync(string startAddress, object setContent)
{
try
{
var inputStruct = new WriteSingleCoilModbusInputStruct(SlaveAddress, startAddress, setContent,
(ModbusTranslatorBase)AddressTranslator, Endian);
var outputStruct = await
Wrapper.SendReceiveAsync<WriteSingleCoilModbusOutputStruct>(Wrapper[typeof(WriteSingleCoilModbusProtocol)],
inputStruct);
return new ReturnStruct<bool>()
{
Datas = outputStruct?.WriteValue.ToString() == setContent.ToString(),
IsSuccess = outputStruct?.WriteValue.ToString() == setContent.ToString(),
ErrorCode = outputStruct?.WriteValue.ToString() == setContent.ToString() ? 0 : -2,
ErrorMsg = outputStruct?.WriteValue.ToString() == setContent.ToString() ? "" : "Data length mismatch"
};
}
catch (ModbusProtocolErrorException e)
{
logger.LogError(e, $"ModbusUtility -> SetSingleDatas: {ConnectionString} error: {e.Message}");
return new ReturnStruct<bool>
{
Datas = false,
IsSuccess = false,
ErrorCode = e.ErrorMessageNumber,
ErrorMsg = e.Message
};
}
}
} }
} }

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.OPC</AssemblyName> <AssemblyName>Modbus.Net.OPC</AssemblyName>
<RootNamespace>Modbus.Net.OPC</RootNamespace> <RootNamespace>Modbus.Net.OPC</RootNamespace>
<PackageId>Modbus.Net.OPC</PackageId> <PackageId>Modbus.Net.OPC</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
<Product>Modbus.Net.OPC</Product> <Product>Modbus.Net.OPC</Product>

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.Siemens</AssemblyName> <AssemblyName>Modbus.Net.Siemens</AssemblyName>
<RootNamespace>Modbus.Net.Siemens</RootNamespace> <RootNamespace>Modbus.Net.Siemens</RootNamespace>
<PackageId>Modbus.Net.Siemens</PackageId> <PackageId>Modbus.Net.Siemens</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
<Description>Modbus.Net Siemens Profinet Implementation</Description> <Description>Modbus.Net Siemens Profinet Implementation</Description>

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net</AssemblyName> <AssemblyName>Modbus.Net</AssemblyName>
<RootNamespace>Modbus.Net</RootNamespace> <RootNamespace>Modbus.Net</RootNamespace>
<PackageId>Modbus.Net</PackageId> <PackageId>Modbus.Net</PackageId>
<Version>1.4.1-beta05</Version> <Version>1.4.1</Version>
<Product>Modbus.Net</Product> <Product>Modbus.Net</Product>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>

View File

@@ -25,10 +25,10 @@ namespace Modbus.Net.Tests
{ {
BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, _machineIp, null, true, 2, 0); BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, _machineIp, null, true, 2, 0);
await baseMachine.BaseUtility.ConnectAsync(); await baseMachine.BaseUtility.ConnectAsync();
var success = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().SetDatasAsync("4X 1", new object[] { (ushort)11 }); var success = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().SetDatasAsync("4X 1", new object[] { (byte)11 });
Assert.AreEqual(success.IsSuccess, true); Assert.AreEqual(success.IsSuccess, true);
var datas = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync("4X 1", 1); var datas = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync("4X 1", 1);
Assert.AreEqual(datas.Datas[1], 11); Assert.AreEqual(datas.Datas[0], 11);
baseMachine.Disconnect(); baseMachine.Disconnect();
} }

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<OrderedTest name="orderedtest1" storage="d:\projects\modbus.net\tests\modbus.net.tests\orderedtest1.orderedtest" id="c2f51f4c-19e8-42d2-8c7f-1dbb4ebb2e88" continueAfterFailure="true" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<TestLinks>
<TestLink id="8fc138ca-a847-7ba6-30bd-8465e5d81166" name="AddressCombinerSingleTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="948ce1c7-1a93-ff61-879f-01d07c465a96" name="AddressCombinerContinusTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="bcb65caa-0479-7113-a94c-0f4eda0fe7aa" name="AddressCombinerContinusLimitTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="97edc693-ec72-8e16-4387-2f8694c03de1" name="AddressCombinerNumericJumpTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="007296fa-3356-9471-45ea-c1b0e44d0e5e" name="AddressCombinerNumericJumpLimitTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="451b2cd5-84ee-1363-4cbe-cca378ad88dc" name="AddressCombinerPercentageJumpTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="10c49cd9-2989-03de-ebcc-bb2e64bc5fe5" name="AddressCombinerPercentageJumpLimitTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="a81ec237-5ad5-5e28-7818-e20a7c71cbd3" name="BaseMachineGetAddressTest" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="d9c84800-2fd3-0746-e627-273d971afaac" name="GetUtility" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="0a42a00e-b1ba-935b-6fea-bbfe93ca7a7b" name="InvokeMachine" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="d9441eaf-4742-d8db-ea94-db48cb66d52b" name="InvokeUtility" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="f8f2fe14-00f7-3f01-a076-a28e580d0492" name="ModbusCoilSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="ab00dadb-beed-2925-baf9-4f6ea41860d2" name="ModbusDInputSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="04bb0e91-6d84-dad5-ea4e-00cd79d3ed0b" name="ModbusIRegSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="95448160-9d4e-6784-d82f-7da3a3d727fd" name="ModbusRegSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="77205461-d045-e529-6de0-6a577d14de30" name="ModbusRegMultiple" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="bacee2fc-3c9e-79c9-8b30-78792be0e71a" name="MultiStation" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="b1895074-1d93-00aa-a730-5da486ca349b" name="OpcSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="d0738e86-024c-dbab-42a7-73048b993f27" name="OpcMultiple" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="e9728028-f234-710c-fced-469c72d77159" name="OpcWrite" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="fe0338ba-435c-d2aa-8736-aec68c672cfd" name="SiemensCoilSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="9f29d167-679e-28b9-f211-e3c430a8613c" name="SiemensDInputSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="f37fb91e-1cc0-e9df-3163-173574b2c613" name="SiemensMSingleBool" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="48af77ea-9315-04b2-0358-da5b371af3e6" name="SiemensMSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="3ff65ca6-f244-fda3-f8ba-d5c12a96b092" name="SiemensDbSingle" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="0318ff48-7798-7715-00db-c4ff8ac8f735" name="SiemensDbMultiple" storage="bin\debug\modbus.net.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
</TestLinks>
</OrderedTest>

View File

@@ -16,6 +16,8 @@ namespace Modbus.Net.Tests
private string _machineCom = "COM1"; private string _machineCom = "COM1";
private string _machineCom2 = "COM3";
[TestInitialize] [TestInitialize]
public void Init() public void Init()
{ {
@@ -23,7 +25,7 @@ namespace Modbus.Net.Tests
_modbusRtuMachine = new ModbusMachine<string, string>("2", ModbusType.Rtu, _machineCom, null, true, 2, 0); _modbusRtuMachine = new ModbusMachine<string, string>("2", ModbusType.Rtu, _machineCom, null, true, 2, 0);
_modbusAsciiMachine = new ModbusMachine<string, string>("3", ModbusType.Ascii, _machineCom, null, true, 2, 0); _modbusAsciiMachine = new ModbusMachine<string, string>("3", ModbusType.Ascii, _machineCom2, null, true, 2, 0);
} }
[TestMethod] [TestMethod]
@@ -60,9 +62,9 @@ namespace Modbus.Net.Tests
var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address);
var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address);
Assert.AreEqual(ans.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); Assert.AreEqual(ans.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]);
Assert.AreEqual(ans2.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); Assert.AreEqual(ans2.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]);
Assert.AreEqual(ans3.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); Assert.AreEqual(ans3.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]);
} }
[TestMethod] [TestMethod]
@@ -87,9 +89,9 @@ namespace Modbus.Net.Tests
var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address);
var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address);
Assert.AreEqual(ans.Datas["1X 1.0"].DeviceValue, 0); Assert.AreEqual(ans.Datas?["1X 1.0"].DeviceValue, 0);
Assert.AreEqual(ans2.Datas["1X 1.0"].DeviceValue, 0); Assert.AreEqual(ans2.Datas?["1X 1.0"].DeviceValue, 0);
Assert.AreEqual(ans3.Datas["1X 1.0"].DeviceValue, 0); Assert.AreEqual(ans3.Datas?["1X 1.0"].DeviceValue, 0);
} }
[TestMethod] [TestMethod]
@@ -114,9 +116,9 @@ namespace Modbus.Net.Tests
var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address);
var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address);
Assert.AreEqual(ans.Datas["3X 1.0"].DeviceValue, 0); Assert.AreEqual(ans.Datas?["3X 1.0"].DeviceValue, 0);
Assert.AreEqual(ans2.Datas["3X 1.0"].DeviceValue, 0); Assert.AreEqual(ans2.Datas?["3X 1.0"].DeviceValue, 0);
Assert.AreEqual(ans3.Datas["3X 1.0"].DeviceValue, 0); Assert.AreEqual(ans3.Datas?["3X 1.0"].DeviceValue, 0);
} }
[TestMethod] [TestMethod]
@@ -153,9 +155,9 @@ namespace Modbus.Net.Tests
var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address);
var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address);
Assert.AreEqual(ans.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); Assert.AreEqual(ans.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]);
Assert.AreEqual(ans2.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); Assert.AreEqual(ans2.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]);
Assert.AreEqual(ans3.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); Assert.AreEqual(ans3.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]);
} }
[TestMethod] [TestMethod]
@@ -254,63 +256,24 @@ namespace Modbus.Net.Tests
var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.CommunicationTag); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.CommunicationTag);
var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.CommunicationTag); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.CommunicationTag);
Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); Assert.AreEqual(ans.Datas?["A1"].DeviceValue, dic1["A1"]);
Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); Assert.AreEqual(ans.Datas?["A2"].DeviceValue, dic1["A2"]);
Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); Assert.AreEqual(ans.Datas?["A3"].DeviceValue, dic1["A3"]);
Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); Assert.AreEqual(ans.Datas?["A4"].DeviceValue, dic1["A4"]);
Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); Assert.AreEqual(ans.Datas?["A5"].DeviceValue, dic1["A5"]);
Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); Assert.AreEqual(ans.Datas?["A6"].DeviceValue, dic1["A6"]);
Assert.AreEqual(ans2.Datas["A1"].DeviceValue, dic1["A1"]); Assert.AreEqual(ans2.Datas?["A1"].DeviceValue, dic1["A1"]);
Assert.AreEqual(ans2.Datas["A2"].DeviceValue, dic1["A2"]); Assert.AreEqual(ans2.Datas?["A2"].DeviceValue, dic1["A2"]);
Assert.AreEqual(ans2.Datas["A3"].DeviceValue, dic1["A3"]); Assert.AreEqual(ans2.Datas?["A3"].DeviceValue, dic1["A3"]);
Assert.AreEqual(ans2.Datas["A4"].DeviceValue, dic1["A4"]); Assert.AreEqual(ans2.Datas?["A4"].DeviceValue, dic1["A4"]);
Assert.AreEqual(ans2.Datas["A5"].DeviceValue, dic1["A5"]); Assert.AreEqual(ans2.Datas?["A5"].DeviceValue, dic1["A5"]);
Assert.AreEqual(ans2.Datas["A6"].DeviceValue, dic1["A6"]); Assert.AreEqual(ans2.Datas?["A6"].DeviceValue, dic1["A6"]);
Assert.AreEqual(ans3.Datas["A1"].DeviceValue, dic1["A1"]); Assert.AreEqual(ans3.Datas?["A1"].DeviceValue, dic1["A1"]);
Assert.AreEqual(ans3.Datas["A2"].DeviceValue, dic1["A2"]); Assert.AreEqual(ans3.Datas?["A2"].DeviceValue, dic1["A2"]);
Assert.AreEqual(ans3.Datas["A3"].DeviceValue, dic1["A3"]); Assert.AreEqual(ans3.Datas?["A3"].DeviceValue, dic1["A3"]);
Assert.AreEqual(ans3.Datas["A4"].DeviceValue, dic1["A4"]); Assert.AreEqual(ans3.Datas?["A4"].DeviceValue, dic1["A4"]);
Assert.AreEqual(ans3.Datas["A5"].DeviceValue, dic1["A5"]); Assert.AreEqual(ans3.Datas?["A5"].DeviceValue, dic1["A5"]);
Assert.AreEqual(ans3.Datas["A6"].DeviceValue, dic1["A6"]); Assert.AreEqual(ans3.Datas?["A6"].DeviceValue, dic1["A6"]);
}
[TestMethod]
public async Task ModbusWriteSingleTest()
{
Random r = new Random();
var dic1 = new Dictionary<string, double>()
{
{
"4X 1", r.Next(0, UInt16.MaxValue)
}
};
var dic2 = new Dictionary<string, double>()
{
{
"0X 1", r.Next(0, 2)
}
};
await _modbusTcpMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
await _modbusAsciiMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
await _modbusRtuMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<ushort>("4X 1", 1);
var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<ushort>("4X 1", 1);
var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<ushort>("4X 1", 1);
Assert.AreEqual(ans.Datas[0], dic1["4X 1"]);
Assert.AreEqual(ans2.Datas[0], dic1["4X 1"]);
Assert.AreEqual(ans3.Datas[0], dic1["4X 1"]);
await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
var ans21 = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<bool>("0X 1", 1);
var ans22 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<bool>("0X 1", 1);
var ans23 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodDatas>().GetDatasAsync<bool>("0X 1", 1);
Assert.AreEqual(ans21.Datas[0] ? 1 : 0, dic2["0X 1"]);
Assert.AreEqual(ans22.Datas[0] ? 1 : 0, dic2["0X 1"]);
Assert.AreEqual(ans23.Datas[0] ? 1 : 0, dic2["0X 1"]);
} }