Мне нужно разработать приложение, которое считывает некоторые значения в ПЛК через интерфейс wincc, я просмотрел, но примеры, которые я нашел, где все используют стороннее программное обеспечение. Необходимая мне функция очень проста: мне просто нужно прочитать значения в ПЛК без каких-либо дальнейших сообщений. Есть ли простой способ сделать это?Чтение из wincc с C#
ответ
Ваш вопрос немного расплывчатый. Описание, которое вы указали, является базовой функциональностью WinCC. Зачитать значение из ПЛК (называемое тегом) и отобразить его в WinCC. Думаю, это не вопрос.
Вы хотите прочесть тег (интернель или внешний) от WinCC до вашего собственного приложения? Это можно сделать с опцией ODK в WinCC. Но это, как и все комплекты разработки в Scada/DCS, недоступны бесплатно.
Или вы хотите узнать значение из ПЛК, которое также используется в WinCC, вам нужно подключение S7 или открытое сообщение. S7 требует наличия ресурсов подключения и конфигурации в ПЛК. Для обмена сообщениями (через TCP/IP) требуется программирование в ПЛК.
Вот пример с использованием идентификатора программы из WinCC:
System.Type oType = System.Type.GetTypeFromProgID("WinCC-Runtime-Project");
object wincc = System.Activator.CreateInstance(oType);
//Read the name of the runtime database (the @-Prefix identifies WinCC-System-Tags)
object catalog = oType.InvokeMember("GetValue", System.Reflection.BindingFlags.InvokeMethod, null, wincc, new object[] { "@DatasourceNameRT" });
//Read the computer name
object serverName = oType.InvokeMember("GetValue", System.Reflection.BindingFlags.InvokeMethod, null, wincc, new object[] { "@ServerName" });
//Read a WinCC-Tag with the name "MyTag"
object myTag = oType.InvokeMember("GetValue", System.Reflection.BindingFlags.InvokeMethod, null, wincc, new object[] { "MyTag" });
Считывание значений PLC через Wincc:
На первый взгляд я предлагаю прочитать непосредственно через PLC либо с помощью OPC, TCP-телеграмм или некоторых сторонних библиотек, таких как libnodave. Его гораздо более производительный и элегантный в использовании.
Теперь вернемся к вашему вопросу о том, что вам нужна wincc для предоставления значений вашему приложению. Я предложу следующее:
- Создать .net-контроль или глобальный скрипт.
- Создайте wcf-сервис или интерфейс подключения к базе данных (в зависимости от вашего приложения).
- Соедините тег, в котором plc отправляет значения, в элементе управления wincc и прокручивает его через wcf или интерфейс базы данных.
Я думаю, что этот способ намного чище принимать значения из wincc, не затрагивая его wincc. С другой стороны, вы также можете использовать wincc как OPC-сервер.
Используйте что-то вроде Wireshark для анализа данных, передаваемых в/из стороннего программного обеспечения. Если вам повезет, анализа не будет много (один запрос с одним ответом). Затем отправьте тот же запрос, используя те же настройки по тому же каналу. Я добился успеха с помощью ПЛК на базе CoDeSys. – Yegor
Какой тип ПЛК вы используете. У меня был большой успех с помощью Modbus. В основном вы указываете адреса ПЛК на Modbus, и их можно прочитать с помощью библиотеки modbus, например https://code.google.com/p/nmodbus/. Я фактически использую это в проекте прямо сейчас, поэтому я был бы рад показать вам, как это делается. Также этот тип общения абсолютно свободен. – LochnessLAM