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(); }
}
}
涵蓋伺服器發現、連線、群組建立、項目增刪、同步/非同步讀寫、事件訂閱、資源釋放完整流程。