//public static bool SendData(string RTUid, string address, string message, byte[] signature) //{ // // If RTU is not connected on an input tag, break the operation // if (connectedRTUs[RTUid] == null) // { // return false; // } // // Read public key // CspParameters csp = new CspParameters(); // RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); // try // { // rsa.FromXmlString(RTUkeys[RTUid]); // } catch // { // return false; // } // rsa.PersistKeyInCsp = true; // // Compute hash value // byte[] hashValue = ComputeHashValue(message); // if (VerifyMessage(hashValue, signature, rsa)) // { // RealTimeDriver.addresses[address] = double.Parse(message); // return true; // } // return false; //} public string ApplyOnSystem(string id) { csp.KeyContainerName = "KeyContainerName"; csp.Flags = CspProviderFlags.UseMachineKeyStore; rsa = new RSACryptoServiceProvider(csp); rsa.PersistKeyInCsp = true; string publicKey = rsa.ToXmlString(false); string retVal = ""; if (!RTUkeys.ContainsKey(id)) { if (RealTimeDriver.addresses.ContainsValue(-1)) { foreach (KeyValuePair <string, double> pair in RealTimeDriver.addresses) { if (pair.Value == -1) { retVal = pair.Key; RealTimeDriver.addresses[pair.Key] = 0; break; } } RTU rtu = new RTU(); rtu.rtuID = id; rtu.publicKey = publicKey; rtu.address = retVal; if (id.StartsWith("DI")) { rtu.type = true; } else { rtu.type = false; } rtus.Add(rtu); RTUkeys[id] = publicKey; connectedRTUs[id] = null; RTUIdAddressMap[id] = retVal; return(retVal); } else { retVal = "-1"; return(retVal); } } else { retVal = "0"; return(retVal); } }
public bool DeserializeScadaModel(string deserializationSource = "ScadaModel.xml") { // to do Database.IsConfigurationFinished = false; string message = string.Empty; string configurationName = deserializationSource; string source = Path.Combine(basePath, configurationName); if (Database.Instance.RTUs.Count != 0) { Database.Instance.RTUs.Clear(); } if (Database.Instance.ProcessVariablesName.Count != 0) { Database.Instance.ProcessVariablesName.Clear(); } try { XElement xdocument = XElement.Load(source); // access RTUS, DIGITALS, ANALOGS, COUNTERS from ScadaModel root IEnumerable <XElement> elements = xdocument.Elements(); var rtus = xdocument.Element("RTUS").Elements("RTU").ToList(); var digitals = (from dig in xdocument.Element("Digitals").Elements("Digital") orderby(int) dig.Element("RelativeAddress") select dig).ToList(); var analogs = (from dig in xdocument.Element("Analogs").Elements("Analog") orderby(int) dig.Element("RelativeAddress") select dig).ToList(); var counters = (from dig in xdocument.Element("Counters").Elements("Counter") orderby(int) dig.Element("RelativeAddress") select dig).ToList(); // parsing RTUS if (rtus.Count != 0) { foreach (var rtu in rtus) { RTU newRtu; string uniqueName = (string)rtu.Element("Name"); // if RTU with that name does not already exist? if (!dbContext.Database.RTUs.ContainsKey(uniqueName)) { byte address = (byte)(int)rtu.Element("Address"); bool freeSpaceForDigitals = (bool)rtu.Element("FreeSpaceForDigitals"); bool freeSpaceForAnalogs = (bool)rtu.Element("FreeSpaceForAnalogs"); string stringProtocol = (string)rtu.Element("Protocol"); IndustryProtocols protocol = (IndustryProtocols)Enum.Parse(typeof(IndustryProtocols), stringProtocol); int digOutStartAddr = (int)rtu.Element("DigOutStartAddr"); int digInStartAddr = (int)rtu.Element("DigInStartAddr"); int anaInStartAddr = (int)rtu.Element("AnaInStartAddr"); int anaOutStartAddr = (int)rtu.Element("AnaOutStartAddr"); int counterStartAddr = (int)rtu.Element("CounterStartAddr"); int digOutCount = (int)rtu.Element("NoDigOut"); int digInCount = (int)rtu.Element("NoDigIn"); int anaInCount = (int)rtu.Element("NoAnaIn"); int anaOutCount = (int)rtu.Element("NoAnaOut"); int counterCount = (int)rtu.Element("NoCnt"); ushort anaInRawMin = (ushort)(int)rtu.Element("AnaInRawMin"); ushort anaInRawMax = (ushort)(int)rtu.Element("AnaInRawMax"); ushort anaOutRawMin = (ushort)(int)rtu.Element("AnaOutRawMin"); ushort anaOutRawMax = (ushort)(int)rtu.Element("AnaOutRawMax"); if (digOutCount != digInCount) { message = string.Format("Invalid config: RTU - {0}: Value of DigOutCount must be the same as Value of DigInCount", uniqueName); Console.WriteLine(message); return(false); } newRtu = new RTU() { Name = uniqueName, Address = address, FreeSpaceForDigitals = freeSpaceForDigitals, FreeSpaceForAnalogs = freeSpaceForAnalogs, Protocol = protocol, DigOutStartAddr = digOutStartAddr, DigInStartAddr = digInStartAddr, AnaInStartAddr = anaInStartAddr, AnaOutStartAddr = anaOutStartAddr, CounterStartAddr = counterStartAddr, NoDigOut = digOutCount, NoDigIn = digInCount, NoAnaIn = anaInCount, NoAnaOut = anaOutCount, NoCnt = counterCount, AnaInRawMin = anaInRawMin, AnaInRawMax = anaInRawMax, AnaOutRawMin = anaOutRawMin, AnaOutRawMax = anaOutRawMax }; dbContext.AddRTU(newRtu); } else { // to do: bacati exception mozda message = string.Format("Invalid config: There is multiple RTUs with Name={0}!", uniqueName); Console.WriteLine(message); return(false); } } } else { message = string.Format("Invalid config: file must contain at least 1 RTU!"); Console.WriteLine(message); return(false); } //parsing DIGITALS. ORDER OF RELATIVE ADDRESSES IS IMPORTANT if (digitals.Count != 0) { foreach (var d in digitals) { string procContr = (string)d.Element("ProcContrName"); // does RTU exists? RTU associatedRtu; if ((associatedRtu = dbContext.GetRTUByName(procContr)) != null) { Digital newDigital = new Digital(); // SETTING ProcContrName newDigital.ProcContrName = procContr; string uniqueName = (string)d.Element("Name"); // variable with that name does not exists in db? if (!dbContext.Database.ProcessVariablesName.ContainsKey(uniqueName)) { // SETTING Name newDigital.Name = uniqueName; // SETTING State string stringCurrentState = (string)d.Element("State"); States stateValue = (States)Enum.Parse(typeof(States), stringCurrentState); newDigital.State = stateValue; // SETTING Command parameter - for initializing Simulator with last command string lastCommandString = (string)d.Element("Command"); CommandTypes command = (CommandTypes)Enum.Parse(typeof(CommandTypes), lastCommandString); // SETTING Class string digDevClass = (string)d.Element("Class"); DigitalDeviceClasses devClass = (DigitalDeviceClasses)Enum.Parse(typeof(DigitalDeviceClasses), digDevClass); newDigital.Class = devClass; // SETTING RelativeAddress ushort relativeAddress = (ushort)(int)d.Element("RelativeAddress"); newDigital.RelativeAddress = relativeAddress; var hasCommands = d.Element("ValidCommands"); if (hasCommands.HasElements) { var validCommands = hasCommands.Elements("Command").ToList(); // SETTING ValidCommands foreach (var xElementCommand in validCommands) { string stringCommand = (string)xElementCommand; CommandTypes validCommand = (CommandTypes)Enum.Parse(typeof(CommandTypes), stringCommand); newDigital.ValidCommands.Add(validCommand); } } else { message = string.Format("Invalid config: Variable = {0} does not contain commands.", uniqueName); Console.WriteLine(message); return(false); } var hasStates = d.Element("ValidStates"); if (hasStates.HasElements) { var validStates = hasStates.Elements("State").ToList(); // SETTING ValidStates foreach (var xElementState in validStates) { string stringState = (string)xElementState; States state = (States)Enum.Parse(typeof(States), stringState); newDigital.ValidStates.Add(state); } } else { message = string.Format("Invalid config: Variable = {0} does not contain states.", uniqueName); Console.WriteLine(message); return(false); } ushort calculatedRelativeAddres; if (associatedRtu.TryMap(newDigital, out calculatedRelativeAddres)) { if (relativeAddress == calculatedRelativeAddres) { if (associatedRtu.MapProcessVariable(newDigital)) { dbContext.AddProcessVariable(newDigital); } } else { message = string.Format("Invalid config: Variable = {0} RelativeAddress = {1} is not valid.", uniqueName, relativeAddress); Console.WriteLine(message); return(false); } } } else { message = string.Format("Invalid config: Name = {0} is not unique. Variable already exists", uniqueName); Console.WriteLine(message); return(false); } } else { message = string.Format("Invalid config: Parsing Digitals, ProcContrName = {0} does not exists.", procContr); Console.WriteLine(message); return(false); } } } // parsing ANALOGS. ORDER OF RELATIVE ADDRESSES IS IMPORTANT if (analogs.Count != 0) { foreach (var a in analogs) { string procContr = (string)a.Element("ProcContrName"); // does RTU exists? RTU associatedRtu; if ((associatedRtu = dbContext.GetRTUByName(procContr)) != null) { Analog newAnalog = new Analog(); // SETTING ProcContrName newAnalog.ProcContrName = procContr; string uniqueName = (string)a.Element("Name"); // variable with that name does not exists in db? if (!dbContext.Database.ProcessVariablesName.ContainsKey(uniqueName)) { // SETTING Name newAnalog.Name = uniqueName; // SETTING NumOfRegisters ushort numOfReg = (ushort)(int)a.Element("NumOfRegisters"); newAnalog.NumOfRegisters = numOfReg; // SETTING AcqValue ushort acqValue = (ushort)(float)a.Element("AcqValue"); newAnalog.AcqValue = acqValue; // SETTING CommValue ushort commValue = (ushort)(float)a.Element("CommValue"); newAnalog.CommValue = commValue; // SETTING MinValue float minValue = (float)a.Element("MinValue"); newAnalog.MinValue = minValue; // SETTING MaxValue float maxValue = (float)a.Element("MaxValue"); newAnalog.MaxValue = maxValue; // SETTING UnitSymbol string stringUnitSymbol = (string)a.Element("UnitSymbol"); UnitSymbol unitSymbolValue = (UnitSymbol)Enum.Parse(typeof(UnitSymbol), stringUnitSymbol, true); newAnalog.UnitSymbol = unitSymbolValue; // SETTING RelativeAddress ushort relativeAddress = (ushort)(int)a.Element("RelativeAddress"); newAnalog.RelativeAddress = relativeAddress; // svejedno je uzeli AnaInRawMin ili AnaOutRawMin -> isti su trenutni, // sve dok imamo samo Analog.cs a ne AnaIn.cs + AnaOut.cs (dok je kao za digital) newAnalog.RawBandLow = associatedRtu.AnaInRawMin; newAnalog.RawBandHigh = associatedRtu.AnaInRawMax; // SETTING RawAcqValue and RawCommValue AnalogProcessor.EGUToRawValue(newAnalog); ushort calculatedRelativeAddres; if (associatedRtu.TryMap(newAnalog, out calculatedRelativeAddres)) { if (relativeAddress == calculatedRelativeAddres) { if (associatedRtu.MapProcessVariable(newAnalog)) { dbContext.AddProcessVariable(newAnalog); } } else { message = string.Format("Invalid config: Analog Variable = {0} RelativeAddress = {1} is not valid.", uniqueName, relativeAddress); Console.WriteLine(message); return(false); } } } else { message = string.Format("Invalid config: Name = {0} is not unique. Analog Variable already exists", uniqueName); Console.WriteLine(message); return(false); } } else { message = string.Format("Invalid config: Parsing Analogs, ProcContrName = {0} does not exists.", procContr); Console.WriteLine(message); return(false); } } } // to do: if (counters.Count != 0) { } Console.WriteLine("Configuration passed successfully."); } catch (FileNotFoundException e) { Console.WriteLine(e.Message); return(false); } catch (XmlException e) { Console.WriteLine(e.Message); return(false); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); return(false); } Database.IsConfigurationFinished = true; return(true); }
/// <summary> /// Attempts to add the specified key and value. Return true if success, /// false if the key already exists. /// </summary> /// <param name="rtu"></param> public bool AddRTU(RTU rtu) { return(Database.Instance.RTUs.TryAdd(rtu.Name, rtu)); }
public static void Start(Action successAction, Action <string> faultAction) { mainTask = Task.Run(new Action(async() => { IndustrialBLL bll = new IndustrialBLL(); /// 获取串口配置信息 var si = bll.InitSerialInfo(); if (si.State) { SerialInfo = si.Data; } else { faultAction.Invoke(si.Message); return; } /// 初始化存储区 var sa = bll.InitStorageArea(); if (sa.State) { StorageList = sa.Data; } else { faultAction.Invoke(sa.Message); return; } /// 初始化设备变量集合以及警戒值 var dr = bll.InitDevices(); if (dr.State) { foreach (var item in dr.Data) { DeviceList.Add(item); } } else { faultAction.Invoke(dr.Message); return; } /// 初始化ModbusRTU串口通信 var rtu = RTU.GetInstance(SerialInfo); rtu.Responsed = new Action <int, List <byte> >(ParsingData); CommList.Add(rtu); /// 连接串口 if (rtu.Connection()) { successAction.Invoke(); while (isRunning) { int startAddress = 0; //int errorCount = 0; foreach (var item in StorageList) { if (item.Length > 100) { startAddress = item.StartAddress; int readCount = item.Length / 100; for (int i = 0; i < readCount; i++) { int readLength = i == readCount ? item.Length - 100 * i : 100; await rtu.Send(item.SlaveAddress, (byte)int.Parse(item.FuncCode), startAddress + 100 * i, readLength); } } if (item.Length % 100 > 0) { await rtu.Send(item.SlaveAddress, (byte)int.Parse(item.FuncCode), startAddress + 100 * (item.Length / 100), item.Length % 100); } //if (item.StorageName == "01 Coil Status(0x)") //{ //} //else if (item.StorageName == "03 Holding Register(4x)") //{ // List<byte> byteList = new List<byte>(); // //如果长度过大,分批次去读,最大不要超过125 // if (item.Length > 100) // { // startAddress = item.StartAddress; // int readCount = item.Length / 100; // for (int i = 0; i < readCount; i++) // { // int readLength = i == readCount ? item.Length - 100 * i : 100; // List<byte> resp = await rtu.RequestKeepReg(item.SlaveAddress, startAddress + 100 * i, readLength); // if (resp != null) // { // //errorCount = 0; // byteList.AddRange(resp); // } // //else // //{ // // errorCount += 1; // //} // } // } // if (item.Length % 100 > 0) // { // List<byte> resp = await rtu.RequestKeepReg(SerialInfo.Address, startAddress, item.Length % 100); // if (resp != null) // { // //errorCount = 0; // byteList.AddRange(resp); // } // //else // //{ // // errorCount += 1; // //} // } // //解析 // if (byteList.Count == item.Length * 2) // { // ParsingData4x(byteList); // } //} } } } else { faultAction.Invoke("程序无法启动,串口连接初始化失败!请检查设备是否连接正常。"); } })); }
public bool DeserializeScadaModel(string deserializationSource = "ScadaModel.xml") { // to do Database.IsConfigurationFinished = false; string message = string.Empty; string configurationName = deserializationSource; // string source = Path.Combine(basePath, configurationName); if (Database.Instance.RTUs.Count != 0) { Database.Instance.RTUs.Clear(); } if (Database.Instance.ProcessVariablesName.Count != 0) { Database.Instance.ProcessVariablesName.Clear(); } try { // XElement xdocument = XElement.Load(source); // access RTUS, DIGITALS, ANALOGS, COUNTERS from ScadaModel root // IEnumerable<XElement> elements = xdocument.Elements(); //var rtus = xdocument.Element("RTUS").Elements("RTU").ToList(); //var digitals = (from dig in xdocument.Element("Digitals").Elements("Digital") // orderby (int)dig.Element("RelativeAddress") // select dig).ToList(); //var analogs = (from dig in xdocument.Element("Analogs").Elements("Analog") // orderby (int)dig.Element("RelativeAddress") // select dig).ToList(); //var counters = (from dig in xdocument.Element("Counters").Elements("Counter") // orderby (int)dig.Element("RelativeAddress") // select dig).ToList(); List <ScadaDBClassLib.ModelData.RTU> rtus = new List <ScadaDBClassLib.ModelData.RTU>(); List <ScadaDBClassLib.ModelData.Digital> digitals = new List <ScadaDBClassLib.ModelData.Digital>(); List <ScadaDBClassLib.ModelData.Analog> analogs = new List <ScadaDBClassLib.ModelData.Analog>(); using (ScadaDBClassLib.ScadaCtxcs ctx = new ScadaDBClassLib.ScadaCtxcs()) { rtus = ctx.RTUs.ToList(); digitals = ctx.Digitals.ToList(); analogs = ctx.Analogs.ToList(); } // parsing RTUS if (rtus.Count != 0) { foreach (var rtu in rtus) { RTU newRtu; string uniqueName = (string)rtu.Name; // if RTU with that name does not already exist? if (!dbContext.Database.RTUs.ContainsKey(uniqueName)) { byte address = (byte)(int)rtu.Address; bool freeSpaceForDigitals = (bool)rtu.FreeSpaceForDigitals; bool freeSpaceForAnalogs = (bool)rtu.FreeSpaceForAnalogs; IndustryProtocols protocol = IndustryProtocols.ModbusTCP; int digOutStartAddr = (int)rtu.DigOutStartAddr; int digInStartAddr = (int)rtu.DigInStartAddr; int anaInStartAddr = (int)rtu.AnaInStartAddr; int anaOutStartAddr = (int)rtu.AnaOutStartAddr; int counterStartAddr = (int)rtu.CounterStartAddr; int digOutCount = (int)rtu.NoDigOut; int digInCount = (int)rtu.NoDigIn; int anaInCount = (int)rtu.NoAnaIn; int anaOutCount = (int)rtu.NoAnaOut; int counterCount = (int)rtu.NoCnt; ushort anaInRawMin = (ushort)(int)rtu.AnaInRawMin; ushort anaInRawMax = (ushort)(int)rtu.AnaInRawMax; ushort anaOutRawMin = (ushort)(int)rtu.AnaOutRawMin; ushort anaOutRawMax = (ushort)(int)rtu.AnaOutRawMax; if (digOutCount != digInCount) { message = string.Format("Invalid config: RTU - {0}: Value of DigOutCount must be the same as Value of DigInCount", uniqueName); Console.WriteLine(message); return(false); } newRtu = new RTU() { Name = uniqueName, Address = address, FreeSpaceForDigitals = freeSpaceForDigitals, FreeSpaceForAnalogs = freeSpaceForAnalogs, Protocol = protocol, DigOutStartAddr = digOutStartAddr, DigInStartAddr = digInStartAddr, AnaInStartAddr = anaInStartAddr, AnaOutStartAddr = anaOutStartAddr, CounterStartAddr = counterStartAddr, NoDigOut = digOutCount, NoDigIn = digInCount, NoAnaIn = anaInCount, NoAnaOut = anaOutCount, NoCnt = counterCount, AnaInRawMin = anaInRawMin, AnaInRawMax = anaInRawMax, AnaOutRawMin = anaOutRawMin, AnaOutRawMax = anaOutRawMax }; //using (ScadaContextDB ctx = new ScadaContextDB()) //{ // ctx.RTUs.Add(new ScadaCloud.Model.RTU // { // Name = uniqueName, // Address = address, // FreeSpaceForDigitals = freeSpaceForDigitals, // FreeSpaceForAnalogs = freeSpaceForAnalogs, // Protocol = protocol, // DigOutStartAddr = digOutStartAddr, // DigInStartAddr = digInStartAddr, // AnaInStartAddr = anaInStartAddr, // AnaOutStartAddr = anaOutStartAddr, // CounterStartAddr = counterStartAddr, // NoDigOut = digOutCount, // NoDigIn = digInCount, // NoAnaIn = anaInCount, // NoAnaOut = anaOutCount, // NoCnt = counterCount, // AnaInRawMin = anaInRawMin, // AnaInRawMax = anaInRawMax, // AnaOutRawMin = anaOutRawMin, // AnaOutRawMax = anaOutRawMax // }); // ctx.SaveChanges(); //} dbContext.AddRTU(newRtu); } else { // to do: bacati exception mozda message = string.Format("Invalid config: There is multiple RTUs with Name={0}!", uniqueName); Console.WriteLine(message); return(false); } } } else { message = string.Format("Invalid config: file must contain at least 1 RTU!"); Console.WriteLine(message); return(false); } //parsing DIGITALS. ORDER OF RELATIVE ADDRESSES IS IMPORTANT if (digitals.Count != 0) { foreach (var d in digitals) { string procContr = (string)d.ProcContrName; // does RTU exists? RTU associatedRtu; if ((associatedRtu = dbContext.GetRTUByName(procContr)) != null) { Digital newDigital = new Digital(); // SETTING ProcContrName newDigital.ProcContrName = procContr; string uniqueName = (string)d.Name; // variable with that name does not exists in db? if (!dbContext.Database.ProcessVariablesName.ContainsKey(uniqueName)) { // SETTING Name newDigital.Name = uniqueName; // SETTING State string stringCurrentState = (string)d.State; States stateValue = (States)Enum.Parse(typeof(States), stringCurrentState); newDigital.State = stateValue; // SETTING Command parameter - for initializing Simulator with last command string lastCommandString = (string)d.Command; CommandTypes command = (CommandTypes)Enum.Parse(typeof(CommandTypes), lastCommandString); // SETTING Class DigitalDeviceClasses devClass = DigitalDeviceClasses.SWITCH; newDigital.Class = devClass; // SETTING RelativeAddress ushort relativeAddress = (ushort)(int)d.RelativeAddress; newDigital.RelativeAddress = relativeAddress; // SETTING ValidCommands newDigital.ValidCommands.Add(CommandTypes.OPEN); newDigital.ValidCommands.Add(CommandTypes.CLOSE); newDigital.ValidStates.Add(States.CLOSED); newDigital.ValidStates.Add(States.OPENED); //using (ScadaContextDB ctx = new ScadaContextDB()) //{ // ctx.Digirals.Add(new ScadaCloud.Model.Digital // { // Name = uniqueName, // RelativeAddress = relativeAddress, // ProcContrName = procContr, // State = stringCurrentState, // Command = lastCommandString // }); // ctx.SaveChanges(); //} ushort calculatedRelativeAddres; if (associatedRtu.TryMap(newDigital, out calculatedRelativeAddres)) { if (relativeAddress == calculatedRelativeAddres) { if (associatedRtu.MapProcessVariable(newDigital)) { dbContext.AddProcessVariable(newDigital); } } else { message = string.Format("Invalid config: Variable = {0} RelativeAddress = {1} is not valid.", uniqueName, relativeAddress); Console.WriteLine(message); continue; } } } else { message = string.Format("Invalid config: Name = {0} is not unique. Variable already exists", uniqueName); Console.WriteLine(message); continue; } } else { message = string.Format("Invalid config: Parsing Digitals, ProcContrName = {0} does not exists.", procContr); Console.WriteLine(message); return(false); } } } // parsing ANALOGS. ORDER OF RELATIVE ADDRESSES IS IMPORTANT if (analogs.Count != 0) { foreach (var a in analogs) { string procContr = (string)a.ProcContrName; // does RTU exists? RTU associatedRtu; if ((associatedRtu = dbContext.GetRTUByName(procContr)) != null) { Analog newAnalog = new Analog(); // SETTING ProcContrName newAnalog.ProcContrName = procContr; string uniqueName = (string)a.Name; // variable with that name does not exists in db? if (!dbContext.Database.ProcessVariablesName.ContainsKey(uniqueName)) { // SETTING Name newAnalog.Name = uniqueName; // SETTING NumOfRegisters ushort numOfReg = (ushort)(int)a.NumOfRegisters; newAnalog.NumOfRegisters = numOfReg; // SETTING AcqValue ushort acqValue = (ushort)(float)a.AcqValue; newAnalog.AcqValue = acqValue; // SETTING CommValue ushort commValue = (ushort)(float)a.CommValue; newAnalog.CommValue = commValue; // SETTING MinValue float minValue = (float)a.MinValue; newAnalog.MinValue = minValue; // SETTING MaxValue float maxValue = (float)a.MaxValue; newAnalog.MaxValue = maxValue; // SETTING UnitSymbol string stringUnitSymbol = (string)a.UnitSymbol; UnitSymbol unitSymbolValue = (UnitSymbol)Enum.Parse(typeof(UnitSymbol), stringUnitSymbol, true); newAnalog.UnitSymbol = unitSymbolValue; // SETTING RelativeAddress ushort relativeAddress = (ushort)(int)a.RelativeAddress; newAnalog.RelativeAddress = relativeAddress; // svejedno je uzeli AnaInRawMin ili AnaOutRawMin -> isti su trenutni, // sve dok imamo samo Analog.cs a ne AnaIn.cs + AnaOut.cs (dok je kao za digital) newAnalog.RawBandLow = associatedRtu.AnaInRawMin; newAnalog.RawBandHigh = associatedRtu.AnaInRawMax; //using (ScadaContextDB ctx = new ScadaContextDB()) //{ // ctx.Analogs.Add(new ScadaCloud.Model.Analog // { // Name = uniqueName, // NumOfRegisters = numOfReg, // AcqValue = acqValue, // CommValue = commValue, // MaxValue = maxValue, // MinValue = minValue, // ProcContrName = procContr, // RelativeAddress = relativeAddress, // UnitSymbol = stringUnitSymbol // }); // ctx.SaveChanges(); //} // SETTING RawAcqValue and RawCommValue AnalogProcessor.EGUToRawValue(newAnalog); ushort calculatedRelativeAddres; if (associatedRtu.TryMap(newAnalog, out calculatedRelativeAddres)) { if (relativeAddress == calculatedRelativeAddres) { if (associatedRtu.MapProcessVariable(newAnalog)) { dbContext.AddProcessVariable(newAnalog); } } else { message = string.Format("Invalid config: Analog Variable = {0} RelativeAddress = {1} is not valid.", uniqueName, relativeAddress); Console.WriteLine(message); return(false); } } } else { message = string.Format("Invalid config: Name = {0} is not unique. Analog Variable already exists", uniqueName); Console.WriteLine(message); return(false); } } else { message = string.Format("Invalid config: Parsing Analogs, ProcContrName = {0} does not exists.", procContr); Console.WriteLine(message); return(false); } } } // to do: //if (counters.Count != 0) //{ //} Console.WriteLine("Configuration passed successfully."); } catch (FileNotFoundException e) { Console.WriteLine(e.Message); return(false); } catch (XmlException e) { Console.WriteLine(e.Message); return(false); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); return(false); } Database.IsConfigurationFinished = true; return(true); }
/// <summary> /// 对二进制串解报 /// </summary> public void UnpackReceive(byte[] bytetemp, int startAddr, int len) { try { //if (tvar is RTU) if (m_config_Modbus.m_ModbusType == "RTU") { if (bytetemp[2] + 5 == bytetemp.Length) { RTU vtemp = new RTU(bytetemp, len, startAddr,m_type); if ((vtemp.Responseread != null) && (vtemp.Responseread.ByteNum != 0)) { Console.WriteLine("RX: FC:{0} ", vtemp.Responseread.FC); try { sw = File.AppendText(logfile); sw.WriteLine(DateTime.Now.ToString() + " RX: FC:{0} ", vtemp.Responseread.FC); sw.Close(); } catch { } var datas = vtemp.GetData(); foreach (var data in datas) { //if (data.Addr == 0) continue; Console.WriteLine("RX: " + "addr:" + data.Addr.ToString() + " " + "data:" + data.Data.ToString()); try { sw = File.AppendText(logfile); sw.WriteLine("RX: " + "addr:" + data.Addr.ToString() + " " + "data:" + data.Data.ToString()); sw.Close(); } catch { } numInf numtemp = new numInf(); if (find.TryGetValue(data.Addr, out numtemp)) { numtemp.val = Convert.ToSingle(data.Data); numtemp.dtm = DateTime.Now; find.Remove(data.Addr); find.Add(data.Addr, numtemp); } else { numtemp.val = Convert.ToSingle(data.Data); numtemp.dtm = DateTime.Now; find.Add(data.Addr, numtemp); } } Console.WriteLine("\n"); try { sw = File.AppendText(logfile); sw.WriteLine("\r\n"); sw.Close(); } catch { } }//end if ((vtemp.Responseread != null) && (vtemp.Responseread.ByteNum != 0)) }//end if (bytetemp[2] + 5 == bytetemp.Length) }//end if (tvar is RTU) //if (tvar is ASCII) if (m_config_Modbus.m_ModbusType == "ASCII") { ASCII vtemp = new ASCII(bytetemp, len, startAddr, m_type); if ((vtemp.AscRtu.Responseread != null) && (vtemp.AscRtu.Responseread.ByteNum != 0)) { Console.WriteLine("RX: FC:{0} ", vtemp.AscRtu.Responseread.FC); try { sw = File.AppendText(logfile); sw.WriteLine(DateTime.Now.ToString() + " RX: FC:{0} ", vtemp.AscRtu.Responseread.FC); sw.Close(); } catch { } var datas = vtemp.AscRtu.GetData(); foreach (var data in datas) { //if (data.Addr == 0) continue; Console.WriteLine("RX: " + "addr:" + data.Addr.ToString() + " " + "data:" + data.Data.ToString()); try { sw = File.AppendText(logfile); sw.WriteLine("RX: " + "addr:" + data.Addr.ToString() + " " + "data:" + data.Data.ToString()); sw.Close(); } catch { } numInf numtemp = new numInf(); if (find.TryGetValue(data.Addr, out numtemp)) { numtemp.val = Convert.ToSingle(data.Data); numtemp.dtm = DateTime.Now; find.Remove(data.Addr); find.Add(data.Addr, numtemp); } else { numtemp.val = Convert.ToSingle(data.Data); numtemp.dtm = DateTime.Now; find.Add(data.Addr, numtemp); } } Console.WriteLine("\n"); try { sw = File.AppendText(logfile); sw.WriteLine("\r\n"); sw.Close(); } catch { } } }//if (tvar is ASCII) }// end try catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); //异常处理 throw ex; } }
/// <summary> /// 读取数据 /// </summary> public void RequestData(FunctionCode fc, int startAddr, int len) { if (len == 0) return; object obj; //if (tvar is RTU) if (m_config_Modbus.m_ModbusType == "RTU") { RTU temp = new RTU(m_config_Modbus.m_DeviceAddress, fc, startAddr, len); obj = temp; SendList.Enqueue(obj); } //if (tvar is ASCII) if (m_config_Modbus.m_ModbusType == "ASCII") { ASCII temp = new ASCII(m_config_Modbus.m_DeviceAddress, fc, startAddr, len); obj = temp; SendList.Enqueue(obj); } }
/// <summary> /// 对字符串解报 /// </summary> /// ycType= 1; int16; /// ycType= 2; int32; /// ycType= 3; float32; /// ycType= 4; double64; /// ycType= 5; Uint16; /// ycType= 6; int32_Inver; /// ycType= 7; float32_Inver; /// ycType= 8; double64_Inver; public static void UnPackString(string pm, string str,int type) { string stemp = str.ToLower().Replace(" ", ""); byte[] bytetemp = new byte[stemp.Length / 2]; for (int i = 0; i < stemp.Length / 2; i++) { string ss = stemp.Substring(2 * i, 2); bytetemp[i] = Convert.ToByte(ss, 16); } try { if ((pm == "TX")) { //T temp = new T(bytetemp); //if (temp.GetControl().PRM) //{ // Console.WriteLine("TX: FCB:{0} FCV:{1} FUNCTION:{2}", // temp.GetControl().FCB, temp.GetControl().FCV, temp.GetControl().function_1); //} //else //{ // Console.WriteLine("RX: ACD:{0} DFC:{1} FUNCTION:{2}", // temp.GetControl().ACD, temp.GetControl().DFC, temp.GetControl().function_0); //} } if ((pm == "RX")) { //if (tvar is RTU) //if (m_config_Modbus.m_ModbusType == "RTU" ) { RTU vtemp = new RTU(bytetemp, 0,type); if ((vtemp.Responseread != null) && (vtemp.Responseread.ByteNum != 0)) { Console.WriteLine("RX: FC:{0} ", vtemp.Responseread.FC); Console.WriteLine("RX: {0}", vtemp.ToString()); var datas = vtemp.GetData(); foreach (var data in datas) { //if (data.Addr == 0) continue; Console.WriteLine("RX: " + "addr:" + data.Addr.ToString() + " " + "data:" + data.Data.ToString()); } Console.WriteLine("\r\n"); } } } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } }
public static void Start(Action successAction, Action <string> faultAction) { mainTask = Task.Run(async() => { IndustrialBLL bll = new IndustrialBLL(); //获取串口配置信息 var si = bll.InitSerialInfo(); if (si.State) { SerialInfo = si.Data; } else { faultAction(si.Message); return; } //获取存储区信息 var sa = bll.InitStorageArea(); if (sa.State) { StorageList = sa.Data; } else { faultAction(sa.Message); return; } //初始化设备变量及警戒值 var dr = bll.InitDevices(); if (dr.State) { DeviceList = dr.Data; } else { faultAction(dr.Message); return; } rtuInstance = RTU.GetInstance(SerialInfo); if (rtuInstance.Connection()) { successAction(); int startAddr = 0; while (isRunning) { foreach (var item in StorageList) { if (item.Length > 100) { startAddr = item.StartAddress; int readCount = item.Length / 100; for (int i = 0; i < readCount; i++) { int readLen = i == readCount ? item.Length - 100 * i : 100; await rtuInstance.Send(item.SlaveAdress, (byte)Convert.ToInt32(item.FuncCode), startAddr + 100 * (item.Length / 100), item.Length % 100); } } if (item.Length % 100 > 0) { await rtuInstance.Send(item.SlaveAdress, (byte)Convert.ToInt32(item.FuncCode), startAddr + 100 * (item.Length / 100), item.Length % 100); } } } } else { faultAction("串口连接初始化失败,请检查设备!"); } }); }