Add a sample self defined modbus function library (not complete)
This commit is contained in:
@@ -46,7 +46,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
"Q",
|
"Q",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadCoilStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -54,7 +54,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
"M",
|
"M",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadCoilStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -62,7 +62,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
"N",
|
"N",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadCoilStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -70,7 +70,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
"I",
|
"I",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadInputStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -78,29 +78,29 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
"S",
|
"S",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadInputStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"IW",
|
"IW",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadInputRegister, AreaWidth = 2}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"SW",
|
"SW",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadInputRegister, AreaWidth = 2}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"MW",
|
"MW",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"NW",
|
"NW",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"QW",
|
"QW",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
|
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
|
||||||
@@ -109,7 +109,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("Q", false),
|
("Q", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -117,7 +117,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("M", false),
|
("M", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -125,7 +125,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("N", false),
|
("N", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -133,7 +133,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("MW", false),
|
("MW", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -141,7 +141,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("NW", false),
|
("NW", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -149,7 +149,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("QW", false),
|
("QW", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -157,7 +157,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("Q", true),
|
("Q", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -165,7 +165,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("M", true),
|
("M", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -173,7 +173,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("N", true),
|
("N", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -181,7 +181,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("MW", true),
|
("MW", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -189,7 +189,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("NW", true),
|
("NW", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -197,7 +197,7 @@ namespace Modbus.Net.Modbus.NA200H
|
|||||||
("QW", true),
|
("QW", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Modbus.Net.Modbus.SelfDefinedSample
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Utility的时间读写接口
|
||||||
|
/// </summary>
|
||||||
|
public interface IUtilityMethodTime : IUtilityMethod
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取PLC时间
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>PLC时间</returns>
|
||||||
|
Task<ReturnStruct<DateTime>> GetTimeAsync();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置PLC时间
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="setTime">设置PLC时间</param>
|
||||||
|
/// <returns>设置是否成功</returns>
|
||||||
|
Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||||
|
<AssemblyName>Modbus.Net.Modbus.SelfDefinedSample</AssemblyName>
|
||||||
|
<RootNamespace>Modbus.Net.Modbus.SelfDefinedSample</RootNamespace>
|
||||||
|
<PackageId>Modbus.Net.Modbus.SelfDefinedSample</PackageId>
|
||||||
|
<Version>1.4.1-beta05</Version>
|
||||||
|
<Authors>Chris L.(Luo Sheng)</Authors>
|
||||||
|
<Company>Hangzhou Delian Science Technology Co.,Ltd.</Company>
|
||||||
|
<Product>Modbus.Net.Modbus</Product>
|
||||||
|
<Description>Modbus.Net Modbus Implementation</Description>
|
||||||
|
<Copyright>Copyright 2023 Hangzhou Delian Science Technology Co.,Ltd.</Copyright>
|
||||||
|
<PackageProjectUrl>https://github.com/parallelbgls/Modbus.Net/tree/master/Modbus.Net/Modbus.Net.Modbus.NA200H</PackageProjectUrl>
|
||||||
|
<RepositoryUrl>https://github.com/parallelbgls/Modbus.Net</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PackageTags>hardware communicate protocol modbus Delian</PackageTags>
|
||||||
|
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
|
||||||
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
|
<IncludeSymbols>True</IncludeSymbols>
|
||||||
|
<IncludeSource>True</IncludeSource>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Modbus.Net.Modbus\Modbus.Net.Modbus.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="README.md" Pack="true" PackagePath=""/>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Modbus.Net.Modbus.SelfDefinedSample
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 跟时间有关的功能码
|
||||||
|
/// </summary>
|
||||||
|
public enum ModbusProtocolTimeFunctionCode : byte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 读时间
|
||||||
|
/// </summary>
|
||||||
|
GetSystemTime = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写时间
|
||||||
|
/// </summary>
|
||||||
|
SetSystemTime = 16
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 读PLC时间
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读时间输入
|
||||||
|
/// </summary>
|
||||||
|
public class GetSystemTimeModbusInputStruct : IInputStruct
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
public GetSystemTimeModbusInputStruct(byte slaveAddress)
|
||||||
|
{
|
||||||
|
SlaveAddress = slaveAddress;
|
||||||
|
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.GetSystemTime;
|
||||||
|
StartAddress = 30000;
|
||||||
|
GetCount = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从站号
|
||||||
|
/// </summary>
|
||||||
|
public byte SlaveAddress { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 功能码
|
||||||
|
/// </summary>
|
||||||
|
public byte FunctionCode { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始地址
|
||||||
|
/// </summary>
|
||||||
|
public ushort StartAddress { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取个数
|
||||||
|
/// </summary>
|
||||||
|
public ushort GetCount { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读时间输出
|
||||||
|
/// </summary>
|
||||||
|
public class GetSystemTimeModbusOutputStruct : IOutputStruct
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
/// <param name="functionCode">功能码</param>
|
||||||
|
/// <param name="writeByteCount">写入个数</param>
|
||||||
|
/// <param name="year">年</param>
|
||||||
|
/// <param name="day">日</param>
|
||||||
|
/// <param name="month">月</param>
|
||||||
|
/// <param name="hour">时</param>
|
||||||
|
/// <param name="second">秒</param>
|
||||||
|
/// <param name="minute">分</param>
|
||||||
|
/// <param name="millisecond">毫秒</param>
|
||||||
|
public GetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||||
|
byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute,
|
||||||
|
ushort millisecond)
|
||||||
|
{
|
||||||
|
SlaveAddress = slaveAddress;
|
||||||
|
FunctionCode = functionCode;
|
||||||
|
WriteByteCount = writeByteCount;
|
||||||
|
Time = new DateTime(year, month, day, hour, minute, second, millisecond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从站号
|
||||||
|
/// </summary>
|
||||||
|
public byte SlaveAddress { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 功能码
|
||||||
|
/// </summary>
|
||||||
|
public byte FunctionCode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写入个数
|
||||||
|
/// </summary>
|
||||||
|
public byte WriteByteCount { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime Time { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读系统时间协议
|
||||||
|
/// </summary>
|
||||||
|
public class GetSystemTimeModbusProtocol : ProtocolUnit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 格式化
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">写系统时间参数</param>
|
||||||
|
/// <returns>写系统时间的核心</returns>
|
||||||
|
public override byte[] Format(IInputStruct message)
|
||||||
|
{
|
||||||
|
var r_message = (GetSystemTimeModbusInputStruct)message;
|
||||||
|
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||||
|
r_message.StartAddress, r_message.GetCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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 writeByteCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||||
|
var year = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||||
|
var day = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||||
|
var month = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||||
|
var hour = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||||
|
var second = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||||
|
var minute = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||||
|
var millisecond = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||||
|
return new GetSystemTimeModbusOutputStruct(slaveAddress, functionCode, writeByteCount, year, day,
|
||||||
|
month, hour, second, minute, millisecond);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 写PLC时间
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写时间输入
|
||||||
|
/// </summary>
|
||||||
|
public class SetSystemTimeModbusInputStruct : IInputStruct
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
/// <param name="time">时间</param>
|
||||||
|
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time)
|
||||||
|
{
|
||||||
|
SlaveAddress = slaveAddress;
|
||||||
|
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.SetSystemTime;
|
||||||
|
StartAddress = 30000;
|
||||||
|
WriteCount = 5;
|
||||||
|
WriteByteCount = 10;
|
||||||
|
Year = (ushort)time.Year;
|
||||||
|
Day = (byte)time.Day;
|
||||||
|
Month = (byte)time.Month;
|
||||||
|
Hour = (ushort)time.Hour;
|
||||||
|
Second = (byte)time.Second;
|
||||||
|
Minute = (byte)time.Minute;
|
||||||
|
Millisecond = (ushort)time.Millisecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从站号
|
||||||
|
/// </summary>
|
||||||
|
public byte SlaveAddress { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 功能码
|
||||||
|
/// </summary>
|
||||||
|
public byte FunctionCode { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始地址
|
||||||
|
/// </summary>
|
||||||
|
public ushort StartAddress { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写入个数
|
||||||
|
/// </summary>
|
||||||
|
public ushort WriteCount { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写入字节个数
|
||||||
|
/// </summary>
|
||||||
|
public byte WriteByteCount { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 年
|
||||||
|
/// </summary>
|
||||||
|
public ushort Year { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 日
|
||||||
|
/// </summary>
|
||||||
|
public byte Day { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 月
|
||||||
|
/// </summary>
|
||||||
|
public byte Month { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 时
|
||||||
|
/// </summary>
|
||||||
|
public ushort Hour { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 秒
|
||||||
|
/// </summary>
|
||||||
|
public byte Second { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分
|
||||||
|
/// </summary>
|
||||||
|
public byte Minute { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 毫秒
|
||||||
|
/// </summary>
|
||||||
|
public ushort Millisecond { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写时间输出
|
||||||
|
/// </summary>
|
||||||
|
public class SetSystemTimeModbusOutputStruct : IOutputStruct
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
/// <param name="functionCode">功能码</param>
|
||||||
|
/// <param name="startAddress">开始地址</param>
|
||||||
|
/// <param name="writeCount">写入个数</param>
|
||||||
|
public SetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||||
|
ushort startAddress, ushort writeCount)
|
||||||
|
{
|
||||||
|
SlaveAddress = slaveAddress;
|
||||||
|
FunctionCode = functionCode;
|
||||||
|
StartAddress = startAddress;
|
||||||
|
WriteCount = writeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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 ushort WriteCount { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写系统时间协议
|
||||||
|
/// </summary>
|
||||||
|
public class SetSystemTimeModbusProtocol : ProtocolUnit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 格式化
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">写系统时间的参数</param>
|
||||||
|
/// <returns>写系统时间的核心</returns>
|
||||||
|
public override byte[] Format(IInputStruct message)
|
||||||
|
{
|
||||||
|
var r_message = (SetSystemTimeModbusInputStruct)message;
|
||||||
|
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||||
|
r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, r_message.Year,
|
||||||
|
r_message.Day,
|
||||||
|
r_message.Month, r_message.Hour, r_message.Second, r_message.Minute, r_message.Millisecond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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 writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||||
|
return new SetSystemTimeModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Modbus.Net.Modbus.SelfDefinedSample
|
||||||
|
{
|
||||||
|
public class ModbusUtilityTime : ModbusUtility, IUtilityMethodTime
|
||||||
|
{
|
||||||
|
private static readonly ILogger<ModbusUtility> logger = LogProvider.CreateLogger<ModbusUtility>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="connectionType">协议类型</param>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
/// <param name="masterAddress">主站号</param>
|
||||||
|
/// <param name="endian">端格式</param>
|
||||||
|
public ModbusUtilityTime(int connectionType, byte slaveAddress, byte masterAddress,
|
||||||
|
Endian endian = Endian.BigEndianLsb)
|
||||||
|
: base(connectionType, slaveAddress, masterAddress, endian)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="connectionType">协议类型</param>
|
||||||
|
/// <param name="connectionString">连接地址</param>
|
||||||
|
/// <param name="slaveAddress">从站号</param>
|
||||||
|
/// <param name="masterAddress">主站号</param>
|
||||||
|
/// <param name="endian">端格式</param>
|
||||||
|
public ModbusUtilityTime(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress,
|
||||||
|
Endian endian = Endian.BigEndianLsb)
|
||||||
|
: base(connectionType, connectionString, slaveAddress, masterAddress, endian)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读时间
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>设备的时间</returns>
|
||||||
|
public async Task<ReturnStruct<DateTime>> GetTimeAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress);
|
||||||
|
var outputStruct =
|
||||||
|
await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>(
|
||||||
|
Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct);
|
||||||
|
return new ReturnStruct<DateTime>
|
||||||
|
{
|
||||||
|
Datas = outputStruct?.Time ?? DateTime.MinValue,
|
||||||
|
IsSuccess = true,
|
||||||
|
ErrorCode = 0,
|
||||||
|
ErrorMsg = ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (ModbusProtocolErrorException e)
|
||||||
|
{
|
||||||
|
logger.LogError(e, $"ModbusUtility -> GetTime: {ConnectionString} error: {e.Message}");
|
||||||
|
return new ReturnStruct<DateTime>
|
||||||
|
{
|
||||||
|
Datas = DateTime.MinValue,
|
||||||
|
IsSuccess = false,
|
||||||
|
ErrorCode = e.ErrorMessageNumber,
|
||||||
|
ErrorMsg = e.Message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写时间
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="setTime">需要写入的时间</param>
|
||||||
|
/// <returns>写入是否成功</returns>
|
||||||
|
public async Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime);
|
||||||
|
var outputStruct =
|
||||||
|
await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>(
|
||||||
|
Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct);
|
||||||
|
return new ReturnStruct<bool>()
|
||||||
|
{
|
||||||
|
Datas = outputStruct?.WriteCount > 0,
|
||||||
|
IsSuccess = outputStruct?.WriteCount > 0,
|
||||||
|
ErrorCode = outputStruct?.WriteCount > 0 ? 0 : -2,
|
||||||
|
ErrorMsg = outputStruct?.WriteCount > 0 ? "" : "Data length zero"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (ModbusProtocolErrorException e)
|
||||||
|
{
|
||||||
|
logger.LogError(e, $"ModbusUtility -> SetTime: {ConnectionString} error: {e.Message}");
|
||||||
|
return new ReturnStruct<bool>
|
||||||
|
{
|
||||||
|
Datas = false,
|
||||||
|
IsSuccess = false,
|
||||||
|
ErrorCode = e.ErrorMessageNumber,
|
||||||
|
ErrorMsg = e.Message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/README.md
Normal file
7
Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/README.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Modbus.Net.Modbus
|
||||||
|
===================
|
||||||
|
[](https://www.nuget.org/packages/Modbus.Net.Modbus.SelfDefinedSample/)
|
||||||
|
|
||||||
|
Self defined function get time and set time implementation of Modbus.Net
|
||||||
|
|
||||||
|
Doc has been moved to wiki.
|
||||||
@@ -54,7 +54,7 @@ namespace Modbus.Net.Modbus
|
|||||||
"0X",
|
"0X",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadCoilStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -62,17 +62,17 @@ namespace Modbus.Net.Modbus
|
|||||||
"1X",
|
"1X",
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
|
Code = (int) ModbusProtocolFunctionCode.ReadInputStatus,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"3X",
|
"3X",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadInputRegister, AreaWidth = 2}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"4X",
|
"4X",
|
||||||
new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
new AreaOutputDef {Code = (int) ModbusProtocolFunctionCode.ReadHoldRegister, AreaWidth = 2}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
|
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
|
||||||
@@ -81,7 +81,7 @@ namespace Modbus.Net.Modbus
|
|||||||
("0X", false),
|
("0X", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -89,7 +89,7 @@ namespace Modbus.Net.Modbus
|
|||||||
("4X", false),
|
("4X", false),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteMultiRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -97,7 +97,7 @@ namespace Modbus.Net.Modbus
|
|||||||
("0X", true),
|
("0X", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleCoil,
|
||||||
AreaWidth = 0.125
|
AreaWidth = 0.125
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -105,7 +105,7 @@ namespace Modbus.Net.Modbus
|
|||||||
("4X", true),
|
("4X", true),
|
||||||
new AreaOutputDef
|
new AreaOutputDef
|
||||||
{
|
{
|
||||||
Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
|
Code = (int) ModbusProtocolFunctionCode.WriteSingleRegister,
|
||||||
AreaWidth = 2
|
AreaWidth = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,42 +4,10 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// 变量功能码
|
|
||||||
/// </summary>
|
|
||||||
internal enum ModbusProtocolVariableFunctionCode : byte
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 读变量
|
|
||||||
/// </summary>
|
|
||||||
ReadVariable = 20,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写变量
|
|
||||||
/// </summary>
|
|
||||||
WriteVariable = 21
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 跟时间有关的功能码
|
|
||||||
/// </summary>
|
|
||||||
public enum ModbusProtocolTimeFunctionCode : byte
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 读时间
|
|
||||||
/// </summary>
|
|
||||||
GetSystemTime = 3,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写时间
|
|
||||||
/// </summary>
|
|
||||||
SetSystemTime = 16
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 跟读数据有关的功能码
|
/// 跟读数据有关的功能码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum ModbusProtocolReadDataFunctionCode : byte
|
public enum ModbusProtocolFunctionCode : byte
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 读线圈
|
/// 读线圈
|
||||||
@@ -59,14 +27,8 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 读输入寄存器
|
/// 读输入寄存器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ReadInputRegister = 4
|
ReadInputRegister = 4,
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 跟写数据有关的功能码
|
|
||||||
/// </summary>
|
|
||||||
public enum ModbusProtocolWriteDataFunctionCode : byte
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写单个线圈
|
/// 写单个线圈
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -85,7 +47,80 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写多个寄存器
|
/// 写多个寄存器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
WriteMultiRegister = 16
|
WriteMultiRegister = 16,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读文件记录
|
||||||
|
/// </summary>
|
||||||
|
ReadFileRecord = 20,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写文件记录
|
||||||
|
/// </summary>
|
||||||
|
WriteFileRecord = 21,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写寄存器掩码
|
||||||
|
/// </summary>
|
||||||
|
MaskWriteRegister = 22,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读写多个寄存器
|
||||||
|
/// </summary>
|
||||||
|
ReadWriteMultipleRegister = 23,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读队列
|
||||||
|
/// </summary>
|
||||||
|
ReadFIFOQueue = 24,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus MEI方式
|
||||||
|
/// </summary>
|
||||||
|
public enum ModbusMEIProtocolFunctionCode : ushort
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
CANopenGeneralReferenceRequestandResponsePDU = 0x2B0D,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读设备信息
|
||||||
|
/// </summary>
|
||||||
|
ReadDeviceIdentification = 0x2B0E
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 只能在串口通信中使用的Modbus方法
|
||||||
|
/// 不能在TCP和UDP通信中使用
|
||||||
|
/// </summary>
|
||||||
|
public enum ModbusSerialPortOnlyFunctionCode : byte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 读错误状态
|
||||||
|
/// </summary>
|
||||||
|
ReadExceptionStatus = 7,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 诊断
|
||||||
|
/// </summary>
|
||||||
|
Diagnostics = 8,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读通讯事件计数器
|
||||||
|
/// </summary>
|
||||||
|
GetCommEventCounter = 11,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读日志
|
||||||
|
/// </summary>
|
||||||
|
GetCommEventLog = 12,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读从站ID
|
||||||
|
/// </summary>
|
||||||
|
ReportSlaveID = 17
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -378,7 +413,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写数据输入
|
/// 写数据输入
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WriteSingleDataModbusInputStruct : IInputStruct
|
public class WriteSingleCoilModbusInputStruct : IInputStruct
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构造函数
|
/// 构造函数
|
||||||
@@ -388,7 +423,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <param name="writeValue">写入的数据</param>
|
/// <param name="writeValue">写入的数据</param>
|
||||||
/// <param name="addressTranslator">地址翻译器</param>
|
/// <param name="addressTranslator">地址翻译器</param>
|
||||||
/// <param name="endian">端格式</param>
|
/// <param name="endian">端格式</param>
|
||||||
public WriteSingleDataModbusInputStruct(byte slaveAddress, string startAddress, object writeValue,
|
public WriteSingleCoilModbusInputStruct(byte slaveAddress, string startAddress, object writeValue,
|
||||||
ModbusTranslatorBase addressTranslator, Endian endian)
|
ModbusTranslatorBase addressTranslator, Endian endian)
|
||||||
{
|
{
|
||||||
SlaveAddress = slaveAddress;
|
SlaveAddress = slaveAddress;
|
||||||
@@ -396,7 +431,7 @@ namespace Modbus.Net.Modbus
|
|||||||
FunctionCode = (byte)translateAddress.Area;
|
FunctionCode = (byte)translateAddress.Area;
|
||||||
StartAddress = (ushort)translateAddress.Address;
|
StartAddress = (ushort)translateAddress.Address;
|
||||||
var writeByteValue =
|
var writeByteValue =
|
||||||
FunctionCode == (byte)ModbusProtocolWriteDataFunctionCode.WriteSingleCoil
|
FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil
|
||||||
? ((bool)writeValue
|
? ((bool)writeValue
|
||||||
? new byte[] { 0xFF, 0x00 }
|
? new byte[] { 0xFF, 0x00 }
|
||||||
: new byte[] { 0x00, 0x00 })
|
: new byte[] { 0x00, 0x00 })
|
||||||
@@ -429,7 +464,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写数据输出
|
/// 写数据输出
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WriteSingleDataModbusOutputStruct : IOutputStruct
|
public class WriteSingleCoilModbusOutputStruct : IOutputStruct
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构造函数
|
/// 构造函数
|
||||||
@@ -438,7 +473,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <param name="functionCode">功能码</param>
|
/// <param name="functionCode">功能码</param>
|
||||||
/// <param name="startAddress">开始地址</param>
|
/// <param name="startAddress">开始地址</param>
|
||||||
/// <param name="writeValue">写入的数据</param>
|
/// <param name="writeValue">写入的数据</param>
|
||||||
public WriteSingleDataModbusOutputStruct(byte slaveAddress, byte functionCode,
|
public WriteSingleCoilModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||||
ushort startAddress, object writeValue)
|
ushort startAddress, object writeValue)
|
||||||
{
|
{
|
||||||
SlaveAddress = slaveAddress;
|
SlaveAddress = slaveAddress;
|
||||||
@@ -471,7 +506,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写多个寄存器协议
|
/// 写多个寄存器协议
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WriteSingleDataModbusProtocol : ProtocolUnit
|
public class WriteSingleCoilModbusProtocol : ProtocolUnit
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 格式化
|
/// 格式化
|
||||||
@@ -480,7 +515,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <returns>写寄存器协议核心</returns>
|
/// <returns>写寄存器协议核心</returns>
|
||||||
public override byte[] Format(IInputStruct message)
|
public override byte[] Format(IInputStruct message)
|
||||||
{
|
{
|
||||||
var r_message = (WriteSingleDataModbusInputStruct)message;
|
var r_message = (WriteSingleCoilModbusInputStruct)message;
|
||||||
var dataValue = Format(r_message.WriteValue);
|
var dataValue = Format(r_message.WriteValue);
|
||||||
var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode,
|
var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||||
r_message.StartAddress, dataValue);
|
r_message.StartAddress, dataValue);
|
||||||
@@ -499,314 +534,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 writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
var writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||||
var returnValue = functionCode == (byte)ModbusProtocolWriteDataFunctionCode.WriteSingleCoil
|
var returnValue = functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil
|
||||||
? (object)(writeValue == 0xFF00) : writeValue;
|
? (object)(writeValue == 0xFF00) : writeValue;
|
||||||
return new WriteSingleDataModbusOutputStruct(slaveAddress, functionCode, startAddress,
|
return new WriteSingleCoilModbusOutputStruct(slaveAddress, functionCode, startAddress,
|
||||||
returnValue);
|
returnValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 读PLC时间
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读时间输入
|
|
||||||
/// </summary>
|
|
||||||
public class GetSystemTimeModbusInputStruct : IInputStruct
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 构造函数
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="slaveAddress">从站号</param>
|
|
||||||
public GetSystemTimeModbusInputStruct(byte slaveAddress)
|
|
||||||
{
|
|
||||||
SlaveAddress = slaveAddress;
|
|
||||||
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.GetSystemTime;
|
|
||||||
StartAddress = 30000;
|
|
||||||
GetCount = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从站号
|
|
||||||
/// </summary>
|
|
||||||
public byte SlaveAddress { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 功能码
|
|
||||||
/// </summary>
|
|
||||||
public byte FunctionCode { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 开始地址
|
|
||||||
/// </summary>
|
|
||||||
public ushort StartAddress { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取个数
|
|
||||||
/// </summary>
|
|
||||||
public ushort GetCount { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读时间输出
|
|
||||||
/// </summary>
|
|
||||||
public class GetSystemTimeModbusOutputStruct : IOutputStruct
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 构造函数
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="slaveAddress">从站号</param>
|
|
||||||
/// <param name="functionCode">功能码</param>
|
|
||||||
/// <param name="writeByteCount">写入个数</param>
|
|
||||||
/// <param name="year">年</param>
|
|
||||||
/// <param name="day">日</param>
|
|
||||||
/// <param name="month">月</param>
|
|
||||||
/// <param name="hour">时</param>
|
|
||||||
/// <param name="second">秒</param>
|
|
||||||
/// <param name="minute">分</param>
|
|
||||||
/// <param name="millisecond">毫秒</param>
|
|
||||||
public GetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
|
||||||
byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute,
|
|
||||||
ushort millisecond)
|
|
||||||
{
|
|
||||||
SlaveAddress = slaveAddress;
|
|
||||||
FunctionCode = functionCode;
|
|
||||||
WriteByteCount = writeByteCount;
|
|
||||||
Time = new DateTime(year, month, day, hour, minute, second, millisecond);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从站号
|
|
||||||
/// </summary>
|
|
||||||
public byte SlaveAddress { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 功能码
|
|
||||||
/// </summary>
|
|
||||||
public byte FunctionCode { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写入个数
|
|
||||||
/// </summary>
|
|
||||||
public byte WriteByteCount { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime Time { get; private set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读系统时间协议
|
|
||||||
/// </summary>
|
|
||||||
public class GetSystemTimeModbusProtocol : ProtocolUnit
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 格式化
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">写系统时间参数</param>
|
|
||||||
/// <returns>写系统时间的核心</returns>
|
|
||||||
public override byte[] Format(IInputStruct message)
|
|
||||||
{
|
|
||||||
var r_message = (GetSystemTimeModbusInputStruct)message;
|
|
||||||
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
|
||||||
r_message.StartAddress, r_message.GetCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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 writeByteCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
|
||||||
var year = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
|
||||||
var day = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
|
||||||
var month = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
|
||||||
var hour = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
|
||||||
var second = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
|
||||||
var minute = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
|
||||||
var millisecond = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
|
||||||
return new GetSystemTimeModbusOutputStruct(slaveAddress, functionCode, writeByteCount, year, day,
|
|
||||||
month, hour, second, minute, millisecond);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 写PLC时间
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写时间输入
|
|
||||||
/// </summary>
|
|
||||||
public class SetSystemTimeModbusInputStruct : IInputStruct
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 构造函数
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="slaveAddress">从站号</param>
|
|
||||||
/// <param name="time">时间</param>
|
|
||||||
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time)
|
|
||||||
{
|
|
||||||
SlaveAddress = slaveAddress;
|
|
||||||
FunctionCode = (byte)ModbusProtocolTimeFunctionCode.SetSystemTime;
|
|
||||||
StartAddress = 30000;
|
|
||||||
WriteCount = 5;
|
|
||||||
WriteByteCount = 10;
|
|
||||||
Year = (ushort)time.Year;
|
|
||||||
Day = (byte)time.Day;
|
|
||||||
Month = (byte)time.Month;
|
|
||||||
Hour = (ushort)time.Hour;
|
|
||||||
Second = (byte)time.Second;
|
|
||||||
Minute = (byte)time.Minute;
|
|
||||||
Millisecond = (ushort)time.Millisecond;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从站号
|
|
||||||
/// </summary>
|
|
||||||
public byte SlaveAddress { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 功能码
|
|
||||||
/// </summary>
|
|
||||||
public byte FunctionCode { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 开始地址
|
|
||||||
/// </summary>
|
|
||||||
public ushort StartAddress { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写入个数
|
|
||||||
/// </summary>
|
|
||||||
public ushort WriteCount { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写入字节个数
|
|
||||||
/// </summary>
|
|
||||||
public byte WriteByteCount { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 年
|
|
||||||
/// </summary>
|
|
||||||
public ushort Year { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 日
|
|
||||||
/// </summary>
|
|
||||||
public byte Day { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 月
|
|
||||||
/// </summary>
|
|
||||||
public byte Month { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 时
|
|
||||||
/// </summary>
|
|
||||||
public ushort Hour { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 秒
|
|
||||||
/// </summary>
|
|
||||||
public byte Second { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 分
|
|
||||||
/// </summary>
|
|
||||||
public byte Minute { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 毫秒
|
|
||||||
/// </summary>
|
|
||||||
public ushort Millisecond { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写时间输出
|
|
||||||
/// </summary>
|
|
||||||
public class SetSystemTimeModbusOutputStruct : IOutputStruct
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 构造函数
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="slaveAddress">从站号</param>
|
|
||||||
/// <param name="functionCode">功能码</param>
|
|
||||||
/// <param name="startAddress">开始地址</param>
|
|
||||||
/// <param name="writeCount">写入个数</param>
|
|
||||||
public SetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
|
||||||
ushort startAddress, ushort writeCount)
|
|
||||||
{
|
|
||||||
SlaveAddress = slaveAddress;
|
|
||||||
FunctionCode = functionCode;
|
|
||||||
StartAddress = startAddress;
|
|
||||||
WriteCount = writeCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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 ushort WriteCount { get; private set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写系统时间协议
|
|
||||||
/// </summary>
|
|
||||||
public class SetSystemTimeModbusProtocol : ProtocolUnit
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 格式化
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">写系统时间的参数</param>
|
|
||||||
/// <returns>写系统时间的核心</returns>
|
|
||||||
public override byte[] Format(IInputStruct message)
|
|
||||||
{
|
|
||||||
var r_message = (SetSystemTimeModbusInputStruct)message;
|
|
||||||
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
|
||||||
r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, r_message.Year,
|
|
||||||
r_message.Day,
|
|
||||||
r_message.Month, r_message.Hour, r_message.Second, r_message.Minute, r_message.Millisecond);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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 writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
|
||||||
return new SetSystemTimeModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Modbus协议错误表
|
/// Modbus协议错误表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -820,6 +556,9 @@ namespace Modbus.Net.Modbus
|
|||||||
{4, "SLAVE_DEVICE_FAILURE"},
|
{4, "SLAVE_DEVICE_FAILURE"},
|
||||||
{5, "ACKNOWLWDGE"},
|
{5, "ACKNOWLWDGE"},
|
||||||
{6, "SLAVE_DEVICE_BUSY"},
|
{6, "SLAVE_DEVICE_BUSY"},
|
||||||
|
{8, "MEMORY_PARITY_ERROR" },
|
||||||
|
{10, "GATEWAY_PATH_UNAVAILABLE"},
|
||||||
|
{11, "GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND"},
|
||||||
{500, "TCP_ILLEGAL_LENGTH"},
|
{500, "TCP_ILLEGAL_LENGTH"},
|
||||||
{501, "RTU_ILLEGAL_CRC"}
|
{501, "RTU_ILLEGAL_CRC"}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写单个数据方法接口
|
/// 写单个数据方法接口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IUtilityMethodWriteSingle : IUtilityMethod
|
public interface IUtilityMethodWriteSingleCoil : IUtilityMethod
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 写数据
|
/// 写数据
|
||||||
@@ -61,13 +61,13 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <param name="startAddress">起始地址</param>
|
/// <param name="startAddress">起始地址</param>
|
||||||
/// <param name="setContent">需要设置的数据</param>
|
/// <param name="setContent">需要设置的数据</param>
|
||||||
/// <returns>设置是否成功</returns>
|
/// <returns>设置是否成功</returns>
|
||||||
Task<ReturnStruct<bool>> SetSingleDataAsync(string startAddress, object setContent);
|
Task<ReturnStruct<bool>> SetSingleCoilAsync(string startAddress, object setContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Modbus基础Api入口
|
/// Modbus基础Api入口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ModbusUtility : BaseUtility, IUtilityMethodTime, IUtilityMethodWriteSingle
|
public class ModbusUtility : BaseUtility, IUtilityMethodWriteSingleCoil
|
||||||
{
|
{
|
||||||
private static readonly ILogger<ModbusUtility> logger = LogProvider.CreateLogger<ModbusUtility>();
|
private static readonly ILogger<ModbusUtility> logger = LogProvider.CreateLogger<ModbusUtility>();
|
||||||
|
|
||||||
@@ -247,73 +247,6 @@ namespace Modbus.Net.Modbus
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读时间
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>设备的时间</returns>
|
|
||||||
public async Task<ReturnStruct<DateTime>> GetTimeAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress);
|
|
||||||
var outputStruct =
|
|
||||||
await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>(
|
|
||||||
Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct);
|
|
||||||
return new ReturnStruct<DateTime>
|
|
||||||
{
|
|
||||||
Datas = outputStruct?.Time ?? DateTime.MinValue,
|
|
||||||
IsSuccess = true,
|
|
||||||
ErrorCode = 0,
|
|
||||||
ErrorMsg = ""
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (ModbusProtocolErrorException e)
|
|
||||||
{
|
|
||||||
logger.LogError(e, $"ModbusUtility -> GetTime: {ConnectionString} error: {e.Message}");
|
|
||||||
return new ReturnStruct<DateTime>
|
|
||||||
{
|
|
||||||
Datas = DateTime.MinValue,
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorCode = e.ErrorMessageNumber,
|
|
||||||
ErrorMsg = e.Message
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写时间
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="setTime">需要写入的时间</param>
|
|
||||||
/// <returns>写入是否成功</returns>
|
|
||||||
public async Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime);
|
|
||||||
var outputStruct =
|
|
||||||
await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>(
|
|
||||||
Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct);
|
|
||||||
return new ReturnStruct<bool>()
|
|
||||||
{
|
|
||||||
Datas = outputStruct?.WriteCount > 0,
|
|
||||||
IsSuccess = outputStruct?.WriteCount > 0,
|
|
||||||
ErrorCode = outputStruct?.WriteCount > 0 ? 0 : -2,
|
|
||||||
ErrorMsg = outputStruct?.WriteCount > 0 ? "" : "Data length zero"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (ModbusProtocolErrorException e)
|
|
||||||
{
|
|
||||||
logger.LogError(e, $"ModbusUtility -> SetTime: {ConnectionString} error: {e.Message}");
|
|
||||||
return new ReturnStruct<bool>
|
|
||||||
{
|
|
||||||
Datas = false,
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorCode = e.ErrorMessageNumber,
|
|
||||||
ErrorMsg = e.Message
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置协议类型
|
/// 设置协议类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -401,14 +334,14 @@ namespace Modbus.Net.Modbus
|
|||||||
/// <param name="startAddress">起始地址</param>
|
/// <param name="startAddress">起始地址</param>
|
||||||
/// <param name="setContent">需要设置的数据</param>
|
/// <param name="setContent">需要设置的数据</param>
|
||||||
/// <returns>设置是否成功</returns>
|
/// <returns>设置是否成功</returns>
|
||||||
public async Task<ReturnStruct<bool>> SetSingleDataAsync(string startAddress, object setContent)
|
public async Task<ReturnStruct<bool>> SetSingleCoilAsync(string startAddress, object setContent)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var inputStruct = new WriteSingleDataModbusInputStruct(SlaveAddress, startAddress, setContent,
|
var inputStruct = new WriteSingleCoilModbusInputStruct(SlaveAddress, startAddress, setContent,
|
||||||
(ModbusTranslatorBase)AddressTranslator, Endian);
|
(ModbusTranslatorBase)AddressTranslator, Endian);
|
||||||
var outputStruct = await
|
var outputStruct = await
|
||||||
Wrapper.SendReceiveAsync<WriteSingleDataModbusOutputStruct>(Wrapper[typeof(WriteSingleDataModbusProtocol)],
|
Wrapper.SendReceiveAsync<WriteSingleCoilModbusOutputStruct>(Wrapper[typeof(WriteSingleCoilModbusProtocol)],
|
||||||
inputStruct);
|
inputStruct);
|
||||||
return new ReturnStruct<bool>()
|
return new ReturnStruct<bool>()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrossLamp", "..\Samples\Cro
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TripleAdd", "..\Samples\TripleAdd\TripleAdd.csproj", "{414956B8-DBD4-414C-ABD3-565580739646}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TripleAdd", "..\Samples\TripleAdd\TripleAdd.csproj", "{414956B8-DBD4-414C-ABD3-565580739646}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modbus.Net.Modbus.SelfDefinedSample", "Modbus.Net.Modbus.SelfDefinedSample\Modbus.Net.Modbus.SelfDefinedSample.csproj", "{C4FA55AF-80ED-4467-948F-8EF865C8A5A5}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -84,6 +86,10 @@ Global
|
|||||||
{414956B8-DBD4-414C-ABD3-565580739646}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{414956B8-DBD4-414C-ABD3-565580739646}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{414956B8-DBD4-414C-ABD3-565580739646}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{414956B8-DBD4-414C-ABD3-565580739646}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{414956B8-DBD4-414C-ABD3-565580739646}.Release|Any CPU.Build.0 = Release|Any CPU
|
{414956B8-DBD4-414C-ABD3-565580739646}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C4FA55AF-80ED-4467-948F-8EF865C8A5A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{C4FA55AF-80ED-4467-948F-8EF865C8A5A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C4FA55AF-80ED-4467-948F-8EF865C8A5A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{C4FA55AF-80ED-4467-948F-8EF865C8A5A5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -97,23 +97,4 @@ namespace Modbus.Net
|
|||||||
/// <returns>是否设置成功</returns>
|
/// <returns>是否设置成功</returns>
|
||||||
Task<ReturnStruct<bool>> SetDatasAsync(string startAddress, object[] setContents);
|
Task<ReturnStruct<bool>> SetDatasAsync(string startAddress, object[] setContents);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Utility的时间读写接口
|
|
||||||
/// </summary>
|
|
||||||
public interface IUtilityMethodTime : IUtilityMethod
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 获取PLC时间
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>PLC时间</returns>
|
|
||||||
Task<ReturnStruct<DateTime>> GetTimeAsync();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设置PLC时间
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="setTime">设置PLC时间</param>
|
|
||||||
/// <returns>设置是否成功</returns>
|
|
||||||
Task<ReturnStruct<bool>> SetTimeAsync(DateTime setTime);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -11,10 +11,10 @@ namespace Modbus.Net.Tests
|
|||||||
public void GetUtility()
|
public void GetUtility()
|
||||||
{
|
{
|
||||||
BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0);
|
BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0);
|
||||||
var utility = baseMachine.GetUtility<IUtilityMethodTime>();
|
var utility = baseMachine.GetUtility<IUtilityMethodData>();
|
||||||
var methods = utility.GetType().GetRuntimeMethods();
|
var methods = utility.GetType().GetRuntimeMethods();
|
||||||
Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "GetTimeAsync") != null, true);
|
Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "GetDataAsync") != null, true);
|
||||||
Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "SetTimeAsync") != null, true);
|
Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "SetDataAsync") != null, true);
|
||||||
baseMachine.Disconnect();
|
baseMachine.Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,10 +22,10 @@ namespace Modbus.Net.Tests
|
|||||||
public async Task InvokeUtility()
|
public async Task InvokeUtility()
|
||||||
{
|
{
|
||||||
BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0);
|
BaseMachine<int, int> baseMachine = new ModbusMachine<int, int>(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0);
|
||||||
var success = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodTime>().SetTimeAsync(DateTime.Now);
|
var success = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().SetDatasAsync("4X 1", new object[] {(byte)11});
|
||||||
Assert.AreEqual(success, true);
|
Assert.AreEqual(success, true);
|
||||||
var time = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodTime>().GetTimeAsync();
|
var datas = await baseMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync("4X 1", 1);
|
||||||
Assert.AreEqual((time.Datas.ToUniversalTime() - DateTime.Now.ToUniversalTime()).Seconds < 10, true);
|
Assert.AreEqual(datas.Datas[0], 11);
|
||||||
baseMachine.Disconnect();
|
baseMachine.Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -289,18 +289,18 @@ namespace Modbus.Net.Tests
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
await _modbusTcpMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("4X 1", dic1["4X 1"]);
|
await _modbusTcpMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
|
||||||
await _modbusAsciiMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("4X 1", dic1["4X 1"]);
|
await _modbusAsciiMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
|
||||||
await _modbusRtuMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("4X 1", dic1["4X 1"]);
|
await _modbusRtuMachine!.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("4X 1", dic1["4X 1"]);
|
||||||
var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
||||||
var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
||||||
var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<ushort>("4X 1", 1);
|
||||||
Assert.AreEqual(ans.Datas[0], dic1["4X 1"]);
|
Assert.AreEqual(ans.Datas[0], dic1["4X 1"]);
|
||||||
Assert.AreEqual(ans2.Datas[0], dic1["4X 1"]);
|
Assert.AreEqual(ans2.Datas[0], dic1["4X 1"]);
|
||||||
Assert.AreEqual(ans3.Datas[0], dic1["4X 1"]);
|
Assert.AreEqual(ans3.Datas[0], dic1["4X 1"]);
|
||||||
await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1);
|
await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
|
||||||
await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1);
|
await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
|
||||||
await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingle>().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1);
|
await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodWriteSingleCoil>().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1);
|
||||||
var ans21 = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
var ans21 = await _modbusTcpMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
||||||
var ans22 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
var ans22 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
||||||
var ans23 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
var ans23 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods<IUtilityMethodData>().GetDatasAsync<bool>("0X 1", 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user