/// <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 <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; lock (message_lock) { if (result.Count > 0) { message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(result))); message.Properties.Add("content-type", "application/edge-modbus-json"); } result.Clear(); } 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> /// This method is called whenever the module is sent a message from the EdgeHub. /// It just pipe the messages without any change. /// It prints all the incoming messages. /// </summary> static async Task <MessageResponse> PipeMessage(Message message, object userContext) { Console.WriteLine("Modbus Writer - Received command"); int counterValue = Interlocked.Increment(ref m_counter); 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; byte[] messageBytes = message.GetBytes(); string messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received message: {counterValue}, Body: [{messageString}]"); message.Properties.TryGetValue("command-type", out string cmdType); if (cmdType == "ModbusWrite") { // Get message body, containing the write target and value var messageBody = JsonConvert.DeserializeObject <ModbusInMessage>(messageString); if (messageBody != null) { Console.WriteLine($"Write device {messageBody.HwId}, " + $"address: {messageBody.Address}, value: {messageBody.Value}"); ModbusSlaveSession target = moduleHandle.GetSlaveSession(messageBody.HwId); if (target == null) { Console.WriteLine($"target \"{messageBody.HwId}\" not found!"); } else { await target.WriteCB(messageBody.UId, messageBody.Address, messageBody.Value); } } } return(MessageResponse.Completed); }
/// <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(); }
/// <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(); }