2017-02-07 update 1 Add comments and documents.
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 南大奥拓NA200H专用AddressFormater
|
||||||
|
/// </summary>
|
||||||
public class AddressFormaterNA200H : AddressFormater
|
public class AddressFormaterNA200H : AddressFormater
|
||||||
{
|
{
|
||||||
public override string FormatAddress(string area, int address)
|
public override string FormatAddress(string area, int address)
|
||||||
@@ -13,6 +16,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus标准AddressFormater
|
||||||
|
/// </summary>
|
||||||
public class AddressFormaterModbus : AddressFormater
|
public class AddressFormaterModbus : AddressFormater
|
||||||
{
|
{
|
||||||
public override string FormatAddress(string area, int address)
|
public override string FormatAddress(string area, int address)
|
||||||
|
|||||||
@@ -4,12 +4,21 @@ using System.Linq;
|
|||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// NA200H数据单元翻译器
|
/// 南大奥拓NA200H数据单元翻译器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AddressTranslatorNA200H : AddressTranslator
|
public class AddressTranslatorNA200H : AddressTranslator
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 读功能码
|
||||||
|
/// </summary>
|
||||||
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
||||||
|
/// <summary>
|
||||||
|
/// 功能码翻译至标准Modbus地址位置
|
||||||
|
/// </summary>
|
||||||
protected Dictionary<string, int> TransDictionary;
|
protected Dictionary<string, int> TransDictionary;
|
||||||
|
/// <summary>
|
||||||
|
/// 写功能码
|
||||||
|
/// </summary>
|
||||||
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
||||||
|
|
||||||
public AddressTranslatorNA200H()
|
public AddressTranslatorNA200H()
|
||||||
@@ -188,7 +197,13 @@ namespace Modbus.Net.Modbus
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class AddressTranslatorModbus : AddressTranslator
|
public class AddressTranslatorModbus : AddressTranslator
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 读功能码
|
||||||
|
/// </summary>
|
||||||
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
||||||
|
/// <summary>
|
||||||
|
/// 写功能码
|
||||||
|
/// </summary>
|
||||||
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
||||||
|
|
||||||
public AddressTranslatorModbus()
|
public AddressTranslatorModbus()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Modbus/Rtu协议
|
/// Modbus/Ascii码协议
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ModbusAsciiProtocal : ModbusProtocal
|
public class ModbusAsciiProtocal : ModbusProtocal
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus/Ascii码协议连接器
|
||||||
|
/// </summary>
|
||||||
public class ModbusAsciiProtocalLinker : ComProtocalLinker
|
public class ModbusAsciiProtocalLinker : ComProtocalLinker
|
||||||
{
|
{
|
||||||
public ModbusAsciiProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
public ModbusAsciiProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus设备
|
||||||
|
/// </summary>
|
||||||
public class ModbusMachine : BaseMachine
|
public class ModbusMachine : BaseMachine
|
||||||
{
|
{
|
||||||
public ModbusMachine(ModbusType connectionType, string connectionString,
|
public ModbusMachine(ModbusType connectionType, string connectionString,
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 变量功能码
|
||||||
|
/// </summary>
|
||||||
internal enum ModbusProtocalVariableFunctionCode : byte
|
internal enum ModbusProtocalVariableFunctionCode : byte
|
||||||
{
|
{
|
||||||
ReadVariable = 20,
|
ReadVariable = 20,
|
||||||
@@ -39,6 +42,9 @@ namespace Modbus.Net.Modbus
|
|||||||
WriteMultiRegister = 16
|
WriteMultiRegister = 16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus协议
|
||||||
|
/// </summary>
|
||||||
public abstract class ModbusProtocal : BaseProtocal
|
public abstract class ModbusProtocal : BaseProtocal
|
||||||
{
|
{
|
||||||
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)
|
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ namespace Modbus.Net.Modbus
|
|||||||
{
|
{
|
||||||
public override byte[] BytesExtend(byte[] content)
|
public override byte[] BytesExtend(byte[] content)
|
||||||
{
|
{
|
||||||
|
//Modbus/Ascii协议扩张,前面增加:,后面增加LRC校验和尾字符
|
||||||
var newContent = new List<byte>();
|
var newContent = new List<byte>();
|
||||||
newContent.AddRange(Encoding.ASCII.GetBytes(":"));
|
newContent.AddRange(Encoding.ASCII.GetBytes(":"));
|
||||||
foreach (var number in content)
|
foreach (var number in content)
|
||||||
@@ -71,6 +72,7 @@ namespace Modbus.Net.Modbus
|
|||||||
|
|
||||||
public override byte[] BytesDecact(byte[] content)
|
public override byte[] BytesDecact(byte[] content)
|
||||||
{
|
{
|
||||||
|
//Modbus/Ascii协议收缩,抛弃头尾。
|
||||||
var newContent = new List<byte>();
|
var newContent = new List<byte>();
|
||||||
var ans = Encoding.ASCII.GetString(content);
|
var ans = Encoding.ASCII.GetString(content);
|
||||||
var index = ans.IndexOf(Environment.NewLine);
|
var index = ans.IndexOf(Environment.NewLine);
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus/Rtu协议连接器
|
||||||
|
/// </summary>
|
||||||
public class ModbusRtuProtocalLinker : ComProtocalLinker
|
public class ModbusRtuProtocalLinker : ComProtocalLinker
|
||||||
{
|
{
|
||||||
public ModbusRtuProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
public ModbusRtuProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
namespace Modbus.Net.Modbus
|
namespace Modbus.Net.Modbus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus/Tcp协议连接器
|
||||||
|
/// </summary>
|
||||||
public class ModbusTcpProtocalLinker : TcpProtocalLinker
|
public class ModbusTcpProtocalLinker : TcpProtocalLinker
|
||||||
{
|
{
|
||||||
public ModbusTcpProtocalLinker(string ip) : base(ip, int.Parse(ConfigurationManager.ModbusPort))
|
public ModbusTcpProtocalLinker(string ip) : base(ip, int.Parse(ConfigurationManager.ModbusPort))
|
||||||
|
|||||||
@@ -23,8 +23,14 @@ namespace Modbus.Net.Modbus
|
|||||||
Ascii = 2
|
Ascii = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus基础Api入口
|
||||||
|
/// </summary>
|
||||||
public class ModbusUtility : BaseUtility
|
public class ModbusUtility : BaseUtility
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Modbus协议类型
|
||||||
|
/// </summary>
|
||||||
private ModbusType _modbusType;
|
private ModbusType _modbusType;
|
||||||
|
|
||||||
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress)
|
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress)
|
||||||
@@ -81,6 +87,7 @@ namespace Modbus.Net.Modbus
|
|||||||
_modbusType = value;
|
_modbusType = value;
|
||||||
switch (_modbusType)
|
switch (_modbusType)
|
||||||
{
|
{
|
||||||
|
//Rtu协议
|
||||||
case ModbusType.Rtu:
|
case ModbusType.Rtu:
|
||||||
{
|
{
|
||||||
Wrapper = ConnectionString == null
|
Wrapper = ConnectionString == null
|
||||||
@@ -88,6 +95,7 @@ namespace Modbus.Net.Modbus
|
|||||||
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//Tcp协议
|
||||||
case ModbusType.Tcp:
|
case ModbusType.Tcp:
|
||||||
{
|
{
|
||||||
Wrapper = ConnectionString == null
|
Wrapper = ConnectionString == null
|
||||||
@@ -98,6 +106,7 @@ namespace Modbus.Net.Modbus
|
|||||||
MasterAddress));
|
MasterAddress));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//Ascii协议
|
||||||
case ModbusType.Ascii:
|
case ModbusType.Ascii:
|
||||||
{
|
{
|
||||||
Wrapper = ConnectionString == null
|
Wrapper = ConnectionString == null
|
||||||
@@ -114,6 +123,12 @@ namespace Modbus.Net.Modbus
|
|||||||
ModbusType = (ModbusType) connectionType;
|
ModbusType = (ModbusType) connectionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="startAddress">起始地址</param>
|
||||||
|
/// <param name="getByteCount">获取字节个数</param>
|
||||||
|
/// <returns>获取的结果</returns>
|
||||||
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
|
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -131,6 +146,12 @@ namespace Modbus.Net.Modbus
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="startAddress">起始地址</param>
|
||||||
|
/// <param name="setContents">需要设置的数据</param>
|
||||||
|
/// <returns>设置是否成功</returns>
|
||||||
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
|
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -149,6 +170,10 @@ namespace Modbus.Net.Modbus
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
/// <summary>
|
||||||
|
/// 读时间
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>设备的时间</returns>
|
||||||
public override DateTime GetTime()
|
public override DateTime GetTime()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -165,6 +190,11 @@ namespace Modbus.Net.Modbus
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写时间
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="setTime">需要写入的时间</param>
|
||||||
|
/// <returns>写入是否成功</returns>
|
||||||
public override bool SetTime(DateTime setTime)
|
public override bool SetTime(DateTime setTime)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Modbus.Net
|
Modbus.Net.Modbus
|
||||||
===================
|
===================
|
||||||
[](https://www.nuget.org/packages/Modbus.Net.Modbus/)
|
[](https://www.nuget.org/packages/Modbus.Net.Modbus/)
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,17 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Opc地址编码器
|
||||||
|
/// </summary>
|
||||||
public class AddressFormaterOpc : AddressFormater
|
public class AddressFormaterOpc : AddressFormater
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 协议构造器
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tagGeter">如何通过BaseMachine和AddressUnit构造Opc的标签</param>
|
||||||
|
/// <param name="machine">调用这个编码器的设备</param>
|
||||||
|
/// <param name="seperator">每两个标签之间用什么符号隔开,默认为/</param>
|
||||||
public AddressFormaterOpc(Func<BaseMachine, AddressUnit, string[]> tagGeter, BaseMachine machine,
|
public AddressFormaterOpc(Func<BaseMachine, AddressUnit, string[]> tagGeter, BaseMachine machine,
|
||||||
char seperator = '/')
|
char seperator = '/')
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Opc地址解析器
|
||||||
|
/// </summary>
|
||||||
public class AddressTranslatorOpc : AddressTranslator
|
public class AddressTranslatorOpc : AddressTranslator
|
||||||
{
|
{
|
||||||
public override AddressDef AddressTranslate(string address, bool isRead)
|
public override AddressDef AddressTranslate(string address, bool isRead)
|
||||||
|
|||||||
@@ -90,6 +90,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Modbus.Net.OPC.nuspec" />
|
<None Include="Modbus.Net.OPC.nuspec" />
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
<None Include="README.md" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// OpcDa协议连接实现
|
||||||
|
/// </summary>
|
||||||
public class OpcDaConnector : BaseConnector
|
public class OpcDaConnector : BaseConnector
|
||||||
{
|
{
|
||||||
protected static Dictionary<string, OpcDaConnector> _instances = new Dictionary<string, OpcDaConnector>();
|
protected static Dictionary<string, OpcDaConnector> _instances = new Dictionary<string, OpcDaConnector>();
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// OpcDa设备
|
||||||
|
/// </summary>
|
||||||
public class OpcDaMachine : BaseMachine
|
public class OpcDaMachine : BaseMachine
|
||||||
{
|
{
|
||||||
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect)
|
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect)
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// OpcDa协议
|
||||||
|
/// </summary>
|
||||||
public class OpcDaProtocal : OpcProtocal
|
public class OpcDaProtocal : OpcProtocal
|
||||||
{
|
{
|
||||||
private readonly string _host;
|
private readonly string _host;
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Opc Da协议连接器
|
||||||
|
/// </summary>
|
||||||
public class OpcDaProtocalLinker : ProtocalLinker
|
public class OpcDaProtocalLinker : ProtocalLinker
|
||||||
{
|
{
|
||||||
public OpcDaProtocalLinker() : this(ConfigurationManager.OpcDaHost)
|
public OpcDaProtocalLinker() : this(ConfigurationManager.OpcDaHost)
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Opc Da协议Api入口
|
||||||
|
/// </summary>
|
||||||
public class OpcDaUtility : BaseUtility
|
public class OpcDaUtility : BaseUtility
|
||||||
{
|
{
|
||||||
public OpcDaUtility(string connectionString) : base(0, 0)
|
public OpcDaUtility(string connectionString) : base(0, 0)
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.OPC
|
namespace Modbus.Net.OPC
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Opc协议
|
||||||
|
/// </summary>
|
||||||
public abstract class OpcProtocal : BaseProtocal
|
public abstract class OpcProtocal : BaseProtocal
|
||||||
{
|
{
|
||||||
protected OpcProtocal() : base(0, 0)
|
protected OpcProtocal() : base(0, 0)
|
||||||
@@ -9,6 +12,8 @@ namespace Modbus.Net.OPC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region 读数据
|
||||||
|
|
||||||
public class ReadRequestOpcInputStruct : InputStruct
|
public class ReadRequestOpcInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public ReadRequestOpcInputStruct(string tag)
|
public ReadRequestOpcInputStruct(string tag)
|
||||||
@@ -43,6 +48,10 @@ namespace Modbus.Net.OPC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 写数据
|
||||||
|
|
||||||
public class WriteRequestOpcInputStruct : InputStruct
|
public class WriteRequestOpcInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public WriteRequestOpcInputStruct(string tag, object setValue)
|
public WriteRequestOpcInputStruct(string tag, object setValue)
|
||||||
@@ -82,4 +91,6 @@ namespace Modbus.Net.OPC
|
|||||||
return new WriteRequestOpcOutputStruct(ans);
|
return new WriteRequestOpcOutputStruct(ans);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
35
Modbus.Net/Modbus.Net.OPC/README.md
Normal file
35
Modbus.Net/Modbus.Net.OPC/README.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
Modbus.Net.OPC
|
||||||
|
===================
|
||||||
|
[](https://www.nuget.org/packages/Modbus.Net.OPC/)
|
||||||
|
|
||||||
|
Modbus Implementation of Modbus.Net
|
||||||
|
|
||||||
|
Table of Content:
|
||||||
|
* [Basic Concept](#basic)
|
||||||
|
* [Address Mapping](#address)
|
||||||
|
* [Link](#link)
|
||||||
|
##<a name="basic"></a> Basic Concept
|
||||||
|
|
||||||
|
Siemens Protocal is derived by Profibus and Profinet.
|
||||||
|
|
||||||
|
##<a name="address"></a> Address Mapping
|
||||||
|
|
||||||
|
Modbus.Net.OPC has a simple address formatting tool. You can find it from AddressFormaterOPC.
|
||||||
|
|
||||||
|
You need to use messages in BaseMachine and AddressUnit to create an OPC tag.
|
||||||
|
|
||||||
|
Here is a Sample.
|
||||||
|
|
||||||
|
If your tag is "1/15/Value_Opening", 1 is MachineId, 15 is StationId and Value_Opening is point name.
|
||||||
|
|
||||||
|
Your tagGeter code should be.
|
||||||
|
|
||||||
|
```C#
|
||||||
|
(baseMachine, addressUnit) => return new string[]{baseMachine.Id, ((XXUnitExtend)addressUnit.unitExtend).stationId, addressUnit.Name};
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want change your tag to "1.15.Value_Opening", just set the seperator to '.' .
|
||||||
|
|
||||||
|
##<a name="link"></a> Link
|
||||||
|
|
||||||
|
The link of OPC DA should like "opcda://PC-Name/OPC-Software-Name".
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Siemens地址格式化(Modbus.Net专用格式)
|
||||||
|
/// </summary>
|
||||||
public class AddressFormaterSiemens : AddressFormater
|
public class AddressFormaterSiemens : AddressFormater
|
||||||
{
|
{
|
||||||
public override string FormatAddress(string area, int address)
|
public override string FormatAddress(string area, int address)
|
||||||
@@ -12,4 +15,36 @@
|
|||||||
return area + " " + address + "." + subAddress;
|
return area + " " + address + "." + subAddress;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Siemens地址格式化(Siemens格式)
|
||||||
|
/// </summary>
|
||||||
|
public class AddressFormaterSimenseStandard : AddressFormater
|
||||||
|
{
|
||||||
|
public override string FormatAddress(string area, int address)
|
||||||
|
{
|
||||||
|
if (area.Length > 1 &&
|
||||||
|
area.ToUpper().Substring(0, 2) == "DB")
|
||||||
|
{
|
||||||
|
return area.ToUpper() + "." + "DB" + address;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return area.ToUpper() + address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string FormatAddress(string area, int address, int subAddress)
|
||||||
|
{
|
||||||
|
if (area.Length > 1 &&
|
||||||
|
area.ToUpper().Substring(0, 2) == "DB")
|
||||||
|
{
|
||||||
|
return area.ToUpper() + "." + "DB" + address + "." + subAddress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return area.ToUpper() + address + "." + subAddress;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 地址翻译器(Modbus.Net格式)
|
||||||
|
/// </summary>
|
||||||
public class AddressTranslatorSiemens : AddressTranslator
|
public class AddressTranslatorSiemens : AddressTranslator
|
||||||
{
|
{
|
||||||
protected Dictionary<string, int> AreaCodeDictionary;
|
protected Dictionary<string, int> AreaCodeDictionary;
|
||||||
@@ -69,4 +73,72 @@ namespace Modbus.Net.Siemens
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地址翻译器(Siemens格式)
|
||||||
|
/// </summary>
|
||||||
|
public class AddressTranslatorSimenseStandard : AddressTranslator
|
||||||
|
{
|
||||||
|
protected Dictionary<string, int> AreaCodeDictionary;
|
||||||
|
|
||||||
|
public AddressTranslatorSimenseStandard()
|
||||||
|
{
|
||||||
|
AreaCodeDictionary = new Dictionary<string, int>
|
||||||
|
{
|
||||||
|
{"S", 0x04},
|
||||||
|
{"SM", 0x05},
|
||||||
|
{"AI", 0x06},
|
||||||
|
{"AQ", 0x07},
|
||||||
|
{"C", 0x1E},
|
||||||
|
{"T", 0x1F},
|
||||||
|
{"HC", 0x20},
|
||||||
|
{"I", 0x81},
|
||||||
|
{"Q", 0x82},
|
||||||
|
{"M", 0x83},
|
||||||
|
{"DB", 0x84},
|
||||||
|
{"V", 0x184},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override AddressDef AddressTranslate(string address, bool isRead)
|
||||||
|
{
|
||||||
|
address = address.ToUpper();
|
||||||
|
if (address.Substring(0, 2) == "DB")
|
||||||
|
{
|
||||||
|
var addressSplit = address.Split('.');
|
||||||
|
if (addressSplit.Length != 2 && addressSplit.Length != 3) throw new FormatException();
|
||||||
|
addressSplit[0] = addressSplit[0].Substring(2);
|
||||||
|
if (addressSplit[1].Substring(0, 2) == "DB")
|
||||||
|
addressSplit[1] = addressSplit[1].Substring(2);
|
||||||
|
return new AddressDef
|
||||||
|
{
|
||||||
|
AreaString = "DB" + addressSplit[0],
|
||||||
|
Area = int.Parse(addressSplit[0]) * 256 + AreaCodeDictionary["DB"],
|
||||||
|
Address = int.Parse(addressSplit[1]),
|
||||||
|
SubAddress = addressSplit.Length == 2 ? 0 : int.Parse(addressSplit[2])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
int t;
|
||||||
|
while (!int.TryParse(address[i].ToString(), out t) && i < address.Length)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i == 0 || i >= address.Length) throw new FormatException();
|
||||||
|
string head = address.Substring(0, i);
|
||||||
|
string[] tail = address.Substring(i).Split('.');
|
||||||
|
return new AddressDef
|
||||||
|
{
|
||||||
|
AreaString = head,
|
||||||
|
Area = AreaCodeDictionary[head],
|
||||||
|
Address = int.Parse(tail[0]),
|
||||||
|
SubAddress = tail.Length == 1 ? 0 : int.Parse(tail[1])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override double GetAreaByteLength(string area)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -64,6 +64,7 @@
|
|||||||
<None Include="Modbus.Net.Siemens.nuspec">
|
<None Include="Modbus.Net.Siemens.nuspec">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="README.md" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
|||||||
42
Modbus.Net/Modbus.Net.Siemens/README.md
Normal file
42
Modbus.Net/Modbus.Net.Siemens/README.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
Modbus.Net.Siemens
|
||||||
|
===================
|
||||||
|
[](https://www.nuget.org/packages/Modbus.Net.Siemens/)
|
||||||
|
|
||||||
|
Modbus Implementation of Modbus.Net
|
||||||
|
|
||||||
|
Table of Content:
|
||||||
|
* [Basic Concept](#basic)
|
||||||
|
* [Address Mapping](#address)
|
||||||
|
* [Addres Coding](#coding)
|
||||||
|
* [SubAddress Rules](#subpos)
|
||||||
|
|
||||||
|
##<a name="basic"></a> Basic Concept
|
||||||
|
|
||||||
|
Siemens Protocal is derived by Profibus and Profinet.
|
||||||
|
|
||||||
|
##<a name="address"></a> Address Mapping
|
||||||
|
|
||||||
|
Modbus.Net.Siemens has two types of AddressMapping -- Modbus.Net way or Siemens way.
|
||||||
|
|
||||||
|
But Modbus.Net already decleared the type in AddressUnit, so all of the formatting ways will ignore the address type.
|
||||||
|
|
||||||
|
The following table shows the differences between them.
|
||||||
|
|
||||||
|
Standard Siemens Address | Modbus.Net Address Format | Siemens Address Format |
|
||||||
|
------------------------ | ------------------------- | ---------------------- |
|
||||||
|
I0.0 | I 0.0 | I0.0 |
|
||||||
|
IB0 | I 0 | I0 |
|
||||||
|
V10.5 | V 10.5 | V10.5 |
|
||||||
|
VB19 | V 19 | V19 |
|
||||||
|
DB1.DBD22 | DB1 22 | DB1.DB22 |
|
||||||
|
DB2.DB35.1 | DB2 35.1 | DB2.DB35.1 |
|
||||||
|
|
||||||
|
##<a name="coding"></a> Address Coding
|
||||||
|
|
||||||
|
The Coding of Modbus.Net.Siemens is the same as standard siemens protocal.
|
||||||
|
|
||||||
|
##<a name="subpos"></a> SubAddress Rules
|
||||||
|
|
||||||
|
SubAddress Rules is the same as standard siemens protocal.
|
||||||
|
|
||||||
|
Area length will always be 1.
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子设备
|
||||||
|
/// </summary>
|
||||||
public class SiemensMachine : BaseMachine
|
public class SiemensMachine : BaseMachine
|
||||||
{
|
{
|
||||||
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,
|
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Ppi协议
|
||||||
|
/// </summary>
|
||||||
public class SiemensPpiProtocal : SiemensProtocal
|
public class SiemensPpiProtocal : SiemensProtocal
|
||||||
{
|
{
|
||||||
private readonly string _com;
|
private readonly string _com;
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Ppi协议连接器
|
||||||
|
/// </summary>
|
||||||
public class SiemensPpiProtocalLinker : ComProtocalLinker
|
public class SiemensPpiProtocalLinker : ComProtocalLinker
|
||||||
{
|
{
|
||||||
public SiemensPpiProtocalLinker(string com)
|
public SiemensPpiProtocalLinker(string com)
|
||||||
|
|||||||
@@ -4,31 +4,101 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子数据类型
|
||||||
|
/// </summary>
|
||||||
public enum SiemensTypeCode : byte
|
public enum SiemensTypeCode : byte
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 布尔
|
||||||
|
/// </summary>
|
||||||
Bool = 0x01,
|
Bool = 0x01,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字节
|
||||||
|
/// </summary>
|
||||||
Byte = 0x02,
|
Byte = 0x02,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字
|
||||||
|
/// </summary>
|
||||||
Word = 0x03,
|
Word = 0x03,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 双字
|
||||||
|
/// </summary>
|
||||||
DWord = 0x04,
|
DWord = 0x04,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计数器
|
||||||
|
/// </summary>
|
||||||
C = 0x1E,
|
C = 0x1E,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计时器
|
||||||
|
/// </summary>
|
||||||
T = 0x1F,
|
T = 0x1F,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 高速计数器
|
||||||
|
/// </summary>
|
||||||
HC = 0x20
|
HC = 0x20
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子通讯报错信息
|
||||||
|
/// </summary>
|
||||||
public enum SiemensAccessResult : byte
|
public enum SiemensAccessResult : byte
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 无错误
|
||||||
|
/// </summary>
|
||||||
NoError = 0xFF,
|
NoError = 0xFF,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 硬件错误
|
||||||
|
/// </summary>
|
||||||
HardwareFault = 0x01,
|
HardwareFault = 0x01,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 非法对象访问(Area错误)
|
||||||
|
/// </summary>
|
||||||
IllegalObjectAccess = 0x03,
|
IllegalObjectAccess = 0x03,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 非法地址访问
|
||||||
|
/// </summary>
|
||||||
InvalidAddress = 0x05,
|
InvalidAddress = 0x05,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 不支持的数据类型
|
||||||
|
/// </summary>
|
||||||
DataTypeNotSupport = 0x06,
|
DataTypeNotSupport = 0x06,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 对象不存在或长度超出允许范围
|
||||||
|
/// </summary>
|
||||||
ObjNotExistOrLengthError = 0x0A
|
ObjNotExistOrLengthError = 0x0A
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子数据访问类型
|
||||||
|
/// </summary>
|
||||||
public enum SiemensDataType : byte
|
public enum SiemensDataType : byte
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 错误
|
||||||
|
/// </summary>
|
||||||
Error = 0x00,
|
Error = 0x00,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 比特位访问
|
||||||
|
/// </summary>
|
||||||
BitAccess = 0x03,
|
BitAccess = 0x03,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 一般访问
|
||||||
|
/// </summary>
|
||||||
OtherAccess = 0x04
|
OtherAccess = 0x04
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,6 +109,8 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region 串口连接建立
|
||||||
|
|
||||||
internal class ComCreateReferenceSiemensInputStruct : InputStruct
|
internal class ComCreateReferenceSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public ComCreateReferenceSiemensInputStruct(byte slaveAddress, byte masterAddress)
|
public ComCreateReferenceSiemensInputStruct(byte slaveAddress, byte masterAddress)
|
||||||
@@ -85,6 +157,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 以太网建立连接
|
||||||
|
|
||||||
internal class CreateReferenceSiemensInputStruct : InputStruct
|
internal class CreateReferenceSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public byte TdpuSize;
|
public byte TdpuSize;
|
||||||
@@ -167,6 +243,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 串口消息确认
|
||||||
|
|
||||||
public class ComConfirmMessageSiemensInputStruct : InputStruct
|
public class ComConfirmMessageSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public ComConfirmMessageSiemensInputStruct(byte slaveAddress, byte masterAddress)
|
public ComConfirmMessageSiemensInputStruct(byte slaveAddress, byte masterAddress)
|
||||||
@@ -206,6 +286,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 以太网连接确认
|
||||||
|
|
||||||
internal class EstablishAssociationSiemensInputStruct : InputStruct
|
internal class EstablishAssociationSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public EstablishAssociationSiemensInputStruct(ushort pduRef, ushort maxCalling, ushort maxCalled, ushort maxPdu)
|
public EstablishAssociationSiemensInputStruct(ushort pduRef, ushort maxCalling, ushort maxCalled, ushort maxPdu)
|
||||||
@@ -270,6 +354,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 读数据请求
|
||||||
|
|
||||||
public class ReadRequestSiemensInputStruct : InputStruct
|
public class ReadRequestSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public ReadRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef,
|
public ReadRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef,
|
||||||
@@ -362,6 +450,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 写数据请求
|
||||||
|
|
||||||
public class WriteRequestSiemensInputStruct : InputStruct
|
public class WriteRequestSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public WriteRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef, string startAddress,
|
public WriteRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef, string startAddress,
|
||||||
@@ -452,7 +544,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
#region 读时间请求
|
||||||
public class ReadTimeSiemensInputStruct : InputStruct
|
public class ReadTimeSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public ReadTimeSiemensInputStruct(ushort pduRef)
|
public ReadTimeSiemensInputStruct(ushort pduRef)
|
||||||
@@ -490,6 +585,10 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 写时间请求
|
||||||
|
|
||||||
public class WriteTimeSiemensInputStruct : InputStruct
|
public class WriteTimeSiemensInputStruct : InputStruct
|
||||||
{
|
{
|
||||||
public WriteTimeSiemensInputStruct(ushort pduRef, DateTime dateTime, TodClockStatus todClockStatus)
|
public WriteTimeSiemensInputStruct(ushort pduRef, DateTime dateTime, TodClockStatus todClockStatus)
|
||||||
@@ -528,8 +627,13 @@ namespace Modbus.Net.Siemens
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子通讯报错信息
|
||||||
|
/// </summary>
|
||||||
public class SiemensProtocalErrorException : ProtocalErrorException
|
public class SiemensProtocalErrorException : ProtocalErrorException
|
||||||
{
|
{
|
||||||
private static readonly Dictionary<int, string> ProtocalErrorDictionary = new Dictionary<int, string>
|
private static readonly Dictionary<int, string> ProtocalErrorDictionary = new Dictionary<int, string>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Tcp协议扩展
|
||||||
|
/// </summary>
|
||||||
public class SiemensTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
public class SiemensTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
||||||
{
|
{
|
||||||
public override byte[] BytesExtend(byte[] content)
|
public override byte[] BytesExtend(byte[] content)
|
||||||
@@ -19,6 +22,9 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Ppi协议扩展
|
||||||
|
/// </summary>
|
||||||
public class SiemensPpiProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
public class SiemensPpiProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
||||||
{
|
{
|
||||||
public override byte[] BytesExtend(byte[] content)
|
public override byte[] BytesExtend(byte[] content)
|
||||||
|
|||||||
@@ -2,17 +2,19 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Tcp协议
|
||||||
|
/// </summary>
|
||||||
public class SiemensTcpProtocal : SiemensProtocal
|
public class SiemensTcpProtocal : SiemensProtocal
|
||||||
{
|
{
|
||||||
private readonly ushort _taspSrc;
|
|
||||||
private readonly ushort _tsapDst;
|
|
||||||
private readonly ushort _maxCalling;
|
|
||||||
private readonly ushort _maxCalled;
|
|
||||||
private readonly ushort _maxPdu;
|
|
||||||
private readonly byte _tdpuSize;
|
|
||||||
|
|
||||||
private readonly string _ip;
|
private readonly string _ip;
|
||||||
|
private readonly ushort _maxCalled;
|
||||||
|
private readonly ushort _maxCalling;
|
||||||
|
private readonly ushort _maxPdu;
|
||||||
private readonly int _port;
|
private readonly int _port;
|
||||||
|
private readonly ushort _taspSrc;
|
||||||
|
private readonly byte _tdpuSize;
|
||||||
|
private readonly ushort _tsapDst;
|
||||||
private int _connectTryCount;
|
private int _connectTryCount;
|
||||||
|
|
||||||
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
|
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
|
||||||
@@ -87,6 +89,7 @@ namespace Modbus.Net.Siemens
|
|||||||
_connectTryCount = 0;
|
_connectTryCount = 0;
|
||||||
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);
|
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);
|
||||||
return
|
return
|
||||||
|
//先建立连接,然后建立设备的引用
|
||||||
await await
|
await await
|
||||||
ForceSendReceiveAsync(this[typeof (CreateReferenceSiemensProtocal)], inputStruct)
|
ForceSendReceiveAsync(this[typeof (CreateReferenceSiemensProtocal)], inputStruct)
|
||||||
.ContinueWith(async answer =>
|
.ContinueWith(async answer =>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Modbus.Net.Siemens
|
namespace Modbus.Net.Siemens
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子Tcp协议连接器
|
||||||
|
/// </summary>
|
||||||
public class SiemensTcpProtocalLinker : TcpProtocalLinker
|
public class SiemensTcpProtocalLinker : TcpProtocalLinker
|
||||||
{
|
{
|
||||||
public SiemensTcpProtocalLinker(string ip)
|
public SiemensTcpProtocalLinker(string ip)
|
||||||
|
|||||||
@@ -20,15 +20,17 @@ namespace Modbus.Net.Siemens
|
|||||||
S7_1500 = 5
|
S7_1500 = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子通讯Api入口
|
||||||
|
/// </summary>
|
||||||
public class SiemensUtility : BaseUtility
|
public class SiemensUtility : BaseUtility
|
||||||
{
|
{
|
||||||
private readonly byte _tdpuSize;
|
|
||||||
private readonly ushort _taspSrc;
|
|
||||||
private readonly ushort _tsapDst;
|
|
||||||
private readonly ushort _maxCalling;
|
|
||||||
private readonly ushort _maxCalled;
|
private readonly ushort _maxCalled;
|
||||||
|
private readonly ushort _maxCalling;
|
||||||
private readonly ushort _maxPdu;
|
private readonly ushort _maxPdu;
|
||||||
|
private readonly ushort _taspSrc;
|
||||||
|
private readonly byte _tdpuSize;
|
||||||
|
private readonly ushort _tsapDst;
|
||||||
|
|
||||||
private SiemensType _siemensType;
|
private SiemensType _siemensType;
|
||||||
|
|
||||||
@@ -119,6 +121,9 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子连接类型
|
||||||
|
/// </summary>
|
||||||
public SiemensType ConnectionType
|
public SiemensType ConnectionType
|
||||||
{
|
{
|
||||||
get { return _siemensType; }
|
get { return _siemensType; }
|
||||||
@@ -127,6 +132,7 @@ namespace Modbus.Net.Siemens
|
|||||||
_siemensType = value;
|
_siemensType = value;
|
||||||
switch (_siemensType)
|
switch (_siemensType)
|
||||||
{
|
{
|
||||||
|
//PPI
|
||||||
case SiemensType.Ppi:
|
case SiemensType.Ppi:
|
||||||
{
|
{
|
||||||
Wrapper = ConnectionString == null
|
Wrapper = ConnectionString == null
|
||||||
@@ -134,10 +140,12 @@ namespace Modbus.Net.Siemens
|
|||||||
: new SiemensPpiProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
: new SiemensPpiProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//MPI
|
||||||
//case SiemensType.Mpi:
|
//case SiemensType.Mpi:
|
||||||
// {
|
// {
|
||||||
// throw new NotImplementedException();
|
// throw new NotImplementedException();
|
||||||
// }
|
// }
|
||||||
|
//Ethenet
|
||||||
case SiemensType.Tcp:
|
case SiemensType.Tcp:
|
||||||
{
|
{
|
||||||
Wrapper = ConnectionString == null
|
Wrapper = ConnectionString == null
|
||||||
@@ -153,11 +161,21 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置连接类型
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="connectionType">需要设置的连接类型</param>
|
||||||
public override void SetConnectionType(int connectionType)
|
public override void SetConnectionType(int connectionType)
|
||||||
{
|
{
|
||||||
ConnectionType = (SiemensType) connectionType;
|
ConnectionType = (SiemensType) connectionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="startAddress">开始地址</param>
|
||||||
|
/// <param name="getByteCount">读取字节个数</param>
|
||||||
|
/// <returns>从设备中读取的数据</returns>
|
||||||
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
|
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -176,6 +194,12 @@ namespace Modbus.Net.Siemens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="startAddress">开始地址</param>
|
||||||
|
/// <param name="setContents">需要写入的数据</param>
|
||||||
|
/// <returns>写入是否成功</returns>
|
||||||
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
|
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Modbus.Net
|
namespace Modbus.Net
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 基础Api入口
|
||||||
|
/// </summary>
|
||||||
public abstract class BaseUtility
|
public abstract class BaseUtility
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user