Russian Qt Forum
Апрель 26, 2024, 18:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3] 4 5 ... 58
31  Qt / Вопросы новичков / Re: Modbus RTU. Запись в modbus регистр. : Февраль 25, 2023, 17:21
Спасибо, но не помогло Грустный должен отправлять 01 06 00 01 00 05 18 09. А отправляет 01 06 00 01 00 00 D8 0A
Это из-за особенности (или ошибки?) QModbusDataUnit, фрагмент
Код
C++ (Qt)
   QModbusDataUnit writeUnit;
   writeUnit.setRegisterType(QModbusDataUnit::HoldingRegisters);
   writeUnit.setStartAddress(reg);
   writeUnit.setValueCount(1);
   writeUnit.setValue(0,data);
Нужно заменить на
Код
C++ (Qt)
   QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, reg, 1);
   writeUnit.setValue(0,data);
 
Почему так, не вникал, но можете почитать здесь: https://forum.qt.io/topic/90552/qmodbusdataunit-bug/4

Еще есть ошибка в слоте on_pushButton_write_clicked (там у вас вместо адреса устройства передается стартовый регистр). Нужно
Код
C++ (Qt)
void MainWindow::on_pushButton_write_clicked()
{
   write_registr(ui->spinBox_addr->value(), ui->spinBox_reg->value(), ui->spinBox_writedata->value());//ui->spinBox_writedata->value()
}
 

