private async Task StartAsync(SessionsHandle sessionsHandle, int publishInterval) { Console.WriteLine($"Modbus sessions available: {sessionsHandle.ModbusSessionList.Count}"); foreach (var session in sessionsHandle.ModbusSessionList) { session.ProcessOperations(); } while (this.sessionsRun) { var result = sessionsHandle.CollectAndResetOutMessageFromSessions(); if (result.Count > 0) { var out_message = new ModbusOutMessage { PublishTimestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"), Content = result }; var message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(out_message))); message.Properties.Add("content-type", "application/edge-modbus-json"); await this.IotHubModuleClient.SendEventAsync("modbusOutput", message).ConfigureAwait(false); } await Task.Delay(publishInterval).ConfigureAwait(false); } sessionsHandle.Release(); }
/// <summary> /// Iterate through each Modbus session to poll data /// </summary> /// <param name="userContext"></param> /// <returns></returns> static async Task Start(object userContext) { var userContextValues = userContext as Tuple <DeviceClient, Slaves.ModuleHandle>; if (userContextValues == null) { throw new InvalidOperationException("UserContext doesn't contain " + "expected values"); } DeviceClient ioTHubModuleClient = userContextValues.Item1; Slaves.ModuleHandle moduleHandle = userContextValues.Item2; foreach (ModbusSlaveSession s in moduleHandle.ModbusSessionList) { s.ProcessOperations(); } while (m_run) { Message message = null; List <object> result = moduleHandle.CollectAndResetOutMessageFromSessions(); if (result.Count > 0) { ModbusOutMessage out_message = new ModbusOutMessage { PublishTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = result }; message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(out_message))); message.Properties.Add("content-type", "application/edge-modbus-json"); } if (message != null) { #if IOT_EDGE await ioTHubModuleClient.SendEventAsync("modbusOutput", message); #else await ioTHubModuleClient.SendEventAsync(message); #endif } if (!m_run) { break; } await Task.Delay(m_interval.PublishInterval); } moduleHandle.Release(); }
/// <summary> /// Iterate through each Modbus session to poll data /// </summary> /// <param name="userContext"></param> /// <returns></returns> static async Task Start(object userContext) { var userContextValues = userContext as Tuple <ModuleClient, Slaves.ModuleHandle>; if (userContextValues == null) { throw new InvalidOperationException("UserContext doesn't contain " + "expected values"); } ModuleClient ioTHubModuleClient = userContextValues.Item1; Slaves.ModuleHandle moduleHandle = userContextValues.Item2; if (moduleHandle.ModbusSessionList.Count == 0) { Console.WriteLine("No valid modbus session available!!"); } foreach (ModbusSlaveSession s in moduleHandle.ModbusSessionList) { if (s.config.Operations.Count == 0) { Console.WriteLine("No valid operation in modbus session available!!"); } else { s.ProcessOperations(); } } while (m_run) { Message message = null; switch (m_version.Version) { case "1": List <object> resultV1 = moduleHandle.CollectAndResetOutMessageFromSessionsV1(); if (resultV1.Count > 0) { message = new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(resultV1))); message.Properties.Add("content-type", "application/edge-modbus-json"); } break; default: List <object> result = moduleHandle.CollectAndResetOutMessageFromSessions(); if (result.Count > 0) { ModbusOutMessage out_message = new ModbusOutMessage { PublishTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = result }; message = new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(out_message))); message.Properties.Add("content-type", "application/edge-modbus-json"); } break; } if (message != null) { message.ContentType = "application/json"; message.ContentEncoding = "utf-8"; await ioTHubModuleClient.SendEventAsync("modbusOutput", message); } if (!m_run) { break; } await Task.Delay(m_interval.PublishInterval); } moduleHandle.Release(); }
public SignalTelemetry ProcessSignal(string ModbusMessageJson) { /// Check if we have all parameter values for calculations and ready for calculations if (ParameterNames == null || FunctionProcessor == null || String.IsNullOrEmpty(ModbusMessageJson)) { Console.WriteLine("Modbus message doesn't contain data"); return(null); } if (!IsRequiredParametersExist(ModbusMessageJson)) { Console.WriteLine("Modbus message doesn't have all required parameters: {0} to calculate {1} ", ModbusMessageJson, this.SignalName); return(null); } ModbusOutMessage message = JsonConvert.DeserializeObject <ModbusOutMessage>(ModbusMessageJson); if (message == null || message.Content == null) { Console.WriteLine("Can't read modbus message {0}.\n ModbusOutContent deserialization failed", ModbusMessageJson); } else { // Go throught all content sections foreach (ModbusOutContent content in message.Content) { int[] paramVal = ExtractParamValues(content); if (paramVal == null || paramVal.Length != this.ParameterNames.Length) { Console.WriteLine("Error extract param values for the message {0} to calculate {1} ", ModbusMessageJson, this.SignalName); return(null); } else { Parameter[] Parameters = new Parameter[paramVal.Length]; for (int i = 0; i < paramVal.Length; i++) { Parameters[i] = new Parameter(ParameterNames[i], typeof(int), paramVal[i]); Console.WriteLine("{0} : {1}", this.ParameterNames[i], paramVal[i]); } object result = FunctionProcessor.Eval(this.config.ValueFormula, Parameters); if (result != null) { Console.WriteLine("Result: {0}", result); return(new SignalTelemetry { HwId = content.HwId, SourceTimestamp = content.Data != null && content.Data.Count > 0 ? content.Data[0].SourceTimestamp : DateTime.UtcNow.ToString(), Name = this.SignalName, ValueType = this.config.ValueType, Value = result.ToString(), ValueUnit = this.config.ValueUnit }); } } } Console.WriteLine("Result calculation is empty for signal {0}", this.SignalName); } return(null); }
/// <summary> /// Iterate through each Modbus session to poll data /// </summary> /// <param name="userContext"></param> /// <returns></returns> static async Task Start(object userContext) { var userContextValues = userContext as Tuple <ModuleClient, Slaves.ModuleHandle>; if (userContextValues == null) { throw new InvalidOperationException("UserContext doesn't contain " + "expected values"); } ModuleClient ioTHubModuleClient = userContextValues.Item1; Slaves.ModuleHandle moduleHandle = userContextValues.Item2; if (moduleHandle.ModbusSessionList.Count == 0) { Console.WriteLine("No valid modbus session available!!"); } foreach (ModbusSlaveSession s in moduleHandle.ModbusSessionList) { if (s.config.Operations.Count == 0) { Console.WriteLine("No valid operation in modbus session available!!"); } else { s.ProcessOperations(); } } while (m_run) { Message message = null; switch (m_version.Version) { case "1": List <ModbusOutMessageV1> resultV1 = moduleHandle.CollectAndResetOutMessageFromSessionsV1(); if (resultV1.Count > 0) { message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(resultV1))); message.Properties.Add("content-type", "application/edge-modbus-json"); try { List <PowerBIMessage> tPowerBI = new List <PowerBIMessage>(); for (int i = 0; i < resultV1.Count; i++) { tPowerBI.Add(new PowerBIMessage(resultV1[i])); } byte[] PowerBIMessage = null; PowerBIMessage = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(tPowerBI)); // Push to PowerBI // https://api.powerbi.com/beta/8851b754-b8c8-4f63-a322-b07a007c09c9/datasets/877ac3e9-a640-4f3f-8f77-19c7423d80a7/rows?key=Jope%2FCvImXJIUzFtU1iIWHPizn8mW2z7LfgfXAjOyQfBi%2BTzTYg%2F5Xb6tLqIc1wu5LT%2FfZ4sjMHeIkD3vK29ew%3D%3D // Create a request for the URL. WebRequest request = WebRequest.Create("https://api.powerbi.com/beta/8851b754-b8c8-4f63-a322-b07a007c09c9/datasets/877ac3e9-a640-4f3f-8f77-19c7423d80a7/rows?key=Jope%2FCvImXJIUzFtU1iIWHPizn8mW2z7LfgfXAjOyQfBi%2BTzTYg%2F5Xb6tLqIc1wu5LT%2FfZ4sjMHeIkD3vK29ew%3D%3D"); request.Method = "POST"; request.ContentType = "application/json"; request.ContentLength = PowerBIMessage.Length; Stream s = request.GetRequestStream(); s.Write(PowerBIMessage, 0, PowerBIMessage.Length); s.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Console.WriteLine("PowerBI: ResponseCode: " + response.StatusCode.ToString()); response.Close(); } catch (System.Exception Ex) { Console.WriteLine("PowerBI: " + Ex.ToString()); } } break; default: List <object> result = moduleHandle.CollectAndResetOutMessageFromSessions(); if (result.Count > 0) { ModbusOutMessage out_message = new ModbusOutMessage { PublishTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = result }; message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(out_message))); message.Properties.Add("content-type", "application/edge-modbus-json"); } break; } if (message != null) { await ioTHubModuleClient.SendEventAsync("modbusOutput", message); } if (!m_run) { break; } await Task.Delay(m_interval.PublishInterval); } moduleHandle.Release(); }
public SignalTelemetry ProcessSignal(string ModbusMessageJson) { /// Check if we have all parameter values for calculations and ready for calculations if (ParameterNames == null || FunctionProcessor == null || String.IsNullOrEmpty(ModbusMessageJson)) { Console.WriteLine("Modbus message doesn't contain data"); return(null); } if (!IsRequiredParametersExist(ModbusMessageJson)) { Console.WriteLine("Modbus message doesn't have all required parameters: {0} to calculate {1} ", ModbusMessageJson, this.SignalName); return(null); } ModbusOutMessage message = JsonConvert.DeserializeObject <ModbusOutMessage>(ModbusMessageJson); if (message == null || message.Content == null) { Console.WriteLine("Can't read modbus message {0}.\n ModbusOutContent deserialization failed", ModbusMessageJson); } else { // Go throught all content sections foreach (ModbusOutContent content in message.Content) { int[] paramVal = ExtractParamValues(content); if (paramVal == null || paramVal.Length != this.ParameterNames.Length) { Console.WriteLine("Error extract param values for the message {0} to calculate {1} ", ModbusMessageJson, this.SignalName); return(null); } else { Parameter[] Parameters = new Parameter[paramVal.Length]; for (int i = 0; i < paramVal.Length; i++) { Parameters[i] = new Parameter(ParameterNames[i], typeof(int), paramVal[i]); Console.WriteLine("{0} : {1}", this.ParameterNames[i], paramVal[i]); } object result = FunctionProcessor.Eval(this.config.ValueFormula, Parameters); if (result != null) { Console.WriteLine("Result: {0}", result); return(new SignalTelemetry { Name = this.SignalName, ValueType = this.config.ValueType, Value = result.ToString(), ValueUnit = this.config.ValueUnit }); } } } Console.WriteLine("Result calculation is empty for signal {0}", this.SignalName); } // processor.ProcessSignalAsDouble(modbusMessage); // TODO Calculate signal value // TODO: support different return /* * if (ValueTypeDouble.Equals(this.config.ValueType, StringComparison.InvariantCultureIgnoreCase)) * { } * else{ Console.WriteLine($"Unknown signal type: {this.config.ValueType}"); }*/ return(null); }