Beispiel #1
0
        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();
        }
Beispiel #2
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();
        }
Beispiel #3
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();
        }
        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);
        }
Beispiel #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();
        }
        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);
        }