// private static void OnAnalogAddedEvent(object sender, EventArgs e) private void OnAnalogAddedEvent(object sender, EventArgs e) { Console.WriteLine("OnAnalogEventAdded started"); Analog analog = (Analog)e; IORequestBlock iorb = new IORequestBlock() { RequestType = RequestType.SEND, ProcessControllerName = analog.ProcContrName }; DBContext dbContext = new DBContext(); RTU rtu; if ((rtu = dbContext.GetRTUByName(analog.ProcContrName)) != null) { iorb.ReqAddress = (ushort)rtu.GetCommandAddress(analog); bool shouldCommand = false; switch (rtu.Protocol) { case IndustryProtocols.ModbusTCP: ModbusHandler mdbHandler = new ModbusHandler(); mdbHandler.Header = new ModbusApplicationHeader() { TransactionId = 0, Length = 5, ProtocolId = (ushort)IndustryProtocols.ModbusTCP, DeviceAddress = rtu.Address }; mdbHandler.Request = new WriteRequest() { StartAddr = (ushort)rtu.GetCommandAddress(analog) }; if (shouldCommand = AnalogProcessor.InitialWorkPointAnalog(analog)) { mdbHandler.Request.FunCode = FunctionCodes.WriteSingleRegister; AnalogProcessor.EGUToRawValue(analog); ((WriteRequest)mdbHandler.Request).Value = analog.RawCommValue; iorb.SendBuff = mdbHandler.PackData(); iorb.SendMsgLength = iorb.SendBuff.Length; Console.WriteLine(BitConverter.ToString(iorb.SendBuff, 0, 12)); IORequests.EnqueueRequest(iorb); analog.IsInit = true; } break; } } Console.WriteLine("OnAnalogEventAdded finished"); }
/// <summary> /// Send Commands to simulator, to make its state consistent with RTDB /// </summary> public void InitializeSimulator() { List <ProcessVariable> pvs = dbContext.GetAllProcessVariables(); if (pvs.Count != 0) { foreach (ProcessVariable pv in pvs) { IORequestBlock iorb = new IORequestBlock() { RequestType = RequestType.SEND, ProcessControllerName = pv.ProcContrName }; RTU rtu; if ((rtu = dbContext.GetRTUByName(pv.ProcContrName)) != null) { iorb.ReqAddress = (ushort)rtu.GetCommandAddress(pv); bool shouldCommand = false; switch (rtu.Protocol) { case IndustryProtocols.ModbusTCP: ModbusHandler mdbHandler = new ModbusHandler(); mdbHandler.Header = new ModbusApplicationHeader() { TransactionId = 0, Length = 5, ProtocolId = (ushort)IndustryProtocols.ModbusTCP, DeviceAddress = rtu.Address }; mdbHandler.Request = new WriteRequest() { StartAddr = (ushort)rtu.GetCommandAddress(pv) }; switch (pv.Type) { // initialy, on simulator all digitals are set to 0 -> closed state case VariableTypes.DIGITAL: Digital digital = (Digital)pv; CommandTypes comm; if (shouldCommand = CommandValidator.InitialCommandingForDigital(digital, out comm)) { mdbHandler.Request.FunCode = FunctionCodes.WriteSingleCoil; ((WriteRequest)mdbHandler.Request).Value = (ushort)comm; } break; case VariableTypes.ANALOG: Analog analog = (Analog)pv; if (shouldCommand = AnalogProcessor.InitialWorkPointAnalog(analog)) { mdbHandler.Request.FunCode = FunctionCodes.WriteSingleRegister; ((WriteRequest)mdbHandler.Request).Value = (ushort)analog.RawCommValue; } analog.IsInit = true; break; case VariableTypes.COUNTER: Counter counter = (Counter)pv; break; } if (shouldCommand) { iorb.SendBuff = mdbHandler.PackData(); iorb.SendMsgLength = iorb.SendBuff.Length; if (pv.Name == "MEAS_AN_1") { Console.WriteLine(BitConverter.ToString(iorb.SendBuff, 0, 12)); } } break; } if (shouldCommand) { IORequests.EnqueueRequest(iorb); } } else { // izbrisati omdah te procesne varijable sa rtu-om tog imena? Console.WriteLine("Invalid config: ProcContrName = {0} does not exists.", pv.ProcContrName); continue; } } } }