Программа написана на C++, ПЛК Siemens 1515T. Соединение всегда было хорошим, но чтение/запись прерывались в каком-то интервальном режиме.
При первом запуске программы libmodbus смог установить соединение и успешно выполнить чтение/запись. Когда я запускал программу во второй раз, соединение все еще было хорошим, но чтение/запись не удалась из-за ошибки тайм-аута. И в третий раз чтение/запись были хорошими, а в четвертый - неудачными и так далее.
Я также пробовал Modbus Slave для имитации ПЛК, и каждый раз программа работала хорошо.
/>Мы с разработчиком ПЛК понятия не имеем об этой ситуации.
Может ли кто-нибудь дать нам предложение?
Пример кода:
bool ModbusDevice::connect() {
static std::shared_ptr logger = get_module_logger("PLC:connect");
logger->debug("Connecting to IP:{} Port:{}", _ip_address, _port);
mb_ctx = modbus_new_tcp(_ip_address, _port);
modbus_set_debug(mb_ctx, TRUE);
modbus_set_slave(mb_ctx, 1);
modbus_set_response_timeout(mb_ctx, 10, 1000000);
if (mb_ctx == nullptr) {
logger->error("Unable to allocate libmodbus context.");
return false;
}
modbus_set_debug(mb_ctx, FALSE);
if (modbus_connect(mb_ctx) == -1) {
logger->error("Connection failed with {}", modbus_strerror(errno));
modbus_free(mb_ctx);
mb_ctx = nullptr;
return false;
}
is_connect=1;
logger->info("Connected to Modbus device at {}:{}", _ip_address, _port);
return true;
}
bool ModbusDevice::readRegister(int address, int &message, int num_registers=1) {
static std::shared_ptr logger = get_module_logger("PLC:readRegister_Int");
logger->debug("Enter Address:{:#04x} Num:{}", address, num_registers);
std::lock_guard lock(mutex);
if (mb_ctx == nullptr) {
logger->error("[PLC:readRegister_Int] Not connected to any Modbus device.");
return false;
}
auto *value = new uint16_t[num_registers];
uint16_t result;
if (modbus_read_registers(mb_ctx, address, num_registers, value) == -1) {
logger->error("Failed to read register with {}", modbus_strerror(errno));
delete[] value;
return false;
} else {
message = static_cast(value[0]);
logger->info("Address:{:#04x} Num:{} Result:{}", address, num_registers , message);
return true;
}
}
Журналы ошибок:
Connecting to 10.40.103.132:502
Loading System is running, DO NOT CLOSE!!!
[00][01][00][00][00][06][01][06][00][63][00][00]
Waiting for a confirmation...
[00][01][00][00][00][06][01][03][00][14][00][01]
Waiting for a confirmation...
ERROR timed out: select
error Failed to read register with timed out
Подробнее здесь: https://stackoverflow.com/questions/793 ... erval-mann
Чтение/запись libmodbus прошла успешно, и результат истек по времени в своего рода интервальном режиме ⇐ C++
Программы на C++. Форум разработчиков
1736236532
Anonymous
Программа написана на C++, ПЛК Siemens 1515T. Соединение всегда было хорошим, но чтение/запись прерывались в каком-то интервальном режиме.
При первом запуске программы libmodbus смог установить соединение и успешно выполнить чтение/запись. Когда я запускал программу во второй раз, соединение все еще было хорошим, но чтение/запись не удалась из-за ошибки тайм-аута. И в третий раз чтение/запись были хорошими, а в четвертый - неудачными и так далее.
Я также пробовал Modbus Slave для имитации ПЛК, и каждый раз программа работала хорошо.
/>Мы с разработчиком ПЛК понятия не имеем об этой ситуации.
Может ли кто-нибудь дать нам предложение?
Пример кода:
bool ModbusDevice::connect() {
static std::shared_ptr logger = get_module_logger("PLC:connect");
logger->debug("Connecting to IP:{} Port:{}", _ip_address, _port);
mb_ctx = modbus_new_tcp(_ip_address, _port);
modbus_set_debug(mb_ctx, TRUE);
modbus_set_slave(mb_ctx, 1);
modbus_set_response_timeout(mb_ctx, 10, 1000000);
if (mb_ctx == nullptr) {
logger->error("Unable to allocate libmodbus context.");
return false;
}
modbus_set_debug(mb_ctx, FALSE);
if (modbus_connect(mb_ctx) == -1) {
logger->error("Connection failed with {}", modbus_strerror(errno));
modbus_free(mb_ctx);
mb_ctx = nullptr;
return false;
}
is_connect=1;
logger->info("Connected to Modbus device at {}:{}", _ip_address, _port);
return true;
}
bool ModbusDevice::readRegister(int address, int &message, int num_registers=1) {
static std::shared_ptr logger = get_module_logger("PLC:readRegister_Int");
logger->debug("Enter Address:{:#04x} Num:{}", address, num_registers);
std::lock_guard lock(mutex);
if (mb_ctx == nullptr) {
logger->error("[PLC:readRegister_Int] Not connected to any Modbus device.");
return false;
}
auto *value = new uint16_t[num_registers];
uint16_t result;
if (modbus_read_registers(mb_ctx, address, num_registers, value) == -1) {
logger->error("Failed to read register with {}", modbus_strerror(errno));
delete[] value;
return false;
} else {
message = static_cast(value[0]);
logger->info("Address:{:#04x} Num:{} Result:{}", address, num_registers , message);
return true;
}
}
Журналы ошибок:
Connecting to 10.40.103.132:502
Loading System is running, DO NOT CLOSE!!!
[00][01][00][00][00][06][01][06][00][63][00][00]
Waiting for a confirmation...
[00][01][00][00][00][06][01][03][00][14][00][01]
Waiting for a confirmation...
ERROR timed out: select
error Failed to read register with timed out
Подробнее здесь: [url]https://stackoverflow.com/questions/79335229/libmodbus-read-write-got-success-and-timed-out-result-in-a-kind-of-interval-mann[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия