다시 OPC DA 클라이언트를 개발해야하는 상황이 생겼는데
OPC Foundation 에서 제공하는 opcdaauto.dll 이 임포트 되지 않는다.
아마도 닷넷 버전이나 사소한 문제일 것이라는 생각이 들었지만
nuget에도 좋은 라이브러리가 있을 것 같아
찾아보니 뭔가 규모와 짜임새가 있어보이는 라이브러리가 있었는데 설치 후 바로 실행되지 않는다.
기능도 많고 뭔가 복잡한 기분이라 좀더 간단하게 사용할 라이브러리를 찾다보니
TitaniumAS라는 라이브러리가 보인다.
https://github.com/titanium-as/TitaniumAS.Opc.Client
깃허브에 찾아보니 샘플코드도 간결한 것이 가볍게 사용하기 좋아보였다.
아직 찾아봐야 할 것들이 좀 더 있지만 직관적이고 간단하게 사용하기에 괜찮은 라이브러리 같다.
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);
}
'C#' 카테고리의 다른 글
OPC DA Client (with TitaniumAS) - 02. subscribe (구독) (2) | 2023.01.15 |
---|---|
[WPF] 사용자 정의 컨트롤(UserControl)을 코드에서 사용하기 (0) | 2021.02.02 |
log4net 엔진 설정을 실행 중 코드로 작성해서 동적으로 사용하기 (0) | 2021.01.27 |
C# RTSP 관련 오픈소스 (0) | 2020.04.20 |
C# OPC DA - opcdaauto.dll 사용기 (0) | 2019.07.04 |