C#
OPC DA Client (with TitaniumAS) - 01. Basic Tamplete
휘프노스
2022. 10. 28. 07:20
다시 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);
}