2015-06-08 5 views
0

Мне нужно разработать приложение, которое считывает некоторые значения в ПЛК через интерфейс wincc, я просмотрел, но примеры, которые я нашел, где все используют стороннее программное обеспечение. Необходимая мне функция очень проста: мне просто нужно прочитать значения в ПЛК без каких-либо дальнейших сообщений. Есть ли простой способ сделать это?Чтение из wincc с C#

+0

Используйте что-то вроде Wireshark для анализа данных, передаваемых в/из стороннего программного обеспечения. Если вам повезет, анализа не будет много (один запрос с одним ответом). Затем отправьте тот же запрос, используя те же настройки по тому же каналу. Я добился успеха с помощью ПЛК на базе CoDeSys. – Yegor

+0

Какой тип ПЛК вы используете. У меня был большой успех с помощью Modbus. В основном вы указываете адреса ПЛК на Modbus, и их можно прочитать с помощью библиотеки modbus, например https://code.google.com/p/nmodbus/. Я фактически использую это в проекте прямо сейчас, поэтому я был бы рад показать вам, как это делается. Также этот тип общения абсолютно свободен. – LochnessLAM

ответ

0

Ваш вопрос немного расплывчатый. Описание, которое вы указали, является базовой функциональностью WinCC. Зачитать значение из ПЛК (называемое тегом) и отобразить его в WinCC. Думаю, это не вопрос.

Вы хотите прочесть тег (интернель или внешний) от WinCC до вашего собственного приложения? Это можно сделать с опцией ODK в WinCC. Но это, как и все комплекты разработки в Scada/DCS, недоступны бесплатно.

Или вы хотите узнать значение из ПЛК, которое также используется в WinCC, вам нужно подключение S7 или открытое сообщение. S7 требует наличия ресурсов подключения и конфигурации в ПЛК. Для обмена сообщениями (через TCP/IP) требуется программирование в ПЛК.

0

Вот пример с использованием идентификатора программы из 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" }); 
1

Считывание значений PLC через Wincc:

На первый взгляд я предлагаю прочитать непосредственно через PLC либо с помощью OPC, TCP-телеграмм или некоторых сторонних библиотек, таких как libnodave. Его гораздо более производительный и элегантный в использовании.

Теперь вернемся к вашему вопросу о том, что вам нужна wincc для предоставления значений вашему приложению. Я предложу следующее:

  1. Создать .net-контроль или глобальный скрипт.
  2. Создайте wcf-сервис или интерфейс подключения к базе данных (в зависимости от вашего приложения).
  3. Соедините тег, в котором plc отправляет значения, в элементе управления wincc и прокручивает его через wcf или интерфейс базы данных.

Я думаю, что этот способ намного чище принимать значения из wincc, не затрагивая его wincc. С другой стороны, вы также можете использовать wincc как OPC-сервер.