Подписаться на брокера Mqtt и выполнить запись на OPC-сервер с помощью приложения Windows Forms

#c# #mqtt #iot #windows-forms-designer #opc

#c# #mqtt #iot #windows-forms-designer #opc

Вопрос:

Я пытаюсь подписаться на брокера MQTT и выполнить запись на OPC-сервер с помощью приложения Windows forms. Но у меня есть некоторые проблемы, я всегда получаю исключение «Ссылка на объект не установлена для экземпляра объекта». все хорошо, но когда я приехал, чтобы записать на opc-сервер, подписавшись и получив сообщение mqtt, я получил исключение. Ниже приведен код этого метода в службе WCF. public void 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 Information and server information 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, grp.GroupIndex, lstItemHandles.ToArray(),
                                    Values.ToArray(), transactionID, out cancelID, out arrErr);
                                break;
                            }
                        #endregion


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

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

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

                                break;
                            }
                            #endregion
                    }
                  

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

            //throw;
        }

    } 
  

Комментарии:

1. В каком операторе генерируется исключение? Какую библиотеку OPC вы используете?

2. Это исключение находится в методе write. Я использую сервер OPC DA.