首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 整合 OpcNetApi 實現 OPC DA 客戶端:連線伺服器、建立群組、同步/非同步讀寫與資料變更事件訂閱

     編輯:關於C語言

測試環境

VS2008、KEPServer、OpcNetApi.dll、OpcNetApi.Com.dll。西門子 Net2006 可能提供相依組件。

完整主控台程式碼


using System; using System.Collections.Generic; using System.Linq; using System.Text;
using System.Threading; using Opc; using Opc.Da; using OpcCom;

namespace OPCAPITest
{
    class Tester
    {
        private Opc.Da.Server m_server = null;
        private Opc.Da.Subscription subscription = null;
        private Opc.Da.SubscriptionState state = null;
        private Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();

        public void Work()
        {
            // 1. 發現伺服器
            Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20, "TX1", null);
            if (servers != null)
            {
                foreach (Opc.Da.Server s in servers)
                    if (String.Compare(s.Name, "TX1.KEPware.KEPServerEx.V4", true) == 0)
                    { m_server = s; break; }
            }

            // 2. 連線
            if (m_server != null) m_server.Connect(); else return;

            // 3. 設定群組狀態
            state = new Opc.Da.SubscriptionState
            {
                Name = "測試",
                ClientHandle = Guid.NewGuid().ToString(),
                Active = true,
                UpdateRate = 100,
                Deadband = 0,
                Locale = null
            };

            // 4. 建立群組與項目
            subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);
            string[] itemNames = { "BPJ.DB1.dbb0", "BPJ.DB1.dbb1", "BPJ.DB1.dbc2", "BPJ.DB1.dbi3",
                                   "BPJ.DB1.dbs4", "BPJ.DB1.dbw5", "BPJ.DB1.dbx6" };
            Item[] items = new Item[7];
            for (int i = 0; i < 7; i++)
            {
                items[i] = new Item { ClientHandle = Guid.NewGuid().ToString(), ItemName = itemNames[i] };
            }
            subscription.AddItems(items);

            // 5. 訂閱資料變更事件
            subscription.DataChanged += OnDataChange;

            // 6. 同步讀取
            ItemValueResult[] values = subscription.Read(subscription.Items);
            // 部分讀取、非同步讀取略...

            // 7. 同步寫入
            ItemValue[] writeVals = new ItemValue[items.Length];
            for (int i = 0; i < items.Length; i++)
                writeVals[i] = new ItemValue((ItemIdentifier)items[i]);
            writeVals[0].Value = 255; writeVals[1].Value = 126; writeVals[2].Value = 'A';
            writeVals[3].Value = -128; writeVals[4].Value = "Good Lucky!";
            writeVals[5].Value = 65535; writeVals[6].Value = true;
            subscription.Write(writeVals);
            Thread.Sleep(500); // 等待 DataChange 觸發

            // 8. 非同步寫入、清理資源略...
            Console.WriteLine("按 Enter 結束..."); Console.ReadLine();

            subscription.DataChanged -= OnDataChange;
            subscription.RemoveItems(subscription.Items);
            m_server.CancelSubscription(subscription);
            subscription.Dispose();
            m_server.Disconnect();
        }

        public void OnDataChange(object subHandle, object reqHandle, ItemValueResult[] values)
        {
            Console.WriteLine("_____________________DataChange事件");
            foreach (var v in values)
                Console.WriteLine($"ITEM:{v.ItemName}, Value:{v.Value}, Quality:{v.Quality}, Time:{v.Timestamp}");
        }
        // OnReadComplete、OnWriteComplete 略...

        static void Main(string[] args) { new Tester().Work(); }
    }
}

涵蓋伺服器發現、連線、群組建立、項目增刪、同步/非同步讀寫、事件訂閱、資源釋放完整流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved