2017-06-14 update 2 Fix OPC Regex tags combine bug.

This commit is contained in:
parallelbgls
2017-06-14 17:52:44 +08:00
parent 49b1cdafe6
commit 67c0694741
17 changed files with 71 additions and 85 deletions

View File

@@ -53,7 +53,7 @@ namespace Modbus.Net.OPC
var strings = TagGeter(Machine, findAddress); var strings = TagGeter(Machine, findAddress);
var ans = ""; var ans = "";
for (var i = 0; i < strings.Length; i++) for (var i = 0; i < strings.Length; i++)
ans += strings[i].Trim().Replace(" ", "") + Seperator; ans += strings[i].Trim().Replace(" ", "") + '\r';
ans = ans.Substring(0, ans.Length - 1); ans = ans.Substring(0, ans.Length - 1);
return ans; return ans;
} }

View File

@@ -115,7 +115,7 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Tag of a node /// Tag of a node
/// </summary> /// </summary>
public string Tag { get; set; } public string[] Tag { get; set; }
/// <summary> /// <summary>
/// Tag splitter of a node /// Tag splitter of a node

View File

@@ -19,7 +19,7 @@ namespace Modbus.Net.OPC.FBox
IEnumerable<AddressUnit> getAddresses, bool keepConnect) IEnumerable<AddressUnit> getAddresses, bool keepConnect)
: base( : base(
ConfigurationManager.AppSettings["FBoxOpcDaHost"] ?? "opcda://localhost/FBoxOpcServer", getAddresses, ConfigurationManager.AppSettings["FBoxOpcDaHost"] ?? "opcda://localhost/FBoxOpcServer", getAddresses,
keepConnect) keepConnect, true)
{ {
LocalSequence = localSequence; LocalSequence = localSequence;
LinkerName = linkerName; LinkerName = linkerName;

View File

@@ -5,7 +5,7 @@
<AssemblyName>Modbus.Net.OPC</AssemblyName> <AssemblyName>Modbus.Net.OPC</AssemblyName>
<RootNamespace>Modbus.Net.OPC</RootNamespace> <RootNamespace>Modbus.Net.OPC</RootNamespace>
<PackageId>Modbus.Net.OPC</PackageId> <PackageId>Modbus.Net.OPC</PackageId>
<Version>1.3.9-beta1</Version> <Version>1.3.9-beta2</Version>
<Authors>Chris L.(Luo Sheng)</Authors> <Authors>Chris L.(Luo Sheng)</Authors>
<Company>Hangzhou Delian IoT Science Technology Co.,Ltd.</Company> <Company>Hangzhou Delian IoT Science Technology Co.,Ltd.</Company>
<Description>Modbus.Net OPC Implementation</Description> <Description>Modbus.Net OPC Implementation</Description>

View File

@@ -24,13 +24,20 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
protected IClientExtend Client; protected IClientExtend Client;
/// <summary>
/// 是否开启正则匹配
/// </summary>
protected bool RegexOn { get; set; }
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">服务端url</param> /// <param name="host">服务端url</param>
protected OpcConnector(string host) /// <param name="isRegexOn">是否开启正则匹配</param>
protected OpcConnector(string host, bool isRegexOn)
{ {
ConnectionToken = host; ConnectionToken = host;
RegexOn = isRegexOn;
} }
/// <summary> /// <summary>
@@ -95,47 +102,6 @@ namespace Modbus.Net.OPC
return AsyncHelper.RunSync(() => SendMsgAsync(message)); return AsyncHelper.RunSync(() => SendMsgAsync(message));
} }
/// <summary>
/// 根据括号折叠已经打开的标签
/// </summary>
/// <param name="tagSplitList">已经打开的标签</param>
/// <param name="splitChar">分割符</param>
/// <param name="startChar">开始字符</param>
/// <param name="endChar">结束字符</param>
private void FoldWith(List<string> tagSplitList, char splitChar, char startChar, char endChar)
{
for (var i = 0; i < tagSplitList.Count; i++)
if (tagSplitList[i].Count(ch => ch == startChar) > tagSplitList[i].Count(ch => ch == endChar))
for (var j = i + 1; j < tagSplitList.Count; j++)
if (tagSplitList[j].Contains(endChar))
{
for (var k = i + 1; k <= j; k++)
{
tagSplitList[i] += splitChar + tagSplitList[i + 1];
tagSplitList.RemoveAt(i + 1);
}
i--;
break;
}
}
/// <summary>
/// 根据分隔符切分标签
/// </summary>
/// <param name="tag">标签</param>
/// <param name="split">分隔符</param>
/// <returns>分割后的标签</returns>
private string[] SplitTag(string tag, char split)
{
var tagSplitList = tag.Split(split).ToList();
FoldWith(tagSplitList, split, '(', ')');
FoldWith(tagSplitList, split, '[', ']');
FoldWith(tagSplitList, split, '{', '}');
return tagSplitList.ToArray();
}
/// <summary> /// <summary>
/// 带返回发送数据 /// 带返回发送数据
/// </summary> /// </summary>
@@ -149,9 +115,8 @@ namespace Modbus.Net.OPC
{ {
var split = message.Split; var split = message.Split;
var tag = message.Tag; var tag = message.Tag;
var tagSplit = SplitTag(tag, split);
var rootDirectory = await Client.ExploreFolderAsync(""); var rootDirectory = await Client.ExploreFolderAsync("");
var answerTag = await SearchTag(tagSplit, split, 0, rootDirectory); var answerTag = await SearchTag(tag, split, 0, rootDirectory);
if (answerTag != null) if (answerTag != null)
{ {
var result = await Client.ReadAsync<object>(answerTag); var result = await Client.ReadAsync<object>(answerTag);
@@ -175,8 +140,7 @@ namespace Modbus.Net.OPC
var value = message.SetValue; var value = message.SetValue;
var rootDirectory = await Client.ExploreFolderAsync(""); var rootDirectory = await Client.ExploreFolderAsync("");
var tagSplit = SplitTag(tag, split); var answerTag = await SearchTag(tag, split, 0, rootDirectory);
var answerTag = await SearchTag(tagSplit, split, 0, rootDirectory);
if (answerTag != null) if (answerTag != null)
{ {
try try
@@ -227,7 +191,7 @@ namespace Modbus.Net.OPC
foreach (var node in nodes) foreach (var node in nodes)
{ {
var currentTag = node.Tag.Substring(node.Tag.LastIndexOf(split) + 1); var currentTag = node.Tag.Substring(node.Tag.LastIndexOf(split) + 1);
if (Regex.IsMatch(currentTag, tags[deep])) if (RegexOn && Regex.IsMatch(currentTag, tags[deep]) || !RegexOn && currentTag == tags[deep])
{ {
if (deep == tags.Length - 1) return node.Tag; if (deep == tags.Length - 1) return node.Tag;
var subDirectories = await Client.ExploreFolderAsync(node.Tag); var subDirectories = await Client.ExploreFolderAsync(node.Tag);

View File

@@ -17,7 +17,8 @@ namespace Modbus.Net.OPC
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc DA 服务地址</param> /// <param name="host">Opc DA 服务地址</param>
protected OpcDaConnector(string host) : base(host) /// <param name="isRegexOn">是否开启正则匹配</param>
protected OpcDaConnector(string host, bool isRegexOn) : base(host, isRegexOn)
{ {
Client = new MyDaClient(new Uri(ConnectionToken)); Client = new MyDaClient(new Uri(ConnectionToken));
} }
@@ -26,12 +27,13 @@ namespace Modbus.Net.OPC
/// 根据服务地址生成DA单例 /// 根据服务地址生成DA单例
/// </summary> /// </summary>
/// <param name="host">Opc DA 服务地址</param> /// <param name="host">Opc DA 服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param>
/// <returns>Opc DA 连接器实例</returns> /// <returns>Opc DA 连接器实例</returns>
public static OpcDaConnector Instance(string host) public static OpcDaConnector Instance(string host, bool isRegexOn)
{ {
if (!_instances.ContainsKey(host)) if (!_instances.ContainsKey(host))
{ {
var connector = new OpcDaConnector(host); var connector = new OpcDaConnector(host, isRegexOn);
_instances.Add(host, connector); _instances.Add(host, connector);
} }
return _instances[host]; return _instances[host];

View File

@@ -17,10 +17,11 @@ namespace Modbus.Net.OPC
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
/// <param name="getAddresses">需要读写的数据</param> /// <param name="getAddresses">需要读写的数据</param>
/// <param name="keepConnect">是否保持连接</param> /// <param name="keepConnect">是否保持连接</param>
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit<TUnitKey>> getAddresses, bool keepConnect) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit<TUnitKey>> getAddresses, bool keepConnect, bool isRegexOn = false)
: base(getAddresses, keepConnect) : base(getAddresses, keepConnect)
{ {
BaseUtility = new OpcDaUtility(connectionString); BaseUtility = new OpcDaUtility(connectionString, isRegexOn);
((OpcUtility) BaseUtility).GetSeperator += ((OpcUtility) BaseUtility).GetSeperator +=
() => ((AddressFormaterOpc<TKey, TUnitKey>) AddressFormater).Seperator; () => ((AddressFormaterOpc<TKey, TUnitKey>) AddressFormater).Seperator;
} }
@@ -47,10 +48,11 @@ namespace Modbus.Net.OPC
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
/// <param name="getAddresses">需要读写的数据</param> /// <param name="getAddresses">需要读写的数据</param>
/// <param name="keepConnect">是否保持连接</param> /// <param name="keepConnect">是否保持连接</param>
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect, bool isRegexOn = false)
: base(getAddresses, keepConnect) : base(getAddresses, keepConnect)
{ {
BaseUtility = new OpcDaUtility(connectionString); BaseUtility = new OpcDaUtility(connectionString, isRegexOn);
((OpcUtility) BaseUtility).GetSeperator += ((OpcUtility) BaseUtility).GetSeperator +=
() => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator; () => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator;
} }

View File

@@ -9,13 +9,17 @@ namespace Modbus.Net.OPC
{ {
private readonly string _host; private readonly string _host;
private readonly bool _isRegexOn;
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc DA服务地址</param> /// <param name="host">Opc DA服务地址</param>
public OpcDaProtocal(string host) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocal(string host, bool isRegexOn)
{ {
_host = host; _host = host;
_isRegexOn = isRegexOn;
} }
/// <summary> /// <summary>
@@ -33,7 +37,7 @@ namespace Modbus.Net.OPC
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
ProtocalLinker = new OpcDaProtocalLinker(_host); ProtocalLinker = new OpcDaProtocalLinker(_host, _isRegexOn);
if (!await ProtocalLinker.ConnectAsync()) if (!await ProtocalLinker.ConnectAsync())
return false; return false;
return true; return true;

View File

@@ -10,7 +10,8 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
public OpcDaProtocalLinker() : this(ConfigurationManager.AppSettings["OpcDaHost"]) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocalLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcDaHost"], isRegexOn)
{ {
} }
@@ -18,9 +19,10 @@ namespace Modbus.Net.OPC
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc DA服务地址</param> /// <param name="host">Opc DA服务地址</param>
public OpcDaProtocalLinker(string host) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocalLinker(string host, bool isRegexOn)
{ {
BaseConnector = OpcDaConnector.Instance(host); BaseConnector = OpcDaConnector.Instance(host, isRegexOn);
} }
} }
} }

View File

@@ -9,9 +9,10 @@
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
public OpcDaUtility(string connectionString) : base(connectionString) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaUtility(string connectionString, bool isRegexOn = false) : base(connectionString)
{ {
Wrapper = new OpcDaProtocal(ConnectionString); Wrapper = new OpcDaProtocal(ConnectionString, isRegexOn);
} }
} }
} }

View File

@@ -25,7 +25,7 @@
/// </summary> /// </summary>
/// <param name="tag">标签</param> /// <param name="tag">标签</param>
/// <param name="split">分隔符</param> /// <param name="split">分隔符</param>
public ReadRequestOpcInputStruct(string tag, char split) public ReadRequestOpcInputStruct(string[] tag, char split)
{ {
Tag = tag; Tag = tag;
Split = split; Split = split;
@@ -34,7 +34,7 @@
/// <summary> /// <summary>
/// 标签 /// 标签
/// </summary> /// </summary>
public string Tag { get; } public string[] Tag { get; }
/// <summary> /// <summary>
/// 分隔符 /// 分隔符
@@ -111,7 +111,7 @@
/// <param name="tag">标签</param> /// <param name="tag">标签</param>
/// <param name="split">分隔符</param> /// <param name="split">分隔符</param>
/// <param name="setValue">写入的数据</param> /// <param name="setValue">写入的数据</param>
public WriteRequestOpcInputStruct(string tag, char split, object setValue) public WriteRequestOpcInputStruct(string[] tag, char split, object setValue)
{ {
Tag = tag; Tag = tag;
Split = split; Split = split;
@@ -121,7 +121,7 @@
/// <summary> /// <summary>
/// 标签 /// 标签
/// </summary> /// </summary>
public string Tag { get; } public string[] Tag { get; }
/// <summary> /// <summary>
/// 分隔符 /// 分隔符

View File

@@ -17,7 +17,8 @@ namespace Modbus.Net.OPC
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc UA 服务地址</param> /// <param name="host">Opc UA 服务地址</param>
protected OpcUaConnector(string host) : base(host) /// <param name="isRegexOn">是否开启正则匹配</param>
protected OpcUaConnector(string host, bool isRegexOn) : base(host, isRegexOn)
{ {
Client = new MyUaClient(new Uri(ConnectionToken)); Client = new MyUaClient(new Uri(ConnectionToken));
} }
@@ -26,12 +27,13 @@ namespace Modbus.Net.OPC
/// 根据地址获取UA连接器单例 /// 根据地址获取UA连接器单例
/// </summary> /// </summary>
/// <param name="host">Opc UA服务地址</param> /// <param name="host">Opc UA服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param>
/// <returns>OPC UA实例</returns> /// <returns>OPC UA实例</returns>
public static OpcUaConnector Instance(string host) public static OpcUaConnector Instance(string host, bool isRegexOn)
{ {
if (!_instances.ContainsKey(host)) if (!_instances.ContainsKey(host))
{ {
var connector = new OpcUaConnector(host); var connector = new OpcUaConnector(host, isRegexOn);
_instances.Add(host, connector); _instances.Add(host, connector);
} }
return _instances[host]; return _instances[host];

View File

@@ -17,10 +17,11 @@ namespace Modbus.Net.OPC
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
/// <param name="getAddresses">需要读写的数据</param> /// <param name="getAddresses">需要读写的数据</param>
/// <param name="keepConnect">是否保持连接</param> /// <param name="keepConnect">是否保持连接</param>
public OpcUaMachine(string connectionString, IEnumerable<AddressUnit<TUnitKey>> getAddresses, bool keepConnect) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaMachine(string connectionString, IEnumerable<AddressUnit<TUnitKey>> getAddresses, bool keepConnect, bool isRegexOn = false)
: base(getAddresses, keepConnect) : base(getAddresses, keepConnect)
{ {
BaseUtility = new OpcUaUtility(connectionString); BaseUtility = new OpcUaUtility(connectionString, isRegexOn);
((OpcUtility) BaseUtility).GetSeperator += ((OpcUtility) BaseUtility).GetSeperator +=
() => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator; () => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator;
} }
@@ -47,10 +48,11 @@ namespace Modbus.Net.OPC
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
/// <param name="getAddresses">需要读写的数据</param> /// <param name="getAddresses">需要读写的数据</param>
/// <param name="keepConnect">是否保持连接</param> /// <param name="keepConnect">是否保持连接</param>
public OpcUaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect, bool isRegexOn = false)
: base(getAddresses, keepConnect) : base(getAddresses, keepConnect)
{ {
BaseUtility = new OpcUaUtility(connectionString); BaseUtility = new OpcUaUtility(connectionString, isRegexOn);
((OpcUtility) BaseUtility).GetSeperator += ((OpcUtility) BaseUtility).GetSeperator +=
() => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator; () => ((AddressFormaterOpc<string, string>) AddressFormater).Seperator;
} }

View File

@@ -9,13 +9,17 @@ namespace Modbus.Net.OPC
{ {
private readonly string _host; private readonly string _host;
private readonly bool _isRegexOn;
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc UA服务地址</param> /// <param name="host">Opc UA服务地址</param>
public OpcUaProtocal(string host) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocal(string host, bool isRegexOn)
{ {
_host = host; _host = host;
_isRegexOn = isRegexOn;
} }
/// <summary> /// <summary>
@@ -33,7 +37,7 @@ namespace Modbus.Net.OPC
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
ProtocalLinker = new OpcUaProtocalLinker(_host); ProtocalLinker = new OpcUaProtocalLinker(_host, _isRegexOn);
if (!await ProtocalLinker.ConnectAsync()) return false; if (!await ProtocalLinker.ConnectAsync()) return false;
return true; return true;
} }

View File

@@ -10,7 +10,8 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
public OpcUaProtocalLinker() : this(ConfigurationManager.AppSettings["OpcUaHost"]) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocalLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcUaHost"], isRegexOn)
{ {
} }
@@ -18,9 +19,10 @@ namespace Modbus.Net.OPC
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="host">Opc UA服务地址</param> /// <param name="host">Opc UA服务地址</param>
public OpcUaProtocalLinker(string host) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocalLinker(string host, bool isRegexOn)
{ {
BaseConnector = OpcUaConnector.Instance(host); BaseConnector = OpcUaConnector.Instance(host, isRegexOn);
} }
} }
} }

View File

@@ -9,9 +9,10 @@
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="connectionString">连接地址</param> /// <param name="connectionString">连接地址</param>
public OpcUaUtility(string connectionString) : base(connectionString) /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaUtility(string connectionString, bool isRegexOn = false) : base(connectionString)
{ {
Wrapper = new OpcUaProtocal(ConnectionString); Wrapper = new OpcUaProtocal(ConnectionString, isRegexOn);
} }
} }
} }

View File

@@ -55,7 +55,7 @@ namespace Modbus.Net.OPC
try try
{ {
var split = GetSeperator?.Invoke() ?? '/'; var split = GetSeperator?.Invoke() ?? '/';
var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress, split); var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress.Split('\r'), split);
var readRequestOpcOutputStruct = var readRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync<ReadRequestOpcOutputStruct>(Wrapper[typeof(ReadRequestOpcProtocal)], Wrapper.SendReceiveAsync<ReadRequestOpcOutputStruct>(Wrapper[typeof(ReadRequestOpcProtocal)],
@@ -80,7 +80,7 @@ namespace Modbus.Net.OPC
try try
{ {
var split = GetSeperator?.Invoke() ?? '/'; var split = GetSeperator?.Invoke() ?? '/';
var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress, split, setContents[0]); var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]);
var writeRequestOpcOutputStruct = var writeRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync<WriteRequestOpcOutputStruct>(Wrapper[typeof(WriteRequestOpcProtocal)], Wrapper.SendReceiveAsync<WriteRequestOpcOutputStruct>(Wrapper[typeof(WriteRequestOpcProtocal)],