PDA

Просмотр полной версии : Подключение ПЛК308, ПЛК304 и СКАДА системе



Леонид
23.07.2014, 14:45
Как без лишних танцев с бубном связать ПЛК308, ПЛК304 со СКАДА системой по ModBus TCP.
Вопрос относится только к конфигурированию ПЛК, так как ПЛК1xx на CoDeSys 2.3, прекрасно связываются и работают.
Более того в CoDeSys 2.3 на одну область памяти можно назначить несколько TCP портов, что дает возможность без лишних заморочек опрашивать ПЛК более чем одним "рабочим местом".

smk1635
23.07.2014, 17:49
Это не только Вам интересно. :D

Леонид
23.07.2014, 23:46
Это не только Вам интересно. :D

Так в том то и дело, что выпустили коммуникационный ПЛК, но о простом конфигурировании коммуникаций позабыли!
Конечно наверное не без вины CoDeSys 3!
Но все равно проблему решать нужно, может "овеновцы" выпустят библиотеки ModBus TCP (Master, Slave) на базе SysLibSocket?

Леонид
13.08.2014, 20:53
Ну так какие есть варианты? Где пропал модератор ?

приборист
13.08.2014, 23:27
Прошу прощения, а в чем конкретно проблема?
Попробовал в CDS3 - вроде добавляется интерфейс.

Просто придется в скором времени делать проект, со связью СПК - контроллеры именно по Ethernet.
Хочется знать, в чем могут быть проблемы.

capzap
14.08.2014, 06:01
Так в том то и дело, что выпустили коммуникационный ПЛК, но о простом конфигурировании коммуникаций позабыли!
Конечно наверное не без вины CoDeSys 3!
Но все равно проблему решать нужно, может "овеновцы" выпустят библиотеки ModBus TCP (Master, Slave) на базе SysLibSocket?
Давно уже все придумано, в оскат-нетворк есть модбас, там из переделок надо только адаптировать открытие сокета из v23 в.v3
Я где то выкладывал пробный пример,года два назад, ни кого не заинтересовало я и не стал развивать дальше

capzap
14.08.2014, 06:02
Прошу прощения, а в чем конкретно проблема?
Попробовал в CDS3 - вроде добавляется интерфейс.

Просто придется в скором времени делать проект, со связью СПК - контроллеры именно по Ethernet.
Хочется знать, в чем могут быть проблемы.проблемы были в ограниченном количестве регистров

Леонид
17.08.2014, 00:10
Да это я все в курсе дела!
Вот только придется опять идти по принципу, в умелых руках и .... напильник, а охота так чтоб без любви, из коробки все работало!
Ну что-же достанем этот самый напильник!

Леонид
18.08.2014, 19:37
Давно уже все придумано, в оскат-нетворк есть модбас, там из переделок надо только адаптировать открытие сокета из v23 в.v3
Я где то выкладывал пробный пример,года два назад, ни кого не заинтересовало я и не стал развивать дальше

Начал осваивать SysSocket на ПЛК304! Начал с серверной части, прием данных заработал без проблем. Но стоит вытащить провод связи Ethernet из ПЛК клиента, или не вставить его еще до включения ПЛК304, в роли клиента ПЛК100, и сразу происходит остановка обработки программы в ПЛК304, если воткнуть провод обратно, через некоторое время связь восстанавливается и ПЛК304 продолжает выполнение программы.
Сразу уточню что сокет перевожу в неблокирующий режим!
Что я делаю не так?


CASE Step OF

0: (* Шаг создания и настройки сокета *)
hServerSocket:= SysSockCreate(iAddressFamily:= SOCKET_AF_INET, diType:= SOCKET_STREAM, diProtocol:= SOCKET_IPPROTO_TCP, pResult:= ADR(Result_SysSockCreate));
Result_SysSockIoctl:= SysSockIoctl(hSocket:= hServerSocket, diCommand:= SOCKET_FIONBIO, pdiParameter:= ADR(mode)); (* Переводи сокет в не блокирующий режим *)

Socket.sin_family:= SOCKET_AF_INET;
Socket.sin_addr.ulAddr := SOCKET_INADDR_ANY; (* Принимать от любого адреса *)
Socket.sin_port := SysSockHtons(usHost:= Port); (* Порт по которому будет осуществляться прием *)

