Untitled
unknown
plain_text
a month ago
5.5 kB
5
Indexable
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPort>
#include <QTimer>
#include <QInputDialog>
#include "teclado.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->stackedWidget->setCurrentIndex(0);
ui->setupUi(this);
// 1. CONFIGURAÇÃO DO HARDWARE RS-485
modbusDevice = new QModbusRtuSerialMaster(this);
// ATENÇÃO: Ajuste para a porta real da COM
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "/dev/ttyS5");//COM5
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusDevice->setTimeout(1000);
modbusDevice->setNumberOfRetries(3);
// Conecta na porta física
if (modbusDevice->connectDevice()) {
ui->labelStatus->setText("Porta Serial Aberta!");
} else {
ui->labelStatus->setText("Erro na Porta Serial!");
}
// 2. TEMPORIZADOR DE LEITURA (Lê o CLP a cada 1 segundo)
QTimer *timerModbus = new QTimer(this);
connect(timerModbus, &QTimer::timeout, this, &MainWindow::solicitarDadosCLP);
timerModbus->start(1000);
}
MainWindow::~MainWindow()
{
if (modbusDevice) modbusDevice->disconnectDevice();
delete ui;
}
// 3. ENVIA A PERGUNTA AO CLP
void MainWindow::solicitarDadosCLP()
{
if (!modbusDevice || modbusDevice->state() != QModbusDevice::ConnectedState) return;
// Pede para ler 10 registradores de uma vez (Do endereço 0 ao 9)
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10);
if (auto *reply = modbusDevice->sendReadRequest(readUnit, 5)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, &MainWindow::lerRespostaModbus);
} else {
delete reply;
}
}
}
// 4. ATUALIZA A LÂMPADA E O DISPLAY
void MainWindow::lerRespostaModbus()
{
auto reply = qobject_cast<QModbusReply *>(sender());
if (!reply) return;
if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result();
// CONCEITO: MOSTRAR O VALOR (Display)
// Lemos o valor do endereço 9
int temperatura = unit.value(9);
ui->displayTemp->display(temperatura); // Atualiza o painel digital
// CONCEITO: LÂMPADA (Ligar/Desligar visualmente)
// Lemos o status do motor no endereço 0
int statusMotor = unit.value(0);
if (statusMotor == 1) {
// Fica Verde
ui->labelLampada->setStyleSheet("background-color: rgb(0, 255, 0); border-radius: 15px;");
ui->labelLampada->setText("LIGADO");
} else {
// Fica Vermelho ou Cinzento
ui->labelLampada->setStyleSheet("background-color: rgb(150, 150, 150); border-radius: 15px;");
ui->labelLampada->setText("DESLIGADO");
}
}
reply->deleteLater();
}
// 5. BOTÃO LIGA/DESLIGA INTELIGENTE (Toggle)
void MainWindow::on_btnMotor_clicked()
{
if (!modbusDevice || modbusDevice->state() != QModbusDevice::ConnectedState) return;
// Prepara para escrever 1 valor no endereço 0
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1);
// Lê o texto atual da tela para saber se deve ligar ou desligar
int comandoInverso = (ui->labelLampada->text() == "LIGADO") ? 0 : 1;
writeUnit.setValue(0, comandoInverso);
// Envia para o Slave 5
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 5)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, reply]() {
if (reply->error() != QModbusDevice::NoError) {
ui->labelStatus->setText("Erro ao enviar comando!");
}
reply->deleteLater();
});
} else {
reply->deleteLater();
}
}
}
// 6. TECLADO COM MEMÓRIA DE SETPOINT
void MainWindow::on_btnTeclado_clicked()
{
// 1. Lê o valor que está no display
int valorAtual = ui->displayTemp->intValue();
// 2. Abre o seu Teclado Numérico Gigante!
Teclado numpad(valorAtual, this);
// 3. Se o operador clicou no botão OK Verde do seu teclado
if (numpad.exec() == QDialog::Accepted) {
// Puxa o número que ele digitou
int novoValor = numpad.getValorDigitado();
// Envia o novo valor para o registrador 1 do CLP
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 1, 1);
writeUnit.setValue(0, novoValor);
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 5)) {
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
}
}
}
void MainWindow::on_btnIrOperacao_clicked()
{
// Vai para a tela de Operação (Página 2, que no código é o índice 1)
ui->stackedWidget->setCurrentIndex(1);
}
void MainWindow::on_btnVoltarMenu_clicked()
{
// Volta para o Menu Principal (Página 1, que no código é o índice 0)
ui->stackedWidget->setCurrentIndex(0);
}
Editor is loading...
Leave a Comment