Example #1
0
        //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);
            }
        }
Example #2
0
        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("程序无法启动,串口连接初始化失败!请检查设备是否连接正常。");
                }
            }));
        }
Example #5
0
        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);
        }
Example #6
0
        /// <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;
            }
        }
Example #7
0
 /// <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);
     }
 }
Example #8
0
        /// <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("串口连接初始化失败,请检查设备!");
                }
            });
        }