Result_SysSockBind:= SysSockBind(hSocket:= hServerSocket, pSockAddr:= ADR(Socket), diSockAddrSize:= SIZEOF(Socket)); (* Привязываем порт к сокету *)
Result_SysSockListen:= SysSockListen(hSocket:= hServerSocket, diMaxConnections:= MaxConnections);
(* Включаем прослушивание сокета *)


Step:= 1;
1:
Tries_1:= Tries_1 + 1;
hClientSocket:= SysSockAccept(hSocket:= hServerSocket, pSockAddr:= ADR(Socket), pdiSockAddrSize:= ADR(SocketSize), pResult:= ADR(Result_SysSockAccept)); (* Ожидание соединение от клиента, возвращаем номер сокета клиента *)

IF hClientSocket <> 16#FFFFFFFF THEN
Result_SysSockInetNtoa:= SysSockInetNtoa(pInAddr:= ADR(Socket.sin_addr.ulAddr), szIPADDR:= Client_IP, diIPAddrSize:= SIZEOF(Client_IP));
Step:= 3;
ELSIF Tries_1 > 10 THEN
Tries_1:= 0;
Step:= 5;
END_IF;
2:
Tries_2:= Tries_2 + 1;
Send_Buf[1]:= Send_Buf[1] + 1;
Send_Buf[2000]:= Send_Buf[2000] + 1;
Send_Buf[3000]:= Send_Buf[3000] + 1;
Send_Buf[5000]:= 50;

SendByte:= SysSockSend(hSocket:= hClientSocket, pbyBuffer:= ADR(Send_Msg), diBufferSize:= SIZEOF(Send_Msg), diFlags:= 0, pResult:= ADR(Result_SysSockSend)); (* Отправляем сообщение *)
IF SendByte > 0 THEN
Step:= 3;
END_IF

IF Tries > 1000 THEN
Step:= 3;
END_IF;
3:
Tries_3:= Tries_3 + 1;
Recv_Msg:= '';
RecvByte:= SysSockRecv(hSocket:= hClientSocket, pbyBuffer:= ADR(Recv_Buf), diBufferSize:= 256, diFlags:= 0, pResult:= ADR(Result_SysSockRecv));
Step:= 4;
IF RecvByte > 0 THEN
Step:= 3;
Tries_3:= 0;
ELSIF
Tries_3 > 10
THEN
Tries_3:= 0;
Step:= 4;
END_IF;

4:
SysSockClose(hSocket:= hClientSocket);
Step:= 5;
Tries_4:= Tries_4 + 1;
5:
SysSockClose(hSocket:= hServerSocket);
Step:= 0;
Tries:= 0;
Tries_5:= Tries_5 + 1;
END_CASE;

Леонид
18.08.2014, 20:15
Ну и добавлю, чтоб не смущать, сторожевой таймер я отключил в процессе изысканий причины проблемы, а то ПЛК сваливался в "исключение".

capzap
18.08.2014, 20:26
Следите за указателем на результат, как только появится ошибка, смело закрывайте соединение и открывайте по новой, время сократится. Конечно всё в разумных пределах,ведь заоанее не известно сколько будет кабель отключен

Леонид
18.08.2014, 20:35
какой функции?
В онлайне посмотрел результаты все - 0, да и как то отреагировать программа не успевает, ПЛК вешается.

Леонид
19.08.2014, 18:07
Что-то чувствую идея сервера на базе ПЛК304 забуксовала!
:confused:

capzap
19.08.2014, 18:29
какой функции?
В онлайне посмотрел результаты все - 0, да и как то отреагировать программа не успевает, ПЛК вешается.

