You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Cigarette/Cigarette/plcsetup.cpp

294 lines
8.3 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "plcsetup.hpp"
#include "common.h"
#include <iostream>
#include <fstream>
#include <thread>
#include <qdebug.h>
#include <qlineedit.h>
#include <qmessagebox.h>
#include <QIntValidator>
#include "PLCDevice.h"
#define PLC_ITEM_FILE "../conf/plc.txt"
extern PLCDevice * m_PLCDevice;
extern bool g_plc_dialog_open; //是否打开plc配置对话框
void task_osk_()
{
system("start /b C:\\Windows\\system32\\osk.exe");
}
PlcSetup::PlcSetup(QWidget * parent) : QDialog(parent) {
ui.setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);
read_plc_items();
ui.tableWidget->setColumnCount(7);
ui.tableWidget->setRowCount(m_plc_items.size());
QStringList header_list;
header_list << QStringLiteral("功能描述") << QStringLiteral("读数值")
<< QStringLiteral("读操作") << QStringLiteral("写数值") << QStringLiteral("写操作") << QStringLiteral("保存") << QStringLiteral("备注") ;
ui.tableWidget->setHorizontalHeaderLabels(header_list);
ui.tableWidget->setColumnWidth(0, 200);
ui.tableWidget->setColumnWidth(1, 100);
ui.tableWidget->setColumnWidth(2, 50);
ui.tableWidget->setColumnWidth(3, 100);
ui.tableWidget->setColumnWidth(4, 50);
ui.tableWidget->setColumnWidth(5, 50);
ui.tableWidget->setColumnWidth(6, 390);
ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑
for (int i = 0; i < m_plc_items.size(); i++)
{
ui.tableWidget->setItem(i, 0, new QTableWidgetItem(QString::fromLocal8Bit(m_plc_items[i].func_desc.c_str())));
//ui.tableWidget->setItem(i, 1, new QTableWidgetItem(QString::number(m_plc_items[i].address)));
QPushButton * pBtnR = new QPushButton();
pBtnR->setText(QStringLiteral(""));
connect(pBtnR, SIGNAL(clicked(bool)), this, SLOT(click_read()));
ui.tableWidget->setCellWidget(i, 2, pBtnR);
QLineEdit *edit = new QLineEdit();
edit->setValidator(new QIntValidator(0, 100000, this));
ui.tableWidget->setCellWidget(i, 3, edit);
QPushButton * pBtnW = new QPushButton();
pBtnW->setText(QStringLiteral(""));
connect(pBtnW, SIGNAL(clicked(bool)), this, SLOT(click_write()));
ui.tableWidget->setCellWidget(i, 4, pBtnW);
QPushButton * pBtnS = new QPushButton();
pBtnS->setText(QStringLiteral("保存"));
connect(pBtnS, SIGNAL(clicked(bool)), this, SLOT(click_save()));
ui.tableWidget->setCellWidget(i, 5, pBtnS);
ui.tableWidget->setItem(i, 6, new QTableWidgetItem(QString::fromLocal8Bit(m_plc_items[i].memo.c_str())));
}
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
m_pTimer->setSingleShot(true);
m_pTimer->start(1000);
}
PlcSetup::~PlcSetup() {
}
void PlcSetup::click_read()
{
QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender());
if (NULL == pushButton_)
{
return;
}
int x = pushButton_->frameGeometry().x();
int y = pushButton_->frameGeometry().y();
QModelIndex index = ui.tableWidget->indexAt(QPoint(x, y));
int row = index.row();
int column = index.column();
int addr = m_plc_items[row].address;
uint8_t dest[4];
uint16_t * dest16 = (uint16_t *)dest;
memset(dest, 0, 4);
if (addr > 0)
{
if (addr < 40000) //读取线圈值 bit
{
int ret = m_PLCDevice->read_bits_from_plc(addr, 1, dest);
ui.tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(dest[0])));
}
else { //读取DWORD值4字节
int ret = m_PLCDevice->read_short_from_plc( addr, 2, dest16);
//printf("%x ", dest16[0]);
//printf("%x \n", dest16[1]);
//printf("%d \n", dest16[0] + (dest16[1] << 16));
ui.tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(dest16[0] + (dest16[1] << 16))));
}
}
}
void PlcSetup::click_write()
{
QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender());
if (NULL == pushButton_)
{
return;
}
int x = pushButton_->frameGeometry().x();
int y = pushButton_->frameGeometry().y();
QModelIndex index = ui.tableWidget->indexAt(QPoint(x, y));
int row = index.row();
int column = index.column();
//std::cout << "row:" << row << "\tcol:" << column << std::endl;
int addr = m_plc_items[row].address;
QWidget *widget=ui.tableWidget->cellWidget(row,3);
QLineEdit *edit=(QLineEdit*)widget;
QString d = edit->text();
uint8_t dest[4];
uint16_t * dest16 = (uint16_t *)dest;
memset(dest, 0, 4);
if (d.length() > 0)
{
int data = d.toInt();
if (addr > 0)
{
if (addr < 40000) //写入线圈值 bit
{
if (data != 0) data = 1;
int ret = m_PLCDevice->write_bit_2_plc( addr, data);
}
else { //写入DWORD值4字节
dest16[0] = (data & 0xffff);
dest16[1] = (data>>16);
int ret = m_PLCDevice->write_short_2_plc(addr, 2, dest16);
}
}
QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("写入成功"), QMessageBox::Ok);
}
}
void PlcSetup::click_save()
{
QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender());
if (NULL == pushButton_)
{
return;
}
int x = pushButton_->frameGeometry().x();
int y = pushButton_->frameGeometry().y();
QModelIndex index = ui.tableWidget->indexAt(QPoint(x, y));
int row = index.row();
int column = index.column();
//std::cout << "row:" << row << "\tcol:" << column << std::endl;
int addr = m_plc_items[row].address;
QWidget *widget = ui.tableWidget->cellWidget(row, 3);
QLineEdit *edit = (QLineEdit*)widget;
QString d = edit->text();
uint8_t dest[4];
uint16_t * dest16 = (uint16_t *)dest;
memset(dest, 0, 4);
if (d.length() > 0)
{
int data = d.toInt();
if (addr > 0)
{
if (addr < 40000) //写入线圈值 bit
{
if (data != 0) data = 1;
int ret = m_PLCDevice->write_bit_2_plc( addr, data);
}
else { //写入DWORD值4字节
dest16[0] = (data & 0xffff);
dest16[1] = (data >> 16);
int ret = m_PLCDevice->write_short_2_plc(addr, 2, dest16);
}
}
//int data = d.toInt();
for (int i = 0; i < m_plc_items.size(); i++)
{
//std::cout << m_plc_items[i].address << std::endl;
if (m_plc_items[i].address == addr)
{
//std::cout << "Hit" << addr << std::endl;
m_plc_items[i].value = data;
//std::cout << "SAVE start" << std::endl;
save_plc_items();
//std::cout << "SAVE END" << std::endl;
QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("写入并且保存成功"), QMessageBox::Ok);
break;
}
}
}
}
void PlcSetup::on_toolButton_batch_read_released()
{
for (int i = 0; i < m_plc_items.size(); i++)
{
int addr = m_plc_items[i].address;
uint8_t dest[4];
uint16_t * dest16 = (uint16_t *)dest;
memset(dest, 0, 4);
if (addr > 0)
{
if (addr < 40000) //读取线圈值 bit
{
int ret = m_PLCDevice->read_bits_from_plc(addr, 1, dest);
ui.tableWidget->setItem(i, 1, new QTableWidgetItem(QString::number(dest[0])));
}
else { //读取DWORD值4字节
int ret = m_PLCDevice->read_short_from_plc( addr, 2, dest16);
ui.tableWidget->setItem(i, 1, new QTableWidgetItem(QString::number(dest16[0] + (dest16[1] << 16))));
}
}
}
}
void PlcSetup::on_toolButton_keyboard_released()
{
std::thread osk_thread = std::thread(task_osk_);
osk_thread.detach();
}
void PlcSetup::on_toolButton_close_released()
{
g_plc_dialog_open = false;
this->close();
}
void PlcSetup::handleTimeout()
{
on_toolButton_batch_read_released();
}
void PlcSetup::read_plc_items()
{
std::fstream cfg_file;
cfg_file.open(PLC_ITEM_FILE);
if (!cfg_file.is_open())
{
std::cout << "Error: Open production file " << PLC_ITEM_FILE << std::endl;
return;
}
while (!cfg_file.eof())
{
char tmp[1024] = "";
cfg_file.getline(tmp, 1024);
std::string line(tmp);
std::cout << line << std::endl;
if (line.length() > 0)
{
std::vector<std::string> vec_info;
string_split(line, "|", vec_info);
if (vec_info.size() == 4)
{
PlcItem plc_item;
plc_item.func_desc = vec_info[0];
plc_item.address = atoi(vec_info[1].c_str());
plc_item.value = atoi(vec_info[2].c_str());
plc_item.memo = vec_info[3];
m_plc_items.push_back(plc_item);
}
}
}
cfg_file.close();
}
void PlcSetup::save_plc_items()
{
std::fstream cfg_file;
cfg_file.open(PLC_ITEM_FILE, std::ios::out | std::ios::trunc);
if (cfg_file.good())
{
for (int i = 0; i < m_plc_items.size(); i++)
{
char buf[512];
memset(buf, 0, 512);
sprintf(buf, "%s|%d|%d|%s\n", m_plc_items[i].func_desc.c_str(),
m_plc_items[i].address, m_plc_items[i].value, m_plc_items[i].memo.c_str());
cfg_file.write(buf, strlen(buf));
}
cfg_file.close();
}
}