titanium-as / TitaniumAS.Opc.Client

Open source .NET client library for OPC DA
MIT License
197 stars 93 forks source link

error occurred while connecting to remote OPC Serve #6

Closed subbi12 closed 7 years ago

subbi12 commented 7 years ago

While using this code when trying to connect to remote OPC server through an OPC Client we get the following error:

11/26/2016 4:44:03 AM :Error MessageCoCreateInstanceEx: Server execution failed StackTrace : at TitaniumAS.Opc.Client.Interop.System.Com.CreateInstance(Guid clsid, String host, NetworkCredential credential) at TitaniumAS.Opc.Client.Common.OpcServerEnumeratorAuto.CLSIDFromProgId(String progId, String host) at TitaniumAS.Opc.Client.Da.OpcDaServer.<>cDisplayClass7.b4(String host, String progId) at TitaniumAS.Opc.Client.Common.UrlParser.Parse[T](Uri opcServerUrl, Func3 withProgId, Func3 withCLSID) at TitaniumAS.Opc.Client.Da.OpcDaServer.Connect() at OPC_Client.Form1.ReadValuesSynchronously() in e:\OPC_Client\Form1.cs:line 46

Can someone help us in overcoming this error

trkeast commented 7 years ago

Hello, subbi12!

  1. for winform applications you needs to change default appartment from STA to MTA, it`s necessary for correct call function CoInitializeSecurity: https://github.com/titanium-as/TitaniumAS.Opc.Client#basic-usage you should change appartment from STA to MTA in project settings or change attribute [STAThread] to [MTAThread] on entry point func

  2. try execute this code: public class OpcTest { private const string ServerUri = "Matrikon.OPC.Simulation.1"; //ProgId for matrikon simulation server private const string SubscribeItemId = "Random.Int4"; //itemId for subscribed opc item private const string GroupName = "TestGroup"; //group name for make subscription private const int UpdateRateInMilliseconds = 1000; //subscription update rate for group

    private static void Main(string[] args) { var groupState = new OpcDaGroupState { Culture = CultureInfo.CurrentCulture, //set LCID for group - some OPC servers may be sensitive for this IsActive = true, //only active group can be subscribed PercentDeadband = 0.0f, //percent deadband TimeBias = TimeSpan.Zero, UpdateRate = TimeSpan.FromMilliseconds(UpdateRateInMilliseconds), UserData = "some userdata" //user data }; var itemDefinitions = new[] { new OpcDaItemDefinition { IsActive = true, //only active item can be subscribed ItemId = SubscribeItemId //itemid for opc server item } };

    Uri url = UrlBuilder.Build(ServerUri); //build url
    
    using (var server = new OpcDaServer(url))
    {
        // Connect to the server first.
        server.Connect();
    
        OpcDaGroup @group = server.AddGroup(GroupName, groupState); //add group on OPC server
        OpcDaItemResult[] results = @group.AddItems(itemDefinitions); //add items on OPC server
        foreach (OpcDaItemResult result in results) //print errors
        {
            if (result.Error.Failed)
            {
                Console.WriteLine("Error on create item: '{0}'", result.Error);
            }
        }
    
        // Read all items of the group synchronously.
        OpcDaItemValue[] values = group.Read(group.Items, OpcDaDataSource.Device);
        foreach (OpcDaItemValue value in values)
        {
            Console.WriteLine("[Sync Read] ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}",
                value.Item.ItemId,
                value.Value, value.Quality, value.Timestamp);
        }
    
        // Read all items of the group asynchronously.
        Task<OpcDaItemValue[]> task = group.ReadAsync(group.Items);
        task.ContinueWith(result =>
        {
            OpcDaItemValue[] itemValues = result.Result;
            foreach (OpcDaItemValue value in itemValues)
            {
                Console.WriteLine("[Async Read] ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}",
                    value.Item.ItemId,
                    value.Value, value.Quality, value.Timestamp);
            }
        });
    
        group.ValuesChanged += GroupOnValuesChanged; //subscribe on event
    
        Console.WriteLine("Press enter to terminate...");
        Console.ReadLine();
    
        group.ValuesChanged -= GroupOnValuesChanged;
        server.Disconnect();
    }

    }

    private static void GroupOnValuesChanged(object sender, OpcDaItemValuesChangedEventArgs args) { // Output values. foreach (OpcDaItemValue value in args.Values) { Console.WriteLine("[Subscribe] ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}", value.Item.ItemId, value.Value, value.Quality, value.Timestamp); } }

}

sensubha commented 5 years ago

While connecting remote OPC DA server using TitaniumAs Opc client, getting "CoCreateInstanceEx: Access is denied". How to handle this issue?