PDA

Просмотр полной версии : Ethernet + Delphi + ПЛК



TPEHEP
06.09.2010, 11:40
Добрый день форумчане.

Подскажите пожалуйста, каким образом (при помощи чего) организовать связь программы написанной на дельфях с несколькими ПЛК 100 через Ethernet.

Вкратце суть проблемы: имеется здание 11 этажей, на каждом этаже стоит по несколько ПЛК, ко всем проложена витая пара, соответственно связь по Ethernet. Мне необходимо из сторонней программы (не из кодесиса) написанной на Delphi, обращаться к любому из ПЛК и управлять/просматривать состояние выходов/входов.

При помощи каких инструментов я могу это сделать.

З.Ы. не надо писать о других системах разработки, у меня есть делфи и есть много ПЛК. Задача заставить их работать совместно.

Огромное заранее всем спасибо за помощь.

Andy
06.09.2010, 12:19
Modbus/TCP?

TPEHEP
06.09.2010, 12:55
Modbus/TCP?

Можно поподробнее?
Я в этом пока дилетант... :o

Flomaster
06.09.2010, 13:31
Подробнее можно.
Ваш ПК с программой, написанной на Delphi, будет являться Мастером в сети Modbus TCP. А ПЛК, соответственно, будут Слйэв-устройствами.
То есть ПК будет посылать в сеть запросы, а ПЛК будут отвечать на них.
Здесь (http://sourceforge.net/projects/delphimodbus/) лежат компоненты для Delphi, которые предназначены для связи с ПЛК по протоколу TCP/IP. Сам не использовал, поэтому ничего о них не скажу. Ну и Google вам в помощь! Бесплатных библиотек в сети хватает.
Что касается ПЛК, то в среде CoDeSys нужно задать конфигурацию для ваших ПЛК. В конфигураторе добавляете устройство Modbus slave, у него добавляете тип TCP. И учтите, что кажный ПЛК должен иметь уникальный адрес в сети Modbus (от 1 до 255).
Успехов!

Andy
06.09.2010, 13:44
Все были дилетантами... Модбас описан в Википедии, компоненты для Делфи указаны, со стороны ПЛК - читайте доку и примеры на форуме. И пробуйте. Для начала можете взять какую-либо демо-версию SCADA и состыковать с ПЛК по Modbus/TCP; затем (получив настроенную конфигурацию ПЛК) пробовать своего клиента. Как-то так...

TPEHEP
06.09.2010, 14:16
Все были дилетантами... Модбас описан в Википедии, компоненты для Делфи указаны, со стороны ПЛК - читайте доку и примеры на форуме. И пробуйте. Для начала можете взять какую-либо демо-версию SCADA и состыковать с ПЛК по Modbus/TCP; затем (получив настроенную конфигурацию ПЛК) пробовать своего клиента. Как-то так...

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

Ну а так, есть хоть напрвление, куда двигаться... ещё раз спасибо.

Andy
06.09.2010, 15:55
пока не решал, все впереди. но алгоритм решения примерно такой. двигаться по ступенькам, инкрементально. а то, если сразу в лоб пытаться решать без опыта, можно споткнуться на особенностях реализации взаимодействия разнородного оборудования. внимательно изучите адресацию модбас у овна в доке и примерах.

Stork-Systems
07.09.2010, 09:53
Настраивается CoDeSys OPC Server, прописываются все ПЛК со своими IP-адресами входящими в систему. На Delphi пишется OPC-клиент который получает и отдает значения OPC-переменных. Я использовал компоненты работы с OPC-сервером из пакета Iocomp_Ultra_Pack_4.0.3 под Delphi 2009.

Andy
07.09.2010, 09:56
Сомневаюсь, чтобы реализация OPC была проще, нежели Modbus/TCP...

Дмитрий Артюховский
07.09.2010, 11:26
программируем сокеты.... на плк подняты сервера, программа в дельфях - клиент, опрашивает по очереди или по какой-другой надобности.... надобность считать пару байт состояния входов - выходов не обязательно влечет за собой необходимости добавлять в структуру дополнительные звенья в виде модбасов и опс-серверов

Andy
07.09.2010, 12:12
и действительно... не подумал. можно рассылку по Udp сделать - вообще просто будет.

TPEHEP
07.09.2010, 14:46
создаю в конфигураторе модбус слэйв. в нем тср и две переменные по 2 байта.

из дельфи пытаюсь прочитать по адресу тср плк его регистры. не читает. чё уже только не делал.

хелп, что ещё надо для того чтобы плк отвечал по модбусу?

Andy
07.09.2010, 16:55
проверить на рабочем клиенте. например, modpoll или какая-нибудь scada.

TPEHEP
09.09.2010, 08:30
ребят дайте плиз ссылку на компоненту орс под дельфи. нашёл какие-то две компоненты, но без примеров и не понятно как работают...

сенкс за помощь...

TPEHEP
09.09.2010, 15:55
В дельфи даю такую команду на запись значения.

OPC.OPCGroups.GetOPCGroup('Group1').OPCItems.Item( 'PLC1:.Out1').Write(1);

Вылетает с такой ошибкой:

<a target="_blank" href="http://www.radikal.ru"><img src="http://s61.radikal.ru/i174/1009/ba/cb72e3673a1b.jpg" ></a>

Что делать?

Flomaster
10.09.2010, 16:38
Вы проверяли на рабочей SCADA-системе? OPC-сервер CoDeSys настроили?
Какие результаты?
Если не проверяли, то начать надо с изучения пособия "Использование OPC-сервера CoDeSys для подключения ПЛК...". Там всё понятно расписано. Если заработает на SCADA-системе, тогда будет предметный разговор. А пока только вилами по воде:(

Leonid
10.09.2010, 22:31
Проще всего в ПЛК использовать библиотеку SysLibSockets (слать и принимать данные по UDP)
В Дельфях тоже есть аналогичные средства (я решал такую задачу на C#)
Чтобы данные не терялись, можно использовать избыточность или диалоговый режим

Alex_Kos
23.05.2011, 21:47
Всем доброго времени суток!!!
Ребят подскажите пожалуйста как работать вот с этим компонентом для делфи http://sourceforge.net/projects/delphimodbus/. Из CoDeSys по ModBus TCP работаем нормально - IP заводской (10.0.6.10), порт 502. ПЛК - ModBus slave. Попытавшись прочитать первый регистр примером, приведенным в данном компоненте (мастером, то есть клиентом) получаем вот такое сообщение с ошибкой - "Сonnection Сlosed Gracefully".
Сеть на ПК настроена вроде правильно (так как из CoDeSys связываемся нормально), Ip адрес поставлен 10.0.6.10 (вроде по этому адресу стучиться, так как при смене IP выводит сообщение о том что вообще не подсоединяется), порт=502. Но достучаться до ПЛК все равно не можем.
При запуске slav-а примера, при соответствующей смене IP адреса нормально все читаем.
Подскажите пожалуйста кто работал с этим компонентом в чем проблема? Может какие другие компоненты есть? Интересует именно связь с ПЛК по Ethernet по ModBus TCP посредством делфи. Может я просто что не так делаю? Очень нужна помощ!!!!!!!! Заранее всем откликнувшимся благодарен!!!!!!!!!!

Во вложении привожу скриншоты настройки ПЛК

Леонид
25.05.2011, 12:25
Проще всего в ПЛК использовать библиотеку SysLibSockets (слать и принимать данные по UDP)
В Дельфях тоже есть аналогичные средства (я решал такую задачу на C#)
Чтобы данные не терялись, можно использовать избыточность или диалоговый режим

А не иогли бы Вы выложить какой нибудь элементарный пример на C#?
Дело в том что я сейчас стою на распутье Delphi или C#, Delphi мне более понятен, но многие советуют С#, мол лучше значительно.
А так как упехов пока особых нет, то есть возможность пойти по любому из путей.
Спасибо!

Alex_Kos
27.05.2011, 21:34
capzap спасибо за подсказку!!! Действительно, в компоненте по умолчанию стоит 255 (UnitID). Поменял на соответствующий и все нормуль )).
Вопрос может не по ветке но всеже, не кинет кто-нибудь ссылку или выложит компоненты iocomp для Delphi 2009?

Leonid
29.05.2011, 14:04
IPEndPoint groupEP1;
Socket Sock;
EndPoint r1;
EndPoint r2;
EndPoint r3;
const int listenPort = 1221; // Этот порт установлен в сетевых переменных ПЛК
byte[] bytes; // приемный массив
byte[] bytes2; // отсылаемый массив
bool plcConnected;

private void InitNetwork()
{
// Подготовка массивов для работы по сети
bytes = new byte[1 + 11];
bytes2 = new byte[1 + 8];
// Настройка сокета
groupEP1 = new IPEndPoint(IPAddress.Any, listenPort);
r1 = (EndPoint)groupEP1;
r2 = new IPEndPoint(IPAddress.Parse("192.168.1.101"), listenPort); r3 = new IPEndPoint(0, 0);
}

private void plcConnect()
{
Sock = new Socket(groupEP1.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
Sock.Bind(r1);
// Ожидание приема
timer1.Enabled = true;
btnListen.Enabled = false;
btnStopListen.Enabled = true;
plcConnected = true;
}

private void plcDisconnect()
{
// Отключение от сети
timer1.Enabled = false;
btnListen.Enabled = true;
btnStopListen.Enabled = false;
Sock.Shutdown(SocketShutdown.Both);
Sock.Close();
Sock.Dispose();
plcConnected = false;
}

private void btnListen_Click(object sender, EventArgs e)
{
plcConnect();
}

private void btnStopListen_Click(object sender, EventArgs e)
{
plcDisconnect();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
plcDisconnect();
}

private void timer1_Tick(object sender, EventArgs e)
{
if (Sock.Available > 0) // Есть ли поступившие данные
{
int temp = Sock.ReceiveFrom(bytes, ref r3); // Прием данных

string SSS = bytes[0].ToString("00: "); // Диагностический блок
for (int i = 1; i < temp; i++)
{
SSS = SSS + bytes[i].ToString("000 ");
}
textBox1.Text = textBox1.Text + SSS + "\r\n";

// System.Diagnostics.Debug.WriteLine(((IPEndPoint)r3 ).AddressFamily);
// System.Diagnostics.Debug.WriteLine(((IPEndPoint)r3 ).Address);
// System.Diagnostics.Debug.WriteLine(((IPEndPoint)r3 ).Port);

switch (bytes[0]) // Отработка разных посылок от ПЛК
{
}
}
}