PDA

Просмотр полной версии : ПЛК 110-32M slave, libmodbus TCP, ошибка чтения регистров: Bad file descriptor



SerJK
21.04.2014, 12:08
Доброго времени суток!

Прошу помощи в подключении ПЛК 110-32М к ПК в режиме slave
ПЛК подключен по TCP напрямую к сетевой карте ПК без роутера.
CodeSys по сети работает отлично.

Для получения данных из ПЛК использую программу на QT, libmodbus
Программа довольно стандартная,
подключение к ПЛК проходит без ошибок, а при чтении выдается ошибка -1 Bad file descriptor
перепробовал все функции чтения - результат одинаковый.
Связь с тестовым сервером из комплекта драйвера работает отлично (libmodbus-3.0.6\tests\bandwidth-server-many-up.exe)
ПЛК проверил два экземпляра, сейчас ещё 110-32L проверил - Результат отрицательный
Попробовал программу QModMaster - на машине с ПЛК не подключается, на моей машине с эмулятором работает отлично.
Значит практически наверняка я что-то не так делаю в настройках ПЛК. Вопрос, что именно?


Конфигурация ПЛК
Вывод программы


12678
12679


Инфо о ПЛК:

PLCInfo
PLC model MODEL PLC 110-32
Binary VERSION 2.14.0
Need Target version 2.10
Compiled: 14:37:41 Apr 28 2011
MAC 0A:06:0A:0A:0A:0A
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited


Код программы C++

void MainWindow::on_modbusButton_pressed()
{
modbus_t *mb;
uint8_t tab_reg[6];
int res;
char* ip; // = "10.0.6.10";
int port; //=502;
ip = ui->plcIPLineEdit->text().toLatin1().data();
port = ui->plcPortLineEdit->text().toInt();

mb = modbus_new_tcp(ip, port);
ui->plcReturnText->appendPlainText(QString("Create connection host=").append(QString(ip)).append(" port=").append(QString::number(port)).append(" mb=").append(QString::number((int)((char*)mb))));
if(mb == NULL) {
ui->plcReturnText->appendPlainText(modbus_strerror(errno));
return;
}
modbus_set_debug(mb, TRUE);
modbus_set_slave(mb,255);

res = modbus_connect(mb);
ui->plcReturnText->appendPlainText(QString("Connect. Res=") + QString::number(res));
if (res == -1) {
ui->plcReturnText->appendPlainText(modbus_strerror(errno));
modbus_free(mb);
return;
}

/* Read 1 register from the address plcByteLineEdit */
res = modbus_read_bits(mb, ui->plcByteLineEdit->text().toInt(), 1, tab_reg);
//
// Процедура чтения всегда возвращает ошибку -1 Bad file descriptor
//
ui->plcReturnText->appendPlainText(QString("Read. Res=") + QString::number(res));
if (res == -1) {
ui->plcReturnText->appendPlainText(modbus_strerror(errno));
modbus_close(mb);
modbus_free(mb);
return;
}


ui->plcReturnText->appendPlainText(QString("Done!!! Value=") + QString::number(tab_reg[0]));

modbus_close(mb);
modbus_free(mb);
}

SerJK
22.04.2014, 12:12
Таки победил
Проблема была в номере slave устройства при вызове функции modbus_set_slave. В примерах я видел значения 71 и 255, у меня заработало со значением 1.
QModMaster изначально не работал из-за странного способа ввода IP адреса
010.000.006.010 не работал
10_.0__.6__.10_ заработал
В диагностике помог совет поддержки ОВЕНа использовать WireShark для анализа сетевого трафика
Но запутал совет использовать для проверки взаимодействия с ПЛК программу Modbus Tester, первая что нашлась с таким именем не умеет работать по TCP, других программ с таким названием не нашел.