Esempio n. 1
0
File: Rtu.cs Progetto: AKllX/Gemini
        public Rtu(int id, string name, IPEndpoint clientAddress, IPEndpoint hostAddres, ushort localDNP3Addres, ushort remoteDNP3Address,
            Dictionary<int, int> bins, Dictionary<int, int> analogs, Dictionary<int, int> counters, DatabaseTemplate dt, GeminiMap gmap)
        {
            Id = id;
            Name = name;
            //Considerando uma RTU por Canal
            if (Core.LoggingEnabled)
            {
                Channel = Core.DNP3Manager.AddTCPServer(name, LogLevels.ALL, ServerAcceptMode.CloseExisting, hostAddres.address, hostAddres.port, ChannelListener.Print());
            }
            else
            {
                Channel = Core.DNP3Manager.AddTCPServer(name, LogLevels.NONE, ServerAcceptMode.CloseExisting, hostAddres.address, hostAddres.port, ChannelListener.Print());
            }

            //Configuração Padrão de RTU é Outstation
            Config = new OutstationStackConfig
            {
                databaseTemplate = dt
            };
            Config.link.remoteAddr = remoteDNP3Address;
            Config.link.localAddr = localDNP3Addres;
            DNP3ToSNMPBinaries = bins;
            DNP3ToSNMPAnalogs = analogs;
            DNP3ToSNMPCounters = counters;
            Outstation = Channel.AddOutstation(name, RejectingCommandHandler.Instance, DefaultOutstationApplication.Instance, Config);
            Outstation.Enable();
            geminiMap = gmap;

            Target = new SnmpTarget(clientAddress.address, clientAddress.port, Core.Settings.SNMPTimeout, Core.Settings.SNMPRetry);

            foreach (KeyValuePair<int, int> map in DNP3ToSNMPBinaries)
            {
                Target.InsertObject(Core.OidLibrary.GetLabelFromId(map.Value), Core.OidLibrary.GetOidFromId(map.Value));
            }

            foreach (KeyValuePair<int, int> map in DNP3ToSNMPAnalogs)
            {
                Target.InsertObject(Core.OidLibrary.GetLabelFromId(map.Value), Core.OidLibrary.GetOidFromId(map.Value));
            }

            foreach (KeyValuePair<int, int> map in DNP3ToSNMPCounters)
            {
                Target.InsertObject(Core.OidLibrary.GetLabelFromId(map.Value), Core.OidLibrary.GetOidFromId(map.Value));
            }

            MonitorThread = new Timer(new TimerCallback(Update), null, TimeSpan.FromMilliseconds(10), TimeSpan.FromSeconds(Core.Settings.GatewayPoolingTime));
        }
