Untitled

 avatar
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