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)); }
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); }