Exemple #1
0
        /// <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);
        }
Exemple #4
0
        /// <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();
        }
Exemple #5
0
        /// <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();
        }