diff --git a/Modbus.Net/ModBus.Net/FBox/FBoxMachine.cs b/Modbus.Net/ModBus.Net/FBox/FBoxMachine.cs index 984643b..cb1a840 100644 --- a/Modbus.Net/ModBus.Net/FBox/FBoxMachine.cs +++ b/Modbus.Net/ModBus.Net/FBox/FBoxMachine.cs @@ -5,11 +5,11 @@ namespace ModBus.Net.FBox { public class FBoxMachine : BaseMachine { - public FBoxMachine(FBoxType fBoxType, string connectionString, SignalRSigninMsg msg, IEnumerable getAddresses, bool keepConnect) : base(getAddresses, keepConnect) + public FBoxMachine(FBoxType fBoxType, string connectionString, string localSequence, SignalRSigninMsg msg, IEnumerable getAddresses, bool keepConnect) : base(getAddresses, keepConnect) { AddressFormater = new AddressFormaterFBox(); AddressCombiner = new AddressCombinerFBox(); - BaseUtility = new FBoxUtility(fBoxType, connectionString, CommunicateAddresses, msg); + BaseUtility = new FBoxUtility(fBoxType, connectionString, localSequence, CommunicateAddresses, msg); } } } diff --git a/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocal.cs b/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocal.cs index 317eb2c..1f4b20e 100644 --- a/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocal.cs +++ b/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocal.cs @@ -8,9 +8,9 @@ namespace ModBus.Net.FBox { public class FBoxSignalRProtocal : FBoxProtocal { - public FBoxSignalRProtocal(string machineId, SignalRSigninMsg msg) + public FBoxSignalRProtocal(string machineId, string localSequence, SignalRSigninMsg msg) { - ProtocalLinker = new FBoxSignalRProtocalLinker(machineId, msg); + ProtocalLinker = new FBoxSignalRProtocalLinker(machineId, localSequence, msg); } } } diff --git a/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocalLinker.cs b/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocalLinker.cs index d4706b6..9b041c1 100644 --- a/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocalLinker.cs +++ b/Modbus.Net/ModBus.Net/FBox/FBoxSignalRProtocalLinker.cs @@ -8,7 +8,7 @@ namespace ModBus.Net.FBox { public class FBoxSignalRProtocalLinker : SignalRProtocalLinker { - public FBoxSignalRProtocalLinker(string machineId, SignalRSigninMsg msg) : base(machineId, msg) + public FBoxSignalRProtocalLinker(string machineId, string localSequence, SignalRSigninMsg msg) : base(machineId, localSequence, msg) { } diff --git a/Modbus.Net/ModBus.Net/FBox/FBoxUtility.cs b/Modbus.Net/ModBus.Net/FBox/FBoxUtility.cs index 3d79526..faa8759 100644 --- a/Modbus.Net/ModBus.Net/FBox/FBoxUtility.cs +++ b/Modbus.Net/ModBus.Net/FBox/FBoxUtility.cs @@ -17,6 +17,8 @@ namespace ModBus.Net.FBox private FBoxType _fboxType; private SignalRSigninMsg SigninMsg { get; set; } + public string LocalSequence { get; set; } + protected IEnumerable CommunicationUnits { get; set; } public FBoxType ConnectionType { @@ -35,16 +37,17 @@ namespace ModBus.Net.FBox } case FBoxType.CommunicationTagSync: { - Wrapper = new FBoxSignalRProtocal(ConnectionString, SigninMsg); + Wrapper = new FBoxSignalRProtocal(ConnectionString, LocalSequence, SigninMsg); break; } } } } - public FBoxUtility(FBoxType fBoxType, string connectionString, IEnumerable communicationUnits, SignalRSigninMsg msg) + public FBoxUtility(FBoxType fBoxType, string connectionString, string localSequence, IEnumerable communicationUnits, SignalRSigninMsg msg) { ConnectionString = connectionString; + LocalSequence = localSequence; CommunicationUnits = communicationUnits.AsEnumerable(); SigninMsg = msg; diff --git a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs index 626515a..19b0828 100644 --- a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs +++ b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs @@ -36,9 +36,25 @@ namespace ModBus.Net.FBox private static Dictionary _groupNameBoxUid; private static Dictionary> _machineData; private static Dictionary> _machineDataType; + private static Dictionary _boxUidBoxNo; public override string ConnectionToken { get; } + private string MachineId + { + get + { + return ConnectionToken.Split(',')[0]; + } + } + + private string LocalSequence { + get + { + return ConnectionToken.Split(',')[1]; + } + } + private static AsyncLock _lock = new AsyncLock(); private static bool _retokenFlag; @@ -77,12 +93,12 @@ namespace ModBus.Net.FBox } } - public SignalRConnector(string machineId, SignalRSigninMsg msg) + public SignalRConnector(string machineId, string localSequence, SignalRSigninMsg msg) { RetokenFlag = false; Constants.SignalRServer = msg.SignalRServer; System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; - ConnectionToken = machineId; + ConnectionToken = machineId + "," + localSequence; if (_oauth2 == null) { _httpClient = new Dictionary(); @@ -96,9 +112,10 @@ namespace ModBus.Net.FBox _groupNameUid = new Dictionary(); _groupNameBoxUid = new Dictionary(); _boxUidDataGroups = new Dictionary>(); + _boxUidBoxNo = new Dictionary(); } Msg = msg; - } + } public override bool Connect() { @@ -149,13 +166,13 @@ namespace ModBus.Net.FBox _connected = false; Console.WriteLine("SignalR Connected failed"); return false; - } + } } } catch (Exception e) { if (_oauth2.ContainsKey(Msg)) - { + { _oauth2.Remove(Msg); } Console.WriteLine("SignalR Connected failed"); @@ -198,6 +215,8 @@ namespace ModBus.Net.FBox var baseUrl = box.Box.CommServer.ApiBaseUrl; var signalrUrl = box.Box.CommServer.SignalRUrl; var boxUid = box.Box.Uid; + var boxNo = box.Box.BoxNo; + //var currentStat = box.Box.ConnectionState; var client2 = new HttpClient @@ -217,6 +236,7 @@ namespace ModBus.Net.FBox List dataGroups = JsonConvert.DeserializeObject>(response); _boxUidDataGroups.Add(boxUid, dataGroups); _boxUidSessionId.Add(boxUid, sessionId); + _boxUidBoxNo.Add(boxUid, boxNo); var hubConnection = new HubConnection(signalrUrl); _hubConnections.Add(boxUid, hubConnection); @@ -234,6 +254,8 @@ namespace ModBus.Net.FBox { Console.WriteLine($"Box session {boxSessionId} return at {DateTime.Now}"); var localBoxUid = _boxUidSessionId.FirstOrDefault(p => p.Value == boxSessionId).Key; + var localBoxNo = _boxUidBoxNo[localBoxUid]; + foreach (var value in values) { if (value.Status != 0) return; @@ -245,14 +267,14 @@ namespace ModBus.Net.FBox { if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id)) { - if (!_machineData.ContainsKey(dataGroupInner.Name)) + if (!_machineData.ContainsKey(localBoxNo + "," + dataGroupInner.Name)) { - _machineData.Add(dataGroupInner.Name, + _machineData.Add(localBoxNo + "," + dataGroupInner.Name, new Dictionary()); } - if (_machineData[dataGroupInner.Name] == null) + if (_machineData[localBoxNo + "," + dataGroupInner.Name] == null) { - _machineData[dataGroupInner.Name] = + _machineData[localBoxNo + "," + dataGroupInner.Name] = new Dictionary(); } @@ -263,15 +285,15 @@ namespace ModBus.Net.FBox if (value.Value.HasValue && dMonEntry != null) { if ( - _machineData[dataGroupInner.Name].ContainsKey( + _machineData[localBoxNo + "," + dataGroupInner.Name].ContainsKey( dMonEntry.Desc)) { - _machineData[dataGroupInner.Name][dMonEntry.Desc] = + _machineData[localBoxNo + "," + dataGroupInner.Name][dMonEntry.Desc] = value.Value.Value; } else { - _machineData[dataGroupInner.Name].Add(dMonEntry.Desc, + _machineData[localBoxNo + "," + dataGroupInner.Name].Add(dMonEntry.Desc, value.Value.Value); } } @@ -300,18 +322,19 @@ namespace ModBus.Net.FBox _boxUidSessionId[getBoxUid] = sessionId; } + var localBoxNo = _boxUidBoxNo[getBoxUid]; var localDataGroups = _boxUidDataGroups[getBoxUid]; lock (_connectionTokenState) { foreach (var localDataGroup in localDataGroups) { - if (!_connectionTokenState.ContainsKey(localDataGroup.Name)) + if (!_connectionTokenState.ContainsKey(localBoxNo + "," + localDataGroup.Name)) { - _connectionTokenState.Add(localDataGroup.Name, newStatus); + _connectionTokenState.Add(localBoxNo + "," + localDataGroup.Name, newStatus); } else { - _connectionTokenState[localDataGroup.Name] = newStatus; + _connectionTokenState[localBoxNo + "," + localDataGroup.Name] = newStatus; } } } @@ -334,22 +357,6 @@ namespace ModBus.Net.FBox "dmon/group/" + localDataGroup.Uid + "/start", null); } } - else - { - //foreach (var localDataGroup in localDataGroups) - //{ - //lock (_machineData) - //{ - //if (_machineData.ContainsKey(localDataGroup.Name)) - //{ - //_machineData.Remove(localDataGroup.Name); - //} - //await - //_httpClient2[getBoxUid].PostAsync( - //"dmon/group/" + localDataGroup.Uid + "/stop", null); - //} - //} - } } } }); @@ -360,26 +367,26 @@ namespace ModBus.Net.FBox { try { - string getBoxUid; - lock (_boxUidSessionId) - { - getBoxUid = - _boxUidSessionId.FirstOrDefault( - p => p.Value == int.Parse(hubConnection.Headers["X-FBox-Session"])).Key; - } - if (hubConnection.State != ConnectionState.Connected) - { + string getBoxUid; + lock (_boxUidSessionId) + { + getBoxUid = + _boxUidSessionId.FirstOrDefault( + p => p.Value == int.Parse(hubConnection.Headers["X-FBox-Session"])).Key; + } + if (hubConnection.State != ConnectionState.Connected) + { - await hubConnection.Start(); - if (IsConnected) + await hubConnection.Start(); + if (IsConnected) + { + var localDataGroups = _boxUidDataGroups[getBoxUid]; + foreach (var localDataGroup in localDataGroups) { - var localDataGroups = _boxUidDataGroups[getBoxUid]; - foreach (var localDataGroup in localDataGroups) - { - await - _httpClient2[getBoxUid].PostAsync( - "dmon/group/" + localDataGroup.Uid + "/start", null); - } + await + _httpClient2[getBoxUid].PostAsync( + "dmon/group/" + localDataGroup.Uid + "/start", null); + } } } } @@ -417,7 +424,7 @@ namespace ModBus.Net.FBox } } _connected = false; - } + } catch { _connected = false; @@ -433,26 +440,26 @@ namespace ModBus.Net.FBox var groupUid = dataGroup.Uid; var groupName = dataGroup.Name; - if (groupName != "(Default)" && groupName != "默认组" && !_connectionTokenState.ContainsKey(groupName)) + if ((groupName != "(Default)" || groupName != "默认组") && !_connectionTokenState.ContainsKey(boxNo + "," + groupName)) { - _connectionTokenState.Add(groupName, 1); + _connectionTokenState.Add(boxNo + "," + groupName, 1); } - if (groupName != "(Default)" && groupName != "默认组" && !_groupNameUid.ContainsKey(groupName)) + if ((groupName != "(Default)" || groupName != "默认组") && !_groupNameUid.ContainsKey(boxNo + "," + groupName)) { - _groupNameUid.Add(groupName, groupUid); + _groupNameUid.Add(boxNo + "," + groupName, groupUid); } - if (groupName != "(Default)" && groupName != "默认组" && !_groupNameBoxUid.ContainsKey(groupName)) + if ((groupName != "(Default)" || groupName != "默认组") && !_groupNameBoxUid.ContainsKey(boxNo + "," + groupName)) { - _groupNameBoxUid.Add(groupName, boxUid); + _groupNameBoxUid.Add(boxNo + "," + groupName, boxUid); } if (groupName != "(Default)" && groupName != "默认组" && !_httpClient2.ContainsKey(boxUid)) { _httpClient2.Add(boxUid, client2); } - if (!_machineDataType.ContainsKey(groupName)) + if (!_machineDataType.ContainsKey(boxNo + "," + groupName)) { - _machineDataType.Add(groupName, new Dictionary()); + _machineDataType.Add(boxNo + "," + groupName, new Dictionary()); } foreach (var dMonEntry in dataGroup.DMonEntries) { @@ -538,13 +545,13 @@ namespace ModBus.Net.FBox } } - if (!_machineDataType[groupName].ContainsKey(dMonEntry.Desc)) + if (!_machineDataType[boxNo + "," + groupName].ContainsKey(dMonEntry.Desc)) { - _machineDataType[groupName].Add(dMonEntry.Desc, type); + _machineDataType[boxNo + "," + groupName].Add(dMonEntry.Desc, type); } else { - _machineDataType[groupName][dMonEntry.Desc] = type; + _machineDataType[boxNo + "," + groupName][dMonEntry.Desc] = type; } } } diff --git a/Modbus.Net/ModBus.Net/FBox/SignalRProtocalLinker.cs b/Modbus.Net/ModBus.Net/FBox/SignalRProtocalLinker.cs index a0a0424..888bb9b 100644 --- a/Modbus.Net/ModBus.Net/FBox/SignalRProtocalLinker.cs +++ b/Modbus.Net/ModBus.Net/FBox/SignalRProtocalLinker.cs @@ -8,9 +8,9 @@ namespace ModBus.Net.FBox { public class SignalRProtocalLinker : ProtocalLinker { - protected SignalRProtocalLinker(string machineId, SignalRSigninMsg msg) + protected SignalRProtocalLinker(string machineId, string localSequence, SignalRSigninMsg msg) { - _baseConnector = new SignalRConnector(machineId, msg); + _baseConnector = new SignalRConnector(machineId, localSequence, msg); } } }