32  Qt / Вопросы новичков / Re: Modbus RTU. Запись в modbus регистр. : Февраль 25, 2023, 16:28
и в чем тут ошибка? Улыбающийся
Согласен, был не прав, погорячился))
33  Qt / Вопросы новичков / Re: Modbus RTU. Запись в modbus регистр. : Февраль 24, 2023, 20:10
Ошибка здесь:
Код:
    if (QModbusReply *lastRequest = modbusDevice->sendWriteRequest(writeUnit, num_device)){
Надо исправить на:
Код
C++ (Qt)
   QModbusReply *lastRequest = modbusDevice->sendWriteRequest(writeUnit, num_device);
   if (lastRequest){
 
То же самое и в read_registr.
34  Qt / Общие вопросы / Re: Категория журналирования QLoggingCategory : Февраль 20, 2023, 18:57
Так и сделал. В конструкторе класса использовал setProperty("rtu_via_tcp", true), при создании объекта проверяю obj.property("rtu_via_tcp").isValid().
Сделал и выбросил на помойку Улыбающийся
Ограничился фильтром QLoggingCategory::setFilterRules(QString("qt.modbus.warning = false"));
Таким образом потеряю пару лишних предупреждений, но с этим можно мириться.
35  Qt / Общие вопросы / [Решено] Категория журналирования QLoggingCategory : Февраль 20, 2023, 12:00
Коллеги,
понадобилось мне в одном из модулей Qt подкрутить журналирование. Я создал новую категорию, например,
Код
C++ (Qt)
Q_DECLARE_LOGGING_CATEGORY(MODBUS_RTU_VIA_TCP),
присвоил ей имя
Код
C++ (Qt)
Q_LOGGING_CATEGORY(MODBUS_RTU_VIA_TCP, "qt.modbus.rtu_via_tcp")
Соответственно, в модуле использую
qCWarning(MODBUS_RTU_VIA_TCP) << что-то там...
Это все я затеял, для того, чтобы фильтром
Код
C++ (Qt)
QLoggingCategory::setFilterRules(QString("qt.modbus.rtu_via_tcp = false"));
управлять записью в журнал некоторых специфических сообщений, которые мне не нужны.
Но беда в том, что в проме я не везде могу апдейтить эти библиотеки. Поэтому кое-где мне вместо вышеуказанного фильтра придется ставить
Код
C++ (Qt)
QLoggingCategory::setFilterRules(QString("qt.modbus* = false"));
Вопрос состоит в том, как определить, существует ли категория MODBUS_RTU_VIA_TCP с именем "qt.modbus.rtu_via_tcp"?

Заглянул в исходники qloggingcategory.h, там определен макрос
Код
C++ (Qt)
#define Q_DECLARE_LOGGING_CATEGORY(name) \
   extern const QLoggingCategory &name();
 
Т.е. определяется глобальная переменная. Знаю, что средствами C++ проверить наличие переменных невозможно. Но, может быть, в Qt есть какое-нибудь средство для этого?

PS Пока составлял это сообщение, появилась мысль - в классе создать property, которую можно проверять. Правда, это не очень удобно, но надо подумать.
36  Компиляторы и платформы / Linux / [Решено] Статическая привязка USB-устройств к портам : Февраль 17, 2023, 00:13
Коллеги,
к малине подключены два преобразователя интерфейса USB/RS-485, операционная система назначает им имена:
Код:
sergek@Home:~ $ ls -l /dev/*US*
crwxrwxrwx 1 root dialout 188, 0 фев  7 18:20 /dev/ttyUSB0
crwxrwxrwx 1 root dialout 188, 1 фев  7 18:20 /dev/ttyUSB1
При длительной работе операционная система иногда меняет эти имена (по какой причине, не знаю, но недопустимо часто - иногда два раза в сутки, иногда пару раз за неделю):
Код:
sergek@Home:~ $ ls -l /dev/*US*
crwxrwxrwx 1 root dialout 188, 2 фев  8 10:12 /dev/ttyUSB2
crwxrwxrwx 1 root dialout 188, 3 фев  8 10:12 /dev/ttyUSB3
Естественно, программа, подключенная к этим портам по именам ttyUSB0, ttyUSB1 перестает работать.
Чтобы программа использовала постоянные имена, сделал симлинки с помощью правил /etc/udev/rules.d/90-converters.rules:
Код:
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="0000", SYMLINK+="USR103", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="USR101", MODE="0777"

Теперь ссылки на порты, с которыми работает моя программа, не меняются, даже если операционка изменила их имена:
Код:
lrwxrwxrwx 1 root root         7 фев  8 10:12 /dev/USR101 -> ttyUSB2
lrwxrwxrwx 1 root root         7 фев  8 10:12 /dev/USR103 -> ttyUSB3
Код:
lrwxrwxrwx 1 root root         7 фев 12 14:59 /dev/USR101 -> ttyUSB0
lrwxrwxrwx 1 root root         7 фев 16 19:46 /dev/USR103 -> ttyUSB2
Но подключение к физическим портам при смене их имен пропадает, программа все равно теряет соединение и перестает работать. Приходится ее перезапускать.
Подскажите, пожалуйста, есть ли способ восстановить подключение кроме переоткрытия порта в самой программе?
37  Qt / Общие вопросы / Re: Запуск SUDO из-под обычного пользователя : Февраль 15, 2023, 21:58
Во-первых, "обычный пользователь" должен быть включен в группу sudo.
Вот работающий пример (password - пароль пользователя):

Код
C++ (Qt)
void CLanConfig::chmod() {
   QStringList arguments;
   arguments << "-c" << "echo " + password + " | sudo -S chmod o+r " + path;
   process.start("/bin/sh", arguments);
   process.waitForFinished();
}
38  Qt / Общие вопросы / Re: программа зависает (Tcp network) : Февраль 11, 2023, 19:41
Не я один. В сети есть предположения, что make ошибается с зависимостями при многопоточной сборке.
39  Qt / Общие вопросы / Re: программа зависает (Tcp network) : Февраль 11, 2023, 19:00
Можно попробовать убрать опцию -j6 и пересобрать проекты. У меня случалось, что при такой сборке программы сбоили, с тех пор я ее никогда не использую.
40  Qt / Общие вопросы / Re: подскажите пожалуйста как задать иконку для .exe (исполняймого файла) : Январь 27, 2023, 11:37
Ну и где тут в профайле строка
Код:
RC_FILE = myapp.rc
?
41  Qt / Общие вопросы / Re: помогите пожалуйста соеденить два кода : Январь 24, 2023, 22:52
так а что не получается-то?
Что не понятно? "пытылся" "соеденить" и не получилось. "Памагите!!"
42  Qt / Многопоточное программирование, процессы / Re: Глобальная переменная в потоках : Декабрь 30, 2022, 13:22
Как я уже упомянул, синхронизация при чтении меня не особо заботит - процесс циклический и пропуск или, наоборот, лишний сигнал не помешает. Нужно лишь включить или выключить профайлер.
Поэтому atomic_bool по сравнению с volatile мне видится чересчур "достаточным" Подмигивающий
Впрочем, простая с виду тема затянулась, и это чревато тем, что не все начинают заглядывать, с чего все начиналось.
43  Qt / Общие вопросы / Re: программа не запускается : Декабрь 29, 2022, 14:13
Выложите полный архив проекта, если хотите, чтобы вам помогли.
А пока: удалите все Makefile.*, *.user и объектные файлы, повторите qmake и make.
44  Qt / Многопоточное программирование, процессы / Re: Глобальная переменная в потоках : Декабрь 27, 2022, 09:16
не важно не удалит ли его код компилятор? тогда зачем этот код нужен?
Это единственное, что меня напрягает. Но все работает...
А если использовать волшебное "volatile", этого достаточно?
45  Qt / Многопоточное программирование, процессы / Re: Глобальная переменная в потоках : Декабрь 23, 2022, 13:28
Уточню.
если достоверность profilerIsActive не сильно важна, то мутекс вообще можно убрать
Нельзя. Потому что одновременная запись - это, как уже сказано, UB. Неопределенность я понимаю в широком смысле: если несколько потоков пишут туда true, то состояние переменной может оказаться каким угодно, например, false (хотя откуда оно там возьмется? Улыбающийся).
А вот при чтении, в моем конкретном случае, UB не сильно беспокоит. Ну один раз я прочту не то, что на самом деле должно быть в переменной, это приведет к тому, что либо будет пропущен сигнал или, наоборот, будет эмитирован лишний. Именно в моей задаче это не принципиально.
Спасибо всем.
Страниц: 1 2 [3] 4 5 ... 58

Страница сгенерирована за 0.273 секунд. Запросов: 23.