Bug fix and test fix
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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")) :
|
||||||
|
|||||||
@@ -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
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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"]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user