Esempio n. 2
0
        void LoadRtu(DataRow equipmentRow)
        {
            Rtu    rtu = null;
            int    id, snmpPort, type, dnp3port, rtuDnp3Addres, scadaDnp3Address;
            string name, clientAddress;
            ushort maxBin = 0, maxAnalog = 0, maxCounter = 0;

            DatabaseTemplate      databaseTemplate;
            GeminiMap             GMap = new GeminiMap();
            DataTable             DNP3Map = null, Bin = null, Analog = null, Counter = null;
            Dictionary <int, int> bins = new Dictionary <int, int>();
            Dictionary <int, int> analogs = new Dictionary <int, int>();
            Dictionary <int, int> counters = new Dictionary <int, int>();

            id               = Convert.ToInt32(equipmentRow["id"]);
            snmpPort         = Convert.ToInt32(equipmentRow["snmp_port"]);
            type             = Convert.ToInt32(equipmentRow["type"]);
            dnp3port         = Convert.ToInt32(equipmentRow["dnp3_port"]);
            name             = Convert.ToString(equipmentRow["nome"]);
            clientAddress    = Convert.ToString(equipmentRow["ip"]);
            rtuDnp3Addres    = Convert.ToInt32(equipmentRow["dnp3_address"]);
            scadaDnp3Address = Convert.ToInt32(equipmentRow["dnp3_master_address"]);

            using (IQueryAdapter adapter = Core.DatabaseManager.GetQueryReactor())
            {
                adapter.SetQuery("SELECT * FROM dnp3_map WHERE equipment_type_id = @tid;");
                adapter.AddParameter("tid", type);
                DNP3Map = adapter.getTable();
            }

            try
            {
                foreach (DataRow dr in DNP3Map.Rows)
                {
                    GMap.Add(new GeminiPoint
                    {
                        Id            = Convert.ToInt32(dr["id"]),
                        EquipmentType = Convert.ToInt32(dr["equipment_type_id"]),
                        PointType     = Convert.ToChar(dr["point_type"]),
                        Class         = Convert.ToInt32(dr["class"]),
                        SnmpObjectId  = Convert.ToInt32(dr["snmp_object_id"]),
                        Dnp3Addr      = ushort.Parse(dr["dnp3_addr"].ToString())
                    });
                }

                Bin     = DNP3Map.AsEnumerable().Where(r => r.Field <String>("point_type") == "D").CopyToDataTable();
                Analog  = DNP3Map.AsEnumerable().Where(r => r.Field <String>("point_type") == "A").CopyToDataTable();
                Counter = DNP3Map.AsEnumerable().Where(r => r.Field <String>("point_type") == "C").CopyToDataTable();
            }
            catch (Exception) { }

            foreach (DataRow dr in Bin.Rows)
            {
                maxBin = (ushort)Math.Max(maxBin, Convert.ToInt32(dr["dnp3_addr"]));
            }
            foreach (DataRow dr in Analog.Rows)
            {
                maxAnalog = (ushort)Math.Max(maxAnalog, Convert.ToInt32(dr["dnp3_addr"]));
            }
            foreach (DataRow dr in Bin.Rows)
            {
                maxCounter = (ushort)Math.Max(maxCounter, Convert.ToInt32(dr["dnp3_addr"]));
            }

            maxBin++;
            maxAnalog++;
            maxCounter++;

            databaseTemplate = new DatabaseTemplate(maxBin, 0, maxAnalog, maxCounter, 0, 0, 0, 0, 0);

            if (Bin != null)
            {
                foreach (DataRow dr in Bin.Rows)
                {
                    int        cls      = Convert.ToInt32(dr["class"]);
                    int        dnp3Addr = Convert.ToInt32(dr["dnp3_addr"]);
                    PointClass ptCls;
                    switch (cls)
                    {
                    case 0:
                        ptCls = PointClass.Class0;
                        break;

                    case 1:
                        ptCls = PointClass.Class1;
                        break;

                    case 2:
                        ptCls = PointClass.Class2;
                        break;

                    case 3:
                        ptCls = PointClass.Class3;
                        break;

                    default:
                        ptCls = PointClass.Class0;
                        break;
                    }
                    databaseTemplate.binaries[dnp3Addr].clazz = ptCls;
                    bins.Add(dnp3Addr, Convert.ToInt32(dr["snmp_object_id"]));
                }
            }

            if (Analog != null)
            {
                foreach (DataRow dr in Analog.Rows)
                {
                    int        cls      = Convert.ToInt32(dr["class"]);
                    int        dnp3Addr = Convert.ToInt32(dr["dnp3_addr"]);
                    PointClass ptCls;
                    switch (cls)
                    {
                    case 0:
                        ptCls = PointClass.Class0;
                        break;

                    case 1:
                        ptCls = PointClass.Class1;
                        break;

                    case 2:
                        ptCls = PointClass.Class2;
                        break;

                    case 3:
                        ptCls = PointClass.Class3;
                        break;

                    default:
                        ptCls = PointClass.Class0;
                        break;
                    }
                    databaseTemplate.analogs[dnp3Addr].clazz = ptCls;
                    analogs.Add(dnp3Addr, Convert.ToInt32(dr["snmp_object_id"]));
                }
            }

            if (Counter != null)
            {
                foreach (DataRow dr in Counter.Rows)
                {
                    int        cls      = Convert.ToInt32(dr["class"]);
                    int        dnp3Addr = Convert.ToInt32(dr["dnp3_addr"]);
                    PointClass ptCls;
                    switch (cls)
                    {
                    case 0:
                        ptCls = PointClass.Class0;
                        break;

                    case 1:
                        ptCls = PointClass.Class1;
                        break;

                    case 2:
                        ptCls = PointClass.Class2;
                        break;

                    case 3:
                        ptCls = PointClass.Class3;
                        break;

                    default:
                        ptCls = PointClass.Class0;
                        break;
                    }
                    databaseTemplate.counters[dnp3Addr].clazz = ptCls;
                    counters.Add(dnp3Addr, Convert.ToInt32(dr["snmp_object_id"]));
                }
            }

            rtu = new Rtu(id, name, new IPEndpoint(clientAddress, (ushort)snmpPort), new IPEndpoint("0.0.0.0", (ushort)dnp3port), (ushort)rtuDnp3Addres, (ushort)scadaDnp3Address, bins, analogs, counters, databaseTemplate, GMap);
        }