订阅Mqtt代理并使用Windows Forms Application写入OPC服务器

问题描述

我正在尝试订阅MQTT代理并使用Windows窗体应用程序将其写入OPC服务器。但是我有一些问题,我总是遇到一个异常“ 对象引用未设置为对象的实例。” 一切都很好,但是当我到达写入opc服务器avec订阅获取mqtt消息时我有一个例外。下面是代码,这是WCF服务中的一种方法。 公共无效StartTransferFromMQTTtoOPC() {

        try
        {
            // Check if at least one transfer if configured
            string jmsg;
            while (TransferHelper.SubscribedBlockingCollection.TryTake(out jmsg))
            {
                // Check if any transfer is configured.
                if (ExportedMQTTTransfers == null || ExportedMQTTTransfers.archList == null ||
                    ExportedMQTTTransfers.archList.Count == 0)
                    return;

                // check which Mqtt Transfer is responsible for that topic
                var message = JsonConvert.DeserializeObject<TopicStruct>(jmsg);
                var mqqtmessage = message.Message;
                var transfer = ExportedMQTTTransfers.archList.Find(x => x.Topic == message.TopicName);
                // get Group @R_634_4045@ion and server @R_634_4045@ion from the topic
                //OPCGroup grp = transfer.OPCgrpsPerServer.TryGetValue()
                //Load Configuration of specific topic Fields Mapping
                Dictionary<string,string> fieldsmapping;
                var first = transfer.OPCgrpsPerServer.First();
                OPCGroup grp = first.Value[0];
                fieldsmapping = grp.FieldsMapping;
                StringBuilder payloadTransformer = new StringBuilder("{\"Iterator\": {\"#loop($.listofValues)\": {");

                foreach (keyvaluePair<string,string> entry in fieldsmapping)
                {
                    payloadTransformer.Append($"\"{entry.Value}\":\"#currentvalueatpath($.{entry.Key})\",");
                }
                payloadTransformer.Length--;
                payloadTransformer.Append("}}}");
                string resPayload = JUST.JsonTransformer.Transform(payloadTransformer.ToString(),mqqtmessage);
                var myItems = JsonConvert.DeserializeObject<ConsumedItem>(resPayload);
                if (myItems is null)
                {
                    return;
                }
                MappedTags = new Dictionary<string,Dictionary<string,string>>();
                List<int> lstItemHandles = new List<int>();
                //Read From a CSV file and put data in a Dictionary
                string csvFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"TagMappings.csv");
                var rows = File.ReadAllLines(csvFile);
                var totalcols = rows[0].Split(',').Length;
                Dictionary<string,string> Y = new Dictionary<string,string>();
                string columns = "",csvCell = "";
                string[] column;
                List<string> MQTTList = new List<string>();
                List<string> csvList = new List<string>();
                //  List<string> GroupNameList = new List<string>();

                foreach (var words in rows)
                {
                    columns = words;

                    column = columns.Split(new[] { ',' },StringSplitOptions.None);


                    for (int i = 0; i < column.Length; i++)
                    {
                        //if (columns.Split(',')[0].Equals("GroupName"))
                        //{
                        //    csvCell = columns.Split(',')[i];
                        //    Console.WriteLine(csvCell);
                        //    GroupNameList.Add(csvCell);
                        //}
                        if (columns.Split(',')[0].Equals("OPCTag"))
                        {
                            csvCell = columns.Split(',')[i];

                            csvList.Add(csvCell);
                        }
                        if (columns.Split(',')[0].Equals("MQTTTag"))
                        {
                            csvCell = columns.Split(',')[i];

                            MQTTList.Add(csvCell);
                        }
                    }
                    Y = csvList.Zip(MQTTList,(k,v) => new { Key = k,Value = v }).ToDictionary(x => x.Value,x => x.Key);
                    MQTTServiceLogger.TraceLog(MessageType.Control," Reading CSV file Successfully.");

                }
                //test Nadia
                transfer.Name = "Group0";
                MappedTags.Add(grp.GroupName,Y);
                // check if retrieved item exist in current group
                Dictionary<string,string> tagsmapped = new Dictionary<string,string>();
                MappedTags.TryGetValue(transfer.Name,out tagsmapped);
                List<OPCItemTransfer> ToBeWriteItems = new List<OPCItemTransfer>();
                List<int> Handles = new List<int>();
                List<object> Values = new List<object>();
                List<string> Items = new List<string>();
                foreach (var item in myItems.Iterator)
                {
                    string itemname;
                    if (tagsmapped.ContainsKey(item.ItemID))
                    {
                        //override List of items
                        tagsmapped.TryGetValue(item.ItemID,out itemname);
                        item.ItemID = itemname;
                        ToBeWriteItems.Add(item);
                        //Items.Add(item.ItemValue);
                     MQTTServiceLogger.TraceLog(MessageType.Control,"Tags Mapping succeeded .");
                    }

                }
               
                if (ToBeWriteItems.Count == 0)
                {
                    return;
                }
               
                OPCItemTransfer item1 = new OPCItemTransfer();
                for (int i = 0; i < grp.listItems.Count; i++)
                {
                    lstItemHandles.Add(grp.listItems[i].serverItemHandle);
                    item1 = ToBeWriteItems.Find(x => x.ItemID == grp.listItems[i].ItemID);
                    Values.Add(item1.ItemValue);
                    MQTTServiceLogger.TraceLog(MessageType.Control,"Getting items values Successfully.");
                }


                if (Values.Count > 0)
                {
                    //2.write to OPC
                    switch (grp.grpWriteMode)
                    {
                        #region Synchronous write
                        case WriteModes.Synchronous:
                            {
                                int[] arrErr;

                                WriteSynch(grp.ServerIndex,grp.GroupIndex,lstItemHandles.ToArray(),Values.ToArray(),out arrErr);

                                break;
                            }
                        #endregion
                        #region Asynchronous write
                        case WriteModes.Asynchronous:
                            {
                                int cancelID;
                                int[] arrErr;
                                int transactionID = 0;
                                WriteAsynch(grp.ServerIndex,transactionID,out cancelID,out arrErr);
                                break;
                            }
                        #endregion


                        #region Synchronous write IO2
                        case WriteModes.SynchronousIO2:
                            {
                                int[] arrErr;

                                WriteSynch2(grp.ServerIndex,out arrErr);

                                break;
                            }
                        #endregion
                        #region Asynchronous write IO3
                        case WriteModes.AsynchronousIO3:
                            {
                                int cancelID;
                                int[] arrErr;
                                int transactionID = 0;
                                WriteAsynch3(grp.ServerIndex,out arrErr);

                                break;
                            }
                            #endregion
                    }
                  

                }
                MQTTServiceLogger.TraceLog(MessageType.Error,"Error while trying to write in an OPC Server.");
            }
        }
        catch (Exception Ex0)
        {

            //throw;
        }

    } 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)