Просмотр полной версии : Помогите с ПЛК 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 , так не глядя сказать трудно почему.
Добрый день.
Присоединяюсь к автору.
Где взять библиотеку modbus TCP и описание на неё?
Добрый день.
Присоединяюсь к автору.
Где взять библиотеку modbus TCP и описание на неё?
Один из самых надежных, но трудных вариантов:
зайти на сайт http://oscat.de/downloadmanager/viewcategory/4-oscatnetwork.html
скачать библиотеку OSCAT Network CoDeSys 2.x
разобраться в исходниках какорганизован модбас клиент, то бишь мастер modbasТСР
и внедрить нужные блоки себе в проект
Есть способ немного проще....Вернее два. Через конфигурацию или ручками. Всё описано во встроенной справке. Вот кусочек второго метода:
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)
Есть способ немного проще....Вернее два. Через конфигурацию или ручками.
Подскажите, каким образом можно преодолеть ограничение в 40 входных регистров, при использовании конфигуратора?
Подскажите, каким образом можно преодолеть ограничение в 40 входных регистров, при использовании конфигуратора?
Чем второй метод не нравится?
Чем второй метод не нравится?
Разобрался - понравился.:)
Только появилось два вопроса:
1) Опрашиваю ПЛК Лектусом - данные идут.
Перезагружаю ПЛК - связь не восстанавливается, всё время mbserv.xError = TRUE.
Еще раз перезагружаю ПЛК - связь восстановилась.
Как сделать, чтобы связь всегда поднималась?
2) Для чего нужны строки:
IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
IoDrvStartBusCycle := Errors.ERR_OK;И компилятор ругается, что "Идентификатор 'Errors' не задан".
Видимо надо инициализировать ФБ заново. Во вторник-среду появится возможность проверить. О результатах сообщю
Разобрался - понравился.:)
Только появилось два вопроса:
1) Опрашиваю ПЛК Лектусом - данные идут.
Перезагружаю ПЛК - связь не восстанавливается, всё время mbserv.xError = TRUE.
Еще раз перезагружаю ПЛК - связь восстановилась.
Как сделать, чтобы связь всегда поднималась?
2) Для чего нужны строки:
IoDrvStartBusCycle := Errors.ERR_SOCK_NOTCONNECTED;
IoDrvStartBusCycle := Errors.ERR_OK;И компилятор ругается, что "Идентификатор 'Errors' не задан".
Вообще этот код я взял из встроенной справки. Здесь Errors - компонент биб-ки Cmperrors
Вообще этот код я взял из встроенной справки. Здесь 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".
Использую TCP через конфигуратор. У меня проблема в том, что Lan-порт почти сразу отваливается с красным треугольником. В онлайне добрался до xReset - удаётся шину перегрузить, некоторое время работает и опять отваливается. Хотел, как в примере использовать функциональный блок, но что-то не удаётся прописать порт. Почему-то wPort не прописывается, когда ставлю точку после mbserv такой переменной в списке нет, хотя в контекстной подсказке появляется сообщение, что порт по умолчанию 502... Не понятно как его поменять?
Ещё не понял как вызвать функциональный блок ModbusServer с помощью ассистента ввода?
mbserv.wPort := 502;
В онлайне, добираюсь к этим переменным так Device.Application.ModbusTCP_Slave_Device.m_Modbus Server, но не пойму как к ним добраться из программы контроллера...
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot