다시 OPC DA 클라이언트를 개발해야하는 상황이 생겼는데

 

OPC Foundation 에서 제공하는 opcdaauto.dll 이 임포트 되지 않는다.

 

아마도 닷넷 버전이나 사소한 문제일 것이라는 생각이 들었지만

 

nuget에도 좋은 라이브러리가 있을 것 같아

 

찾아보니 뭔가 규모와 짜임새가 있어보이는 라이브러리가 있었는데 설치 후 바로 실행되지 않는다.

 

기능도 많고 뭔가 복잡한 기분이라 좀더 간단하게 사용할 라이브러리를 찾다보니

 

TitaniumAS라는 라이브러리가 보인다.

 

https://github.com/titanium-as/TitaniumAS.Opc.Client

 

GitHub - titanium-as/TitaniumAS.Opc.Client: Open source .NET client library for OPC DA

Open source .NET client library for OPC DA. Contribute to titanium-as/TitaniumAS.Opc.Client development by creating an account on GitHub.

github.com

 

깃허브에 찾아보니 샘플코드도 간결한 것이 가볍게 사용하기 좋아보였다.

아직 찾아봐야 할 것들이 좀 더 있지만 직관적이고 간단하게 사용하기에 괜찮은 라이브러리 같다.

 

        private OpcDaServer _server;

        // Connect Server
        private void btnList_Click(object sender, EventArgs e)
        {
            _server = new OpcDaServer(UrlBuilder.Build("Matrikon.OPC.Simulation.1"));
            _server.Connect();
            if (_server.IsConnected)
                MessageBox.Show("Conneted");
        }

        // Disconnect Server
        private void btnDisconn_Click(object sender, EventArgs e)
        {
            _server.Disconnect();
            _server.Dispose();
        }

        private void btnRGroup_Click(object sender, EventArgs e)
        {
            if (!_server.IsConnected)
                return;
            int count = 0;

            lbGroup.Items.Clear();

            _server.SyncGroups();
            foreach (var opcDaGroup in _server.Groups)
            {
                string strGroup = "G = [" + opcDaGroup.Name + "]";
                opcDaGroup.SyncItems();
                opcDaGroup.SyncState();
                lbGroup.Items.Add(strGroup);
                foreach (var oitem in opcDaGroup.Items)
                {
                    string strItem = "I = [" + oitem.ItemId + "]";
                    lbGroup.Items.Add(strItem);
                    count += 1;
                }
            }
            MessageBox.Show("Total Items : " + count);
        }

        // Read Tag
        private void btnRData_Click(object sender, EventArgs e)
        {
            string[] opcTag = { "Random.Int1", "Random.Int2", "TEST.Channel1.TAG0001", "TEST.Channel2.TEST0001", "TEST.Channel2.TEST0002" };
            List<TimeSpan> tsMax = new List<TimeSpan>();

            for(int j = 0; j < opcTag.Length; j++)
            {
                tsMax.Add(TimeSpan.Zero);
            }

            lbResult.Items.Clear();
            var values = _server.Read(opcTag, tsMax);
            for(int i = 0; i < opcTag.Length; i++)
            {
                lbResult.Items.Add(opcTag[i] + " = " + values[i].Value);
            }
        }

        // Write Tag
        private void btnWrite_Click(object sender, EventArgs e)
        {
            string[] itemIds = new[] { "TEST.Channel1.TAG0001", "TEST.Channel2.TEST0001", "TEST.Channel2.TEST0002" };
            OpcDaItemValue[] values = new OpcDaItemValue[]
            {
                new OpcDaItemValue()
                {
                    Value = Convert.ToInt32(txtVal.Text),
                    Timestamp = DateTimeOffset.Now-TimeSpan.FromHours(1)
                },
                new OpcDaItemValue()
                {
                    Value = 0,
                    Timestamp = DateTimeOffset.Now-TimeSpan.FromHours(1)
                },
                new OpcDaItemValue()
                {
                    Value = 0,
                    Timestamp = DateTimeOffset.Now-TimeSpan.FromHours(1)
                },
            };
            HRESULT[] errors = _server.WriteVQT(itemIds, values);
            
        }
Posted by 휘프노스
,