Да быть такого не может, насколько помню при разрыве кабеля, что то типа 519 ошибки должно было пробится, вот в этом коде
CASE state OF
TS_INIT:
diSocket:=SysSockCreate(SOCKET_AF_INET,SOCKET_STRE AM,SOCKET_IPPROTO_IP,pResult);
IF diSocket>0 AND diSocket<>16#FFFFFFFF THEN
inad.ulAddr := SOCKET_INADDR_ANY;
sa.sin_family := SOCKET_AF_INET;
sa.sin_port := SysSockHtons(PORT);
sa.sin_addr := inad;
IF (SysSockBind(diSocket,ADR(sa),SIZEOF(sa)))<0 THEN
state:=TS_CLOSE;
ELSIF (SysSockListen(diSocket,1))<0 THEN
state:=TS_CLOSE;
ELSE
SysSockIoctl(diSocket,SOCKET_FIONBIO,ADR(dnt));
state:=TS_OPEN;
END_IF
ELSE
;// state := TS_CLOSE;
END_IF
TS_OPEN:
sa_size:=SIZEOF(sa);
clSocket:= SysSockAccept(diSocket, ADR(sa), ADR(sa_size),pResult);
IF (*clSocket>0 AND*) clSocket<>16#FFFFFFFF THEN // ждет подключений клиентов и только тогда переходит в режим TS_WAIT
SysSockIoctl(clSocket,SOCKET_FIONBIO,ADR(dnt));
state:=TS_WAIT;
tx:=TIME_TO_DWORD(TIME());
END_IF
TS_CLOSE:
state:=TS_PAUSE;
tx:=TIME_TO_DWORD(TIME());
TS_WAIT:
rcvCount:=SysSockRecv(clSocket,ADR(RXTXBuf[0]),256,0,pResult);
IF rcvCount>0 THEN
disp(staff:=ADR(RXTXBuf));
SysMemSet(ADR(RXTXBuf[8]),0,248);
IF disp.unitID <> 1 THEN
funoff(unit:=disp.unitID);
SysMemCpy(ADR(RXTXBuf[4]),ADR(funoff.staff[0]),funtre.size+2);
pos:=WORD_TO_INT(funoff.size+6);
ELSE
CASE disp.kfunc OF
1:
fununo(data:=ADR(disp.data),unit:=disp.unitID);
SysMemCpy(ADR(RXTXBuf[4]),ADR(fununo.staff[0]),fununo.size+2);
pos:=WORD_TO_INT(fununo.size+6);
3:
funtre(data:=ADR(disp.data),unit:=disp.unitID);
SysMemCpy(ADR(RXTXBuf[4]),ADR(funtre.staff[0]),funtre.size+2);
pos:=WORD_TO_INT(funtre.size+6);
15:
fundecvis(data:=ADR(disp.data),unit:=disp.unitID);
SysMemCpy(ADR(RXTXBuf[4]),ADR(fundecvis.staff[0]),fundecvis.size+2);
pos:=WORD_TO_INT(fundecvis.size+6);
16:
fundecsei(data:=ADR(disp.data),unit:=disp.unitID);
SysMemCpy(ADR(RXTXBuf[4]),ADR(fundecsei.staff[0]),fundecsei.size+2);
pos:=WORD_TO_INT(fundecsei.size+6);
ELSE ;
END_CASE
END_IF
SysSockSend(clSocket,ADR(RXTXBuf[0]),pos,0,pResult);
tx:=TIME_TO_DWORD(TIME());
END_IF
IF (TIME_TO_DWORD(TIME())-tx)>timeouter THEN
IF clSocket>=0 THEN
state:=TS_OPEN;
END_IF
END_IF
TS_PAUSE:
IF (TIME_TO_DWORD(TIME())-tx)>5000 THEN
state:=TS_INIT;
END_IF
STOP:
IF clSocket>0 AND clSocket<>16#FFFFFFFF THEN
SysSockClose(clSocket);
clSocket:=16#00000000;
END_IF
IF diSocket>0 AND diSocket<>16#FFFFFFFF THEN
SysSockClose(diSocket);
diSocket:=16#00000000;
END_IF
ELSE
;
END_CASE;

Леонид
19.08.2014, 18:34
Спасибо!
Попробую поковырять Ваш пример, что выйдет отпишусь!

Леонид
19.08.2014, 19:38
А этот код был Вами реализован на ПЛК304?
Он работал?
Какая версия CoDeSys и библиотеки SysSocket использовалась?

И еще выложите пожалуйста, если не сложно, текст объявления переменных и структур.
Спасибо!

