PDA

Просмотр полной версии : Получение данных с ПЛК73 и PLCWinNT



Dobrosed
23.10.2015, 12:37
Есть контроллер Овен ПЛК73 с некой программой, в которой настроены ModBus регистры для переменных. Пишу программу-сервер для опроса контроллера на Qt. В связи с этим возникло несколько вопросов:

1. Нужно ли что-то дописывать в программе контроллера, чтобы получать данные с него по ModBus RTU? Или достаточно того, что поставил галочки Modbus и указал регистры у каждой нужной переменной?

2. Если есть специалисты по Qt, то как правильно написать функцию для получения данных. Я написал вот так:

//Функция подключения к контроллеру
void MainWindow::on_comStart_triggered()
{
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
if ( info.portName() != config.value("PLC/COMPORT").toString() ) continue;
else {
port = info;
break;
}
}
if ( port.isNull() ) {
Log("Не удалось найти указанный порт для подключения к контроллеру!", "red");
return;
}
if ( port.isBusy() ) {
Log("Не удалось подключиться к контроллеру. Указанный порт используется другой программой!", "red");
return;
}
com.setPort(port);
if ( com.open(QIODevice::ReadWrite) ) {
connect(&com, SIGNAL(readyRead()), this, SLOT(comReady_read()));
Log("Подключение к контроллеру прошло успешно", "blue");
} else
Log("Не удалось подключиться к контроллеру!", "red");
}
//Функция чтения информации с контроллера
void MainWindow::comReady_read()
{
QByteArray msg = com.readAll();
if ( msg.length() > 0 ) {
Log("Сообщение от контроллера получено!", "blue");
Log(msg, "green");
}
Log("Удалось выполнить функцию comReady_read()", "blue");
}
Подключиться к контроллеру у меня удалось, а вот получить с него данные никак не получается. Никаких записей из функции comReady_read() на экран не выводилось. То есть функция ни разу не выполнялась.

Newcomer
23.10.2015, 12:57
А где вы в ПЛК73 порт Ethernet (протокол TCP) нашли ?

Dobrosed
23.10.2015, 13:05
А где вы в ПЛК73 порт Ethernet (протокол TCP) нашли ?

Согласен, поправил сообщение.

У меня и RS-485 нет, заказывали контроллер с платой ПИ73-5, думал она будет сразу припаяна и выведена сзади. А в итоге то ли она отдельно пришла, то ли её вообще нет. Заказчик пока не отдал все платы мне.

Yegor
23.10.2015, 13:51
Пишу программу-сервер для опроса контроллера на Qt.Если вы опрашиваете контроллер, то сервером является контроллер. Server — slave, Client — Master.
В программу контроллера для Codesys PLCWinNT надо что-то дописывать, чтобы я мог получать информацию с софт-контроллера по Modbus RTU/TCP?PLCWinNT вообще не знает про модбас. Тут правильнее говорить «писать с нуля», а не «дописывать». SysLibSockets, SysLibCom, и вперёд! Если нужно просто что-то отладить, то проще взять какой-нибудь симулятор модбас-слейва и пока (если) нет контроллера, всё делать с ним.
Если есть специалисты по Qt, то как правильно написать функцию для получения данных.Я не специалист по Qt, но выглядит этот код не очень хорошо. По крайней мере он не выглядит самодостаточно. Сейчас загуглил пример работы с последовательным портом и там как-то иначе всё. В вашем коде ни отркытия порта, ни выставления его параметров не вижу. И потом не забывайте, что сообщения могут фрагментироваться. Вам их предстоит собирать по кусочкам. А может, и вовсе велосипед изобретать не стоит? Есть же QModbus (http://qmodbus.sourceforge.net/), libmodbus (http://libmodbus.org/). С последним я и сам работал.

Newcomer
23.10.2015, 13:59
Yegor, а ПЛК110 может быть Client в сети Ethernet, если пользоваться конфигуратором ?

Dobrosed
23.10.2015, 14:24
Если вы опрашиваете контроллер, то сервером является контроллер. Server — slave, Client — Master.
И что в этом случае? В контроллере надо что-то дописывать? Или просто надо правильно к контроллеру обратиться? Или что-то отправить на контроллер надо, чтобы получить ответ?


Я не специалист по Qt, но выглядит этот код не очень хорошо. По крайней мере он не выглядит самодостаточно.
Это лишь кусок кода. Естественно, у меня написано всё более развёрнуто и, по-моему, правильно. Поправил код в сообщении, чтобы не смущало. Программа подключается к контроллеру (по крайней мере, занимает порт), но данные с него не читает. Мною используется библиотека QSerialPort, которая поставляется вместе с Qt.

Ещё один вопрос. При подключении к Debug RS232 обычные методы получения данных не сработают же?

Про PLCWinNT забыли, если нужно что-то дописывать. Лучше поищу симулятор modbus slave.

Yegor
23.10.2015, 14:34
И что в этом случае? В контроллере надо что-то дописывать? Или просто надо правильно к контроллеру обратиться? Или что-то отправить на контроллер надо, чтобы получить ответ?В ПЛК73 я тоже не спец. Да и замечание было просто по терминологии.
Это лишь кусок кода. Естественно, у меня написано всё более развёрнуто и, по-моему, правильно. Программа подключается к контроллеру (по крайней мере, занимает порт), но данные с него не читает. Мною используется библиотека QSerialPort, которая поставляется вместе с Qt.Попробуйте прочитать порт чем-нибудь готовым. Можно даже тупо стандартными средствами в консоль (http://www.sevenforums.com/general-discussion/356229-reading-serial-port-command-line-post2967739.html?#post2967739) или в файл (http://stackoverflow.com/questions/19489733/batch-file-receive-data-from-the-serial-port-and-write-it-into-txt-file) данные пустить. И наоборот — заведомо отправляющее данные устройство к порту подключите вместо ПЛК.
При подключении к Debug RS232 обычные методы получения данных не сработают же?Дебаговый порт на 110 серии ждёт подключение кодесисом, насолько я знаю. А в конфигураторе он должен быть мастером, но тут лучше пускай ещё кто-нибудь скажет.
Yegor, а ПЛК110 может быть Client в сети Ethernet, если пользоваться конфигуратором ?В своей теме ответ смотрите.