Написание переменных через QuickOPC в C# (Visual Studio)
Мой проект посвящен написанию клиента OPC UA для чтения и записи переменных на сервере OPC UA Siemens PLC. Я использую Visual Studio 2017 Enterprise и установил Quick OPC Toolkit из OPClabs, чтобы начать работу и попытаться подключиться. Для программирования клиента я использую Windows Forms и C#. Соединение с сервером и чтение переменных работает просто отлично, но их написание доставляет мне головную боль:
1.) Прежде чем приступить к программированию самостоятельно, я скачал Образец клиента OPC UA из OPC Foundation (если кому-то нужна ссылка для скачивания, просто спросите, загрузку найти сложно). Я подключился к серверу и мог просматривать переменные, но функция записи была неактивна / недоступна.
2.) Я начал программировать очень простой клиент, но также не смог записать переменные. Чтение через Live Binding ( http://opclabs.doc-that.com/files/onlinedocs/QuickOpc/2018.2/User%27s%20Guide%20and%20Reference-QuickOPC/webframe.html) работает, также читает их с помощью easyUAClient.Read(). Я пытался написать переменную с этим кодом:
namespace ErsteOPCUAVerbindung{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var easyUAClient = new EasyUAClient();
easyUAClient.WriteValue("opc.tcp://OpcUaClient:password@192.168.216.1:4840/", "nsu=SinumerikVarProvider;ns=2;s=/NC/_N_NC_TEA_ACX/$MN_PLC_CYCLIC_TIMEOUT", 1);
}
}}
но я продолжаю получать исключение:
OpcLabs.EasyOpc.UA.OperationModel.UAException: "Произошла ошибка операции OPC-UA с кодом ошибки -2144010240 (0x80350000), происходящая из" OpcLabs.EasyOpcUA ". Внутренняя исключительная ситуация службы OPC-UA с результатом обслуживания" BadAttributeIdInvalid "содержит сведения о проблеме. "
{"Результат службы OPC-UA - произошла ошибка, специфичная для службы OPC-UA.\ R \ n ---- РЕЗУЛЬТАТ СЕРВИСА ----\r\nStatusCode: {BadAttributeIdInvalid} = 0x80350000 (2150957056)\r\n"}
Я понятия не имею, что вызывает это. Я подозревал, что, возможно, причина в каком-то ограничении доступа, но я не могу найти никаких намеков на это в документации и, кроме того, в любом случае, я вошел в систему как администратор.
У кого-нибудь есть идея? Спасибо.
2 ответа
Обновление: я нашел документацию, в которой объясняется, что у администратора нет прав на запись по умолчанию, и как вы можете это изменить. Вам нужно вызвать метод GiveUserAccess и передать два аргумента: имя пользователя и "SinuWriteAll" (второй вид скрыт). Я попробую это сейчас с C# и опубликую свое решение, если оно работает.
Я еще раз посмотрел на ваш код, и то, как вы передаете имя пользователя и пароль (в самом URL), определенно не правильно. То, как оно дается сейчас, по сути игнорируется. Это может или не может быть причиной проблемы с записью, но это, безусловно, необходимо изменить. Правильный способ указать имя пользователя и пароль:
var client = new EasyUAClient();
var endpointDescriptor = new UAEndpointDescriptor("opc.tcp://192.168.216.1:4840/");
endpointDescriptor.UserIdentity = UserIdentity.CreateUserNameIdentity("OpcUaClient", "password");
client.WriteValue(endpointDescriptor, "nsu=SinumerikVarProvider;ns=2;s=/NC/_N_NC_TEA_ACX/$MN_PLC_CYCLIC_TIMEOUT", 1);