Леонид
24.08.2014, 15:26
На устройстве "CODESYS_Control_Win_V3" код работает, вытаскиваю провод из клиента и все нормально, программа продолжает работать, если тот же код сервера запустить или на ПЛК304 или на ПЛК308 и вытащить провод из клиента, то ПЛК зависают, втыкаю провод обратно ПЛК начинает снова работать только еще почему-то сильно увеличивается время скана.
Что делать?

capzap
24.08.2014, 16:24
Как то упустил тему из вида, так понимаю код сервера реализован и что там с указателями,как в моем коде pResult, я совой код конечно испытывал на 304 но этот пример как раз без контроля ошибок, а так их перечень в бибке cmperors, хотя в принципе это не важно, хотя бы в любом месте вернулось значение больше нуля, стоит переподключить соединение

Леонид
24.08.2014, 16:44
Как то упустил тему из вида, так понимаю код сервера реализован и что там с указателями,как в моем коде pResult, я совой код конечно испытывал на 304 но этот пример как раз без контроля ошибок, а так их перечень в бибке cmperors, хотя в принципе это не важно, хотя бы в любом месте вернулось значение больше нуля, стоит переподключить соединение

Он работал?
Какая версия CoDeSys и библиотеки SysSocket использовалась?

И еще выложите пожалуйста, если не сложно, текст объявления переменных и структур.
Спасибо!

Я все таки конкретно ваш код не пробовал, но я не вижу в нем принципиальных отличий.
Проблема в том , как я уже писал, что видимо ПЛК не успевает отреагировать на какие либо ошибки, так как мгновенно "подвисает", и выполнение прогрыммы останавливается, но стоит воткнуть провод обратно в ПЛК клиент как через некоторое время, программа сервера оживает!
Мне кажется что так должны работать сокеты в блокирующем режиме, но я ведь перевожу в НЕ блокирующий!

capzap
24.08.2014, 16:55
FUNCTION_BLOCK STATESOCKET
VAR
inad: INADDR;
diSocket : RTS_IEC_HANDLE;
clSocket : RTS_IEC_HANDLE;
state : BYTE := 1;
sa : SOCKADDRESS;
sa_size : DWORD;
RXTXBuf : ARRAY[0..255] OF BYTE;
dnt: DINT := 1;
tx: DWORD;
rcvCount: DINT;
pResult: POINTER TO RTS_IEC_RESULT;
timeouter: DWORD := 10000;
pos: INT;
disp: SLAVE_DISPATCHER;
funoff: SLAVE_NOT_UNITID;
fununo: SLAVE_RD_COILS;
funtre: SLAVE_RD_MULT_RG;
fundecvis: SLAVE_WR_COILS;
fundecsei: SLAVE_WR_MULT_RG;
hold_reg: ARRAY[0..255] OF BYTE;
END_VAR
VAR CONSTANT
STOP : BYTE := 0;
TS_INIT: BYTE := 1;
TS_OPEN: BYTE := 2;
TS_CLOSE: BYTE := 3;
TS_WAIT: BYTE := 4;
TS_PAUSE: BYTE := 5;
PORT: WORD := 502;
END_VAR
да работало на 304,это было давно, я бы уже по другому собрал сервак. И не будем забывать, что в 12 году с этим контроллером я работал в v3.4


А, нет, вру, вот реализация этого кода http://www.owen.ru/forum/showthread.php?t=11797&p=101265&viewfull=1#post101265

Леонид
24.08.2014, 17:19
FUNCTION_BLOCK STATESOCKET
VAR
inad: INADDR;
diSocket : RTS_IEC_HANDLE;
clSocket : RTS_IEC_HANDLE;
state : BYTE := 1;
sa : SOCKADDRESS;
sa_size : DWORD;
RXTXBuf : ARRAY[0..255] OF BYTE;
dnt: DINT := 1;
tx: DWORD;
rcvCount: DINT;
pResult: POINTER TO RTS_IEC_RESULT;
timeouter: DWORD := 10000;
pos: INT;
disp: SLAVE_DISPATCHER;
funoff: SLAVE_NOT_UNITID;
fununo: SLAVE_RD_COILS;
funtre: SLAVE_RD_MULT_RG;
fundecvis: SLAVE_WR_COILS;
fundecsei: SLAVE_WR_MULT_RG;
hold_reg: ARRAY[0..255] OF BYTE;
END_VAR
VAR CONSTANT
STOP : BYTE := 0;
TS_INIT: BYTE := 1;
TS_OPEN: BYTE := 2;
TS_CLOSE: BYTE := 3;
TS_WAIT: BYTE := 4;
TS_PAUSE: BYTE := 5;
PORT: WORD := 502;
END_VAR
да работало на 304,это было давно, я бы уже по другому собрал сервак. И не будем забывать, что в 12 году с этим контроллером я работал в v3.4


