PDA

Просмотр полной версии : Помогите с ПЛК 308



desperadoes
22.09.2011, 13:00
Всем добрый день! Прошу помощи у знающих людей, решить следующую задачу:
1 Есть ПЛК 308 надо организовать сбор данных по RS485 с различных приборов.
2 И передовать их по Ethernet
3 А так же часть данных отображать на СП270 по RS485.
Какой протокол используется при передачи данных по Ethernet,
modbus TCP?

Ельцов Андрей
24.09.2011, 09:51
Добрый день.

Если у Вас только 1 вопрос, то тогда да. Данные нужно передавать по modbus TCP.

desperadoes
24.09.2011, 19:59
Здравствуйте! Спасибо за ответ. Для передачи modbus TCP надо использовать библиотеку modbus TCP? Где её можно найти? и описание на неё?
Помогите ещё в одном деле: Для опроса по modbus RTU я использую библиотеку modbas master, делаю все как написано в инструкции и в примере к ней, но ошибка появляется в этой строчке(com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)) не могу понять почему?

Евгений Сергеевич
04.10.2011, 14:17
to desperadoes
Пришлите пожалуйста программу архивом на support@owen.ru , так не глядя сказать трудно почему.

MoZart
28.01.2013, 17:55
Добрый день.
Присоединяюсь к автору.
Где взять библиотеку modbus TCP и описание на неё?

capzap
28.01.2013, 20:28
Добрый день.
Присоединяюсь к автору.
Где взять библиотеку modbus TCP и описание на неё?

Один из самых надежных, но трудных вариантов:
зайти на сайт http://oscat.de/downloadmanager/viewcategory/4-oscatnetwork.html
скачать библиотеку OSCAT Network CoDeSys 2.x
разобраться в исходниках какорганизован модбас клиент, то бишь мастер modbasТСР
и внедрить нужные блоки себе в проект

kgsh82
29.01.2013, 05:24
Есть способ немного проще....Вернее два. Через конфигурацию или ручками. Всё описано во встроенной справке. Вот кусочек второго метода:

PROGRAM TCP
VAR
mbserv: ModbusServer;
En:BOOL;
Res:BOOL;
IoDrvStartBusCycle: UDINT;
b:BOOL := TRUE;
END_VAR


IF b THEN
En := TRUE;
Res := FALSE;
mbserv.wPort := 502;
mbserv.pInputData := ADR( InputData1 );
mbserv.uiInputDataSize := 500;
mbserv.pOutputData := ADR( OutputData1 );
mbserv.uiOutputDataSize := 500;
mbserv.tTimeout := 0;
b := FALSE;
END_IF

mbserv.xEnable := En;
mbserv.xReset := Res;
mbserv( );
IF ( mbserv.xError ) THEN
mbserv.xReset := TRUE;
IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
ELSE
IoDrvStartBusCycle := Errors.ERR_OK;
END_IF


InputData1 - входные регистры (ф - 04)

OutputData1 - выходные (ф - 03)

ISh
06.02.2013, 16:49
Есть способ немного проще....Вернее два. Через конфигурацию или ручками.

Подскажите, каким образом можно преодолеть ограничение в 40 входных регистров, при использовании конфигуратора?

kgsh82
06.02.2013, 16:57
Подскажите, каким образом можно преодолеть ограничение в 40 входных регистров, при использовании конфигуратора?

Чем второй метод не нравится?

ISh
08.02.2013, 08:36
Чем второй метод не нравится?

Разобрался - понравился.:)
Только появилось два вопроса:
1) Опрашиваю ПЛК Лектусом - данные идут.
Перезагружаю ПЛК - связь не восстанавливается, всё время mbserv.xError = TRUE.
Еще раз перезагружаю ПЛК - связь восстановилась.
Как сделать, чтобы связь всегда поднималась?
2) Для чего нужны строки:

IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
IoDrvStartBusCycle := Errors.ERR_OK;И компилятор ругается, что "Идентификатор 'Errors' не задан".

kgsh82
10.02.2013, 20:11
Видимо надо инициализировать ФБ заново. Во вторник-среду появится возможность проверить. О результатах сообщю

kgsh82
11.02.2013, 08:22
Разобрался - понравился.:)
Только появилось два вопроса:
1) Опрашиваю ПЛК Лектусом - данные идут.
Перезагружаю ПЛК - связь не восстанавливается, всё время mbserv.xError = TRUE.
Еще раз перезагружаю ПЛК - связь восстановилась.
Как сделать, чтобы связь всегда поднималась?
2) Для чего нужны строки:

IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
IoDrvStartBusCycle := Errors.ERR_OK;И компилятор ругается, что "Идентификатор 'Errors' не задан".


Вообще этот код я взял из встроенной справки. Здесь Errors - компонент биб-ки Cmperrors

ISh
14.02.2013, 15:08
Вообще этот код я взял из встроенной справки. Здесь Errors - компонент биб-ки Cmperrors

Добавив явно библиотеку Cmperrors - компилятор ругаться перестал.

Ни с помощью справки, ни с документацией, ни с гуглом разобраться, что же такое IoDrvStartBusCycle, не получилось.

По поводу прекращения работы Модбас:
Если ПЛК не опрашивать, то перезугрузки ПЛК работу Модбас не останавливают.
Если ПЛК опрашивается, то Модбас отваливается, и далеко не с первой перезагрузкой удается восстановить его работу.

Переписал код на следующий:

mbserv.xEnable := En;

IF ( mbserv.xError ) THEN
CounterReset:= CounterReset + 1;
mbserv.xReset := TRUE;
IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
ELSE
mbserv.xReset := FALSE;
IoDrvStartBusCycle := Errors.ERR_OK;
END_IF

mbserv( );
связь стала восстанавливаться примерно за 60 секунд.
Так и должно быть?
Из справки следует, что связь должна восстанавливаться уже на следующий цикл:
"In case of a socket error the reset flag is set, normal request processing then should continue in the next cycle".

Sergeba
28.04.2018, 00:26
Использую TCP через конфигуратор. У меня проблема в том, что Lan-порт почти сразу отваливается с красным треугольником. В онлайне добрался до xReset - удаётся шину перегрузить, некоторое время работает и опять отваливается. Хотел, как в примере использовать функциональный блок, но что-то не удаётся прописать порт. Почему-то wPort не прописывается, когда ставлю точку после mbserv такой переменной в списке нет, хотя в контекстной подсказке появляется сообщение, что порт по умолчанию 502... Не понятно как его поменять?
Ещё не понял как вызвать функциональный блок ModbusServer с помощью ассистента ввода?



mbserv.wPort := 502;


В онлайне, добираюсь к этим переменным так Device.Application.ModbusTCP_Slave_Device.m_Modbus Server, но не пойму как к ним добраться из программы контроллера...