Чтение/запись libmodbus прошла успешно, и результат истек по времени в своего рода интервальном режимеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Чтение/запись libmodbus прошла успешно, и результат истек по времени в своего рода интервальном режиме

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/793 ... erval-mann
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»