А, нет, вру, вот реализация этого кода http://www.owen.ru/forum/showthread.php?t=11797&p=101265&viewfull=1#post101265

А исходник этой библиотеки имеется?
Вы пробовали провода выдергивать?

capzap
24.08.2014, 17:26
ну раз я отчетливо помнб про 519 ошибку, значит проверял. А исходник есть или нет, не знаю, этот файл ПОУ из какой то версии, явно не самой последней, потому что помню что пытался контролировать ошибки

Леонид
24.08.2014, 17:46
http://www.owen.ru/forum/showthread....l=1#post101265 (http://www.owen.ru/forum/showthread.php?t=11797&p=101265&viewfull=1#post101265)
Насколько я понял это библиотека - Client_ModbusTCP.
До клиентской части я не дошел, пока МУЧАЮСЬ с серверной!

capzap
24.08.2014, 17:53
значит, всё таки в 12 было, вот еще бибка из 2.3, от самой S3, там расписан порядок запуска и сервера и клиента поддерживаемых контроллеров, в трешке нужно только с входными аргументами разобраться

http://www.owen.ru/forum/showthread.php?t=12947&p=85927&viewfull=1#post85927

Леонид
24.08.2014, 18:05
На 2.3 по разным примерам с форума я делал обмен между ПЛК, но не используя SysSockAccept, просто принимал и передавал по сокету открытому SysSockCreate и все там работало.
Короче я в шоке!

Леонид
24.08.2014, 18:11
Делаю все как в примере
https://www.youtube.com/watch?v=ThVLXygHnnU
на ПК сервер в связке с клиентом ПЛК100 работает, а на ПЛК304, ПЛК308 сервер в связке с тем-же клиентом ПЛК100 - виснет!

capzap
24.08.2014, 18:17
примеры на форуме конечно имеются, но я то говорю про разработку производителя КДС
Например проект на видео http://www.owen.ru/forum/showthread.php?t=14319&p=144478&viewfull=1#post144478 я делал по примеру во вложении

Леонид
24.08.2014, 18:34
примеры на форуме конечно имеются, но я то говорю про разработку производителя КДС
Например проект на видео http://www.owen.ru/forum/showthread.php?t=14319&p=144478&viewfull=1#post144478 я делал по примеру во вложении

Это к чему?
Короче - считаю СПЕЦИАЛЬНЫЙ КОММУНИКАЦИОННЫЙ КОНТРОЛЛЕР сырым, так как многий коммуникационный функционал легче, а иногда просто возможно, реализовать на стареньком ПЛК100.
А на 3хх както даже документации маловато!
В общем жду МОДЕРАТОРА, если не дождусь положу ПЛК304 на полочку пусть напоминает о бессмысленно потраченом времени и средствах!

capzap
24.08.2014, 18:42
Да ни к чему, это проект от компании S3, больше ни чего

capzap
25.08.2014, 08:48
Короче - считаю СПЕЦИАЛЬНЫЙ КОММУНИКАЦИОННЫЙ КОНТРОЛЛЕР сырым, так как многий коммуникационный функционал легче, а иногда просто возможно, реализовать на стареньком ПЛК100.
А на 3хх както даже документации маловато!
В общем жду МОДЕРАТОРА, если не дождусь положу ПЛК304 на полочку пусть напоминает о бессмысленно потраченом времени и средствах!

По поводу ошибок сокета, мне надо было в последнюю очередь спрашивать, если на win-е работает, а в реальном плк зависает, встает вопрос о времени мин.цикла, для 304 оно должно быть несколько больше аж двадцати миллисекунд, у Вас как? Попробуйте постепенно увеличивать, может зависания и пропадут

