Подпишитесь на событие OPC-сервера OPC от службы Windows
Я хочу прочитать значение элемента с сервера opc, подписавшись на событие OpcGroup_DataChanged. Я могу сделать это через клиента формы Windows. Но когда я пытаюсь сделать то же самое из службы Windows, событие не запускается. Может ли какое-то тело пролить свет? Ниже моя реализация:
OPCItemResult[] rslt;
rtc = OpcGrp.AddItems(iDefs, out rslt);
if (HRESULTS.Failed(rtc))
return rtc;
ItemHandles = new int[rslt.Length];
errors = new int[iDefs.Length];
for (int i = 0; i < iDefs.Length; ++i)
{
ItemHandles[i] = rslt[i].HandleServer;
errors[i] = rslt[i].Error;
}
// data changed callback handler
OpcGrp.DataChanged += new DataChangeEventHandler(OpcGrp_DataChanged);
OpcGrp.AdviseIOPCDataCallback();
this.EventLog.WriteEntry("No of items: "+rtc.ToString(), EventLogEntryType.Information);
Событие:
protected void OpcGrp_DataChanged(object sender, DataChangeEventArgs e)
{
this.EventLog.WriteEntry("Data changed at server", EventLogEntryType.Information);
string txt = "";
foreach (OPCItemState rslt in e.sts)
{
txt += rslt.DataValue.ToString() + "\r\n";
}
this.EventLog.WriteEntry(txt, EventLogEntryType.Information);
}
1 ответ
Решение
Вероятно, это проблема с разрешениями DCOM. Чтобы убедиться в этом, попробуйте запустить клиентскую службу в той же учетной записи, в которой вы запускаете приложение Windows Form (возможно, в своей учетной записи для входа). Если это работает, вам нужно настроить сервер OPC (или настройки по умолчанию для DCOM), чтобы сервер мог обмениваться данными с любой учетной записью, в которой вы хотите, чтобы ваш клиент работал.