PC SDK EventLog Domain

bgrantbgrant Canada
edited April 2019 in Developer Tools
Hi all,

I have an application that was working fine but is now throwing an exception on null reference. I am working with the event log domain. I have highlighted the line of code that throws the exception below. Thanks in advance!

using System;
using System.Text;
using System.Data.SqlClient;
using ABB.Robotics.Controllers;
using ABB.Robotics.Controllers.Messaging;
using ABB.Robotics.Controllers.Discovery;
using ABB.Robotics.Controllers.EventLogDomain;

namespace ControllerAPI
{
    class Program
    {
        static string GUID = System.Configuration.ConfigurationManager.AppSettings["System_ID"];
        static string RMQ_QN = System.Configuration.ConfigurationManager.AppSettings["RMQ_Queue_Name"];
        static string RMQ_SQL_SN = System.Configuration.ConfigurationManager.AppSettings["RMQ_SQL_Server_Name"];
        static string RMQ_SQL_DBN = System.Configuration.ConfigurationManager.AppSettings["RMQ_SQL_DB_Name"];
        static string RMQ_SQL_UN = System.Configuration.ConfigurationManager.AppSettings["RMQ_SQL_Username"];
        static string RMQ_SQL_PW = System.Configuration.ConfigurationManager.AppSettings["RMQ_SQL_Password"];
        static string RMQ_SQL_SP = System.Configuration.ConfigurationManager.AppSettings["RMQ_SQL_Stored_Proc"];

        static string EL_SQL_SN = System.Configuration.ConfigurationManager.AppSettings["EL_SQL_Server_Name"];
        static string EL_SQL_DBN = System.Configuration.ConfigurationManager.AppSettings["EL_SQL_DB_Name"];
        static string EL_SQL_UN = System.Configuration.ConfigurationManager.AppSettings["EL_SQL_Username"];
        static string EL_SQL_PW = System.Configuration.ConfigurationManager.AppSettings["EL_SQL_Password"];
        static string EL_SQL_SP = System.Configuration.ConfigurationManager.AppSettings["EL_SQL_Stored_Proc"];
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [MTAThread]
        static void Main(string[] args)
        {
            NetworkScanner scanner = new NetworkScanner();
            scanner.Scan();
            // Wait a while for the scan to find more controllers if needed.
            System.Threading.Thread.Sleep(2000);
            scanner.Scan();

            IpcQueue myQueue;
            IpcMessage recMessage;
            Controller ctrl;
            ctrl = CreateController();
            ctrl.Logon(UserInfo.DefaultUser);

            Console.WriteLine("Controller-System: {0} time is: {1} System ID is: {2}", ctrl.SystemName, ctrl.DateTime, ctrl.SystemId);
            Console.WriteLine("Press any key to terminate");

            var Q = RMQ_QN;
            string msg = "";
            int index = 0;
            int queueid = (ctrl.Ipc.GetQueueId(Q));

            if (ctrl.Ipc.Exists(Q))
            {
                ctrl.Ipc.DeleteQueue(queueid);
                myQueue = ctrl.Ipc.CreateQueue(Q, 2, Ipc.IPC_MAXMSGSIZE);
            }
            else
            {
                myQueue = ctrl.Ipc.CreateQueue(Q, 2, Ipc.IPC_MAXMSGSIZE);
            }
            myQueue = ctrl.Ipc.GetQueue(Q);

            while (true)
            {
                

                ctrl.EventLog.MessageWritten += EventLogMessageWritten;


                recMessage = (new IpcMessage());
                IpcReturnType ret = IpcReturnType.Timeout;
                string answer = string.Empty;
                int timeout = 5000;

                //Check for msg in the PC SDK queue
                ret = myQueue.Receive(timeout, recMessage);
                if (ret == IpcReturnType.OK)
                {
                    //convert msg data to string
                    answer = new UTF8Encoding().GetString(recMessage.Data);
                    msg = answer.Trim(' ');
                    msg = msg.Remove(0, 8);
                    index = msg.LastIndexOf(">");
                    if (index > 0)
                    {
                        msg = msg.Substring(0, index + 1);
                        Console.WriteLine(msg.Length.ToString());
                        Console.WriteLine(msg);
                        LogMessage(msg);
                    }
                }
                else
                {
                    Console.WriteLine("Timeout!");
                }
            }
        }

        static Controller CreateController()
        {
            try
            {
                NetworkScanner scanner = new NetworkScanner();
                Controller @static = new Controller(ControllerFactory.FormatControllerId(new Guid(GUID)));
                return @static;
            }
            catch (Exception ex)
            {
                Console.WriteLine("The specified GUID cannot be found. The robot GUID can be found in the internal directory in the 'system.guid' file. The current sysID is: " + GUID);
                Console.WriteLine("Press any key to terminate");
                Console.ReadKey();
                Environment.Exit(1);
            }
            return null;
        }

        public static void LogMessage(object msg)
        {
            using (SqlConnection connection = new SqlConnection("Data Source=" + RMQ_SQL_SN + ";Initial Catalog=" + RMQ_SQL_DBN + ";User Id=" + RMQ_SQL_UN + ";Password=" + RMQ_SQL_PW))
            {
                SqlCommand command = new SqlCommand(RMQ_SQL_SP, connection);
                command.CommandType = System.Data.CommandType.StoredProcedure;

                // make a sqlparameter object that we'll use for each param
                SqlParameter sp;

                string xml = "<BODY>" + "<GUID>" + GUID + "</GUID>" + msg + "</BODY>";
                sp = new SqlParameter("@xml", System.Data.SqlDbType.Xml);
                sp.SqlValue = xml;
                command.Parameters.Add(sp);
                connection.Open();
                command.ExecuteNonQuery();
            }
        }

        public static void EventLogMessageWritten(object sender, MessageWrittenEventArgs e)
        {
            if (sender != null)
            if (e != null)
            {
                Console.WriteLine(e.Message.Title);
                //Console.WriteLine("EVENT HAPPENED");
                //using (SqlConnection connection = new SqlConnection("Data Source=;Initial Catalog=;User Id=;Password=
                //   string query = "INSERT into dbo.ABBEventLog (Data) VALUES (@A)";
                //  using (SqlCommand command = new SqlCommand(query, connection))
                //  {
                //      command.Parameters.AddWithValue("@A", "<A>" + "<SYSID>" + GUID + "</SYSID>" + "<TYPE>" + e.Message.Type + "</TYPE>" + "<CATEGORY>" + e.Message.CategoryId + "</CATEGORY>" + "<MNUM>" + e.Message.SequenceNumber + "</MNUM>" + "<TIME>" + e.Message.Timestamp + "</TIME>" + e.Message.Body + "</A>");
                //      connection.Open();
                //      command.ExecuteNonQuery();
                //  }
                //  }
            }
            else
                Console.WriteLine("Null Event Log Message");
        }
    }
}

Comments

  • bgrantbgrant Canada
    edited April 2019
    UPDATE:
    I have tried this code with a virtual controller running in RobotStudio 6.08.8307.1040 and I can write any attribute of the event log message to the console. Could my issue be that I have to use the version of ABB.Robotics.Controllers.PC.dll that corresponds to my real controller RobotWare version? I am currently using ABB.Robotics.Controllers.PC.dll from PC SDK 6.08. 

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

In this Discussion