Леонид
25.08.2014, 17:12
Пробовал разное время вплоть аж до 1сек.
При ооочень больших значениях скана ПЛК вешается не всегда, и как-то странно приходят данные от клиента, не попадают в нужные индексы массива буфера приема!
Пробовал создать отдельное POU с вызовом из другого таска, так вот это POU работает в своем цикле не зависимо, от того что там происходит с POU сервера, т.е. я так понял подвисает не весь плк а только задача с сервером!

capzap
25.08.2014, 18:01
проект не доделал до конца и тем неменне запрос модбаса я получил, попробуйте. Кстати нашел я этот вариант, как раз из содержания справки КДС3

Леонид
25.08.2014, 23:41
Интересная какая-то конечно библиотека, но ПЛК304 я так понял она не поддерживается, а на винде у меня и сокеты работают адекватно. И вообще до реализации модбаса еще далеко, это уже дело техники, а вот сами сокеты не работаю, мне бы с эти разобраться, так как прийдется не только ModBus TCP Slave лепить для скады, но еще и организовывать сетевой обмен между кучкой ПЛК (не ОВЕН) по Ethernet.
Короче, возлагаю на него большие надежды, коммуникационный ПЛК ведь :mad:!!!

Леонид
26.08.2014, 00:28
Я скоро х.. , простите, напильник сломаю!
Короче время подтармаживания зависит даже от времени передачи сообщений клиентом, это наталкивает меня на мысль, что сокет не перевелся в неблокирующий режим.

Леонид
26.08.2014, 00:48
Короче отвечу сам себе!
Леонид, переводи и клиентский сокет в неблокирующий режим и будет тебе счастье!

Леонид
26.08.2014, 00:49
Короче отвечу сам себе!
Леонид, переводи и клиентский сокет в неблокирующий режим и будет тебе счастье!

Ой спасибо!
Чтоб я без Вас делал!

Ну а если серьезно, то спасибо "capzap" за оказанную непосильную помощь!

Может Вы еще знаете как пищалкой управлять?

capzap
26.08.2014, 05:30
Ой спасибо!
Чтоб я без Вас делал!

Ну а если серьезно, то спасибо "capzap" за оказанную непосильную помощь!

Может вы еще знаете как пищалкой управлять?
Че бы я примеры только под вин выкладывал, я в командировке. Кстати модбас сервер собрал сразу после как пример выложил,на ходовые функции 3 и 16.
А про блокирующий/неблокирующий, я как бы намекал об этом, выкладывал же пример от разработчика,там всё поминимуму

Леонид
26.08.2014, 11:14
Может Вы еще знаете как пищалкой управлять?
Очень хочется периодически включать пищалку - анализ жизни ПЛК.

capzap
26.08.2014, 11:28
Если пищалка это системный динамик, то погуглите какую в линуксе команду надо набрать, чтоб подать звуковой сигнал

Леонид
26.08.2014, 12:04
Я в линуксе "дуб"? но если провести аналогию по командам с систему как в СПК1хх, то даже команда "sysExecute(sys_command:= 'reboot')", не компилится проект, видимо не поддерживается.

capzap
26.08.2014, 12:11
Екзекут работает,даже пример есть http://www.owen.ru/forum/showthread.php?t=17003&p=134564&viewfull=1#post134564 другое дело что просто ребут не должен работать,надо указывать полный путь

Леонид
26.08.2014, 13:07
У меня говорит - [FATAL ERROR] Неразрешённая ссылка: 'SYSEXECUTE'.
Работаю в CDS3.5 SP5, таргет править нужно?

capzap
26.08.2014, 14:07
Что обе версии бибки ругаются

Леонид
27.08.2014, 00:03
В смысле 1.0.0.0 и 1.0.0.2, пробовал только функию в обоих случаях одинаковый результат.
ФБ не пробовал.

capzap
28.08.2014, 20:47
Очень хочется периодически включать пищалку - анализ жизни ПЛК.
через putty выполняется ли такая команда speaker-test -t sine -f 1000 -l 2 2>&1, правда не могу проверить есть ли она в busybox

Леонид
28.08.2014, 23:41
login as: root
root@192.168.1.34's password:
# speaker-test -t sine -f 1000 -l 2 2>&1
-sh: speaker-test: not found
#