workingForRead
parent
5717a7c939
commit
08b57b8ac0
|
@ -1,4 +1,6 @@
|
|||
QT += core gui
|
||||
QT += network serialport serialbus
|
||||
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
|
@ -17,13 +19,20 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
mainwindow.cpp
|
||||
mainwindow.cpp \
|
||||
modbusoverudp.cpp \
|
||||
windowchannel.cpp
|
||||
|
||||
HEADERS += \
|
||||
mainwindow.h
|
||||
enums.h \
|
||||
mainwindow.h \
|
||||
modbusoverudp.h \
|
||||
windowchannel.h
|
||||
|
||||
FORMS += \
|
||||
mainwindow.ui
|
||||
mainwindow.ui \
|
||||
windowchannel.ui
|
||||
win32:RC_FILE = icon.rc
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
|
|
148
enums.h
148
enums.h
|
@ -1,4 +1,152 @@
|
|||
#ifndef ENUMS_H
|
||||
#define ENUMS_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
//Привет. Меня зовут Дима и я пишу на КУТЭ 2 месяц.
|
||||
//Вообщем я придерживаюсь такой концепции
|
||||
//set=state(состояние прибора)+sens(чувствительность)
|
||||
// между компонентами передаем SET, в разных сигналах для чувствительности и для состояния
|
||||
|
||||
|
||||
typedef enum { CHARGE = 0, ICP} typeIIN;
|
||||
typedef enum { Ku0_1 = 0, Ku0_2, Ku0_5, Ku1, Ku2, Ku5, Ku10, Ku20, Ku50, Ku100, Ku200, Ku500, Ku1000 } typeIKU;
|
||||
typedef enum { Hp0_2 = 0, Hp0_3, Hp1, Hp2, Hp10 } typeIFV;
|
||||
typedef enum { Lp200 = 0, Lp500, Lp1000, Lp5000, Lp10000, Lp20000, Lp50000, Lp100000 } typeIFN;
|
||||
typedef enum { Ch1 = 0, Ch2, Ch3, Ch4, Ch5, Ch6, Ch7,
|
||||
Ch8, Ch9, Ch10, Ch11, Ch12, Ch13, Ch14, Ch15, Ch16 } typeCHANNEL;
|
||||
typedef enum { Accel = 0, Pascal, Nython } typeVALUE;
|
||||
typedef enum
|
||||
{
|
||||
Out_0_0001 = 0,
|
||||
Out_0_0002 = 1,
|
||||
Out_0_0005 = 2,
|
||||
Out_0_0010 = 3,
|
||||
Out_0_0020 = 4,
|
||||
Out_0_0050 = 5,
|
||||
Out_0_0100 = 6,
|
||||
Out_0_0200 = 7,
|
||||
Out_0_0500 = 8,
|
||||
Out_0_1000 = 9,
|
||||
Out_0_2000 = 10,
|
||||
Out_0_5000 = 11,
|
||||
Out_1_0000 = 12,
|
||||
Out_2_0000 = 13,
|
||||
Out_5_0000 = 14,
|
||||
Out_10_000 = 15,
|
||||
Out_20_000 = 16,
|
||||
Out_50_000 = 17,
|
||||
Out_100_00 = 18,
|
||||
Out_200_00 = 19,
|
||||
Out_500_00 = 20,
|
||||
Out_1000_0 = 21,
|
||||
Out_2000_0 = 22,
|
||||
Out_5000_0 = 23,
|
||||
Out_10000 = 24
|
||||
} typeOUTPUT;
|
||||
|
||||
typedef enum{SENS=0, STATE} typeREQ;
|
||||
|
||||
typedef struct {
|
||||
typeCHANNEL channel;
|
||||
typeIKU IKU;
|
||||
typeIIN IIN;
|
||||
typeIFV IFV;
|
||||
typeIFN IFN;
|
||||
float SENS;
|
||||
typeVALUE VALUE;
|
||||
typeOUTPUT OUTPUT;
|
||||
} Set;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
quint16 OWN; // 0,1 4001
|
||||
quint16 BAUD; // 2,3 4002
|
||||
quint16 INFB; // 4,5 4003 //БАЙТ КОНТРОЛЯ ЧЕТНОСТИ
|
||||
|
||||
quint16 IIN; // 6,7 5001
|
||||
quint16 IFV; // 8,9 5002 //ФИЛЬТР ВЫСОКИХ
|
||||
quint16 IFN; // 10,11 5003 // ФИЛЬТР НИЗКИХ
|
||||
quint16 IKU; // 12,13 5004 //КОЭФИЦИЕНТ УСИЛЕНИЯ
|
||||
quint16 IKE; // 14,15 5005
|
||||
quint16 IKD; // 16,17 5006
|
||||
quint16 IKS; // 18,19 5007
|
||||
quint16 IPZ; // 20,21 5008 1- плавуящая то есть разорванная - по схеме наоборот
|
||||
quint16 OPZ; // 22,23 5009 ПЛАВУЮЩАЯ ЗЕМЛЯ
|
||||
quint16 VAL; // 24,25 5010 -- пикокулоны метры в секнду.....
|
||||
quint16 TEMP; // 26,27 NONE
|
||||
|
||||
float KCOND; // 24,25,26,27 7501
|
||||
float SENS; // 28,29,30,31 7502
|
||||
float ACCEL; // 32,33,34,35 7503
|
||||
|
||||
} UserData_TypeDef; // ********LENGTH = 28 bytes***********
|
||||
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CHARGE_1 = 0,
|
||||
KU_2,
|
||||
KU_5,
|
||||
KU_10,
|
||||
KU_x10,
|
||||
|
||||
CHARGE_10,
|
||||
CHARGE_0_1,
|
||||
|
||||
ICP_1,
|
||||
ICP_10,
|
||||
|
||||
KU_200,
|
||||
KU_500,
|
||||
KU_1000
|
||||
} IC_CORR;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
uint8_t ch[4];
|
||||
uint16_t sh[2];
|
||||
uint32_t lg;
|
||||
float fl;
|
||||
} sfloat;
|
||||
|
||||
typedef union{
|
||||
uint8_t ch[4];
|
||||
float fl;
|
||||
} usfloat;
|
||||
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
uint8_t ch[4];
|
||||
uint32_t lg;
|
||||
} ulong_t;
|
||||
|
||||
typedef union
|
||||
{
|
||||
uint8_t ch[4];
|
||||
int32_t lg;
|
||||
} long_t;
|
||||
|
||||
|
||||
typedef union{
|
||||
uint8_t ch[2];
|
||||
uint16_t sh;
|
||||
} usshort;
|
||||
|
||||
typedef union
|
||||
{
|
||||
uint8_t ch[2];
|
||||
int16_t sh;
|
||||
} sshort_t;
|
||||
#endif // ENUMS_H
|
||||
|
||||
|
||||
|
|
|
@ -1,11 +1,41 @@
|
|||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
#include "windowchannel.h"
|
||||
|
||||
class ModbusOverUdp;
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
{
|
||||
|
||||
ui->setupUi(this);
|
||||
modbus=new ModbusOverUdp();
|
||||
this->setWindowTitle ("Программа для управления A142");
|
||||
ui->widget1->setWindowsChannel(Ch1);
|
||||
ui->widget2->setWindowsChannel(Ch2);
|
||||
ui->widget3->setWindowsChannel(Ch3);
|
||||
ui->widget4->setWindowsChannel(Ch4);
|
||||
|
||||
connect(this->modbus,SIGNAL(stateRecive (Set)),
|
||||
ui->widget1,SLOT(setState(Set)));
|
||||
connect(modbus,SIGNAL(stateRecive (Set)),
|
||||
ui->widget2,SLOT(setState(Set)));
|
||||
connect(modbus,SIGNAL(stateRecive (Set)),
|
||||
ui->widget3,SLOT(setState(Set)));
|
||||
connect(modbus,SIGNAL(stateRecive (Set)),
|
||||
ui->widget4,SLOT(setState(Set)));
|
||||
|
||||
connect(modbus,SIGNAL(sensRecive(Set)),
|
||||
ui->widget1,SLOT(setSens(Set)));
|
||||
connect(modbus,SIGNAL(sensRecive(Set)),
|
||||
ui->widget2,SLOT(setSens(Set)));
|
||||
connect(modbus,SIGNAL(sensRecive(Set)),
|
||||
ui->widget3,SLOT(setSens(Set)));
|
||||
connect(modbus,SIGNAL(sensRecive(Set)),
|
||||
ui->widget4,SLOT(setSens(Set)));
|
||||
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
|
@ -13,3 +43,15 @@ MainWindow::~MainWindow()
|
|||
delete ui;
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButtonConnect_clicked()
|
||||
{
|
||||
if(isConnected==0){
|
||||
modbus->connectTo(ui->lineEditAddres->text(),ui->lineEditPort->text().toInt());
|
||||
ui->pushButtonConnect->setText("Отключиться");
|
||||
isConnected=1;
|
||||
}else{
|
||||
modbus->disconnectFrom();
|
||||
ui->pushButtonConnect->setText("Подключиться");
|
||||
isConnected=0;
|
||||
}
|
||||
}
|
||||
|
|
12
mainwindow.h
12
mainwindow.h
|
@ -2,6 +2,9 @@
|
|||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include "modbusoverudp.h"
|
||||
#include "enums.h"
|
||||
#include "QDebug"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class MainWindow; }
|
||||
|
@ -13,8 +16,17 @@ class MainWindow : public QMainWindow
|
|||
|
||||
public:
|
||||
MainWindow(QWidget *parent = nullptr);
|
||||
bool isConnected=0;
|
||||
ModbusOverUdp* modbus;
|
||||
|
||||
~MainWindow();
|
||||
|
||||
|
||||
|
||||
private slots:
|
||||
|
||||
void on_pushButtonConnect_clicked();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
};
|
||||
|
|
162
mainwindow.ui
162
mainwindow.ui
|
@ -6,17 +6,171 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
<width>539</width>
|
||||
<height>474</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget"/>
|
||||
<widget class="QMenuBar" name="menubar"/>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="QPushButton" name="pushButtonConnect">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>220</x>
|
||||
<y>19</y>
|
||||
<width>151</width>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Подключится</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLineEdit" name="lineEditAddres">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>53</x>
|
||||
<y>20</y>
|
||||
<width>81</width>
|
||||
<height>20</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>192.168.0.50</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLineEdit" name="lineEditPort">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>170</x>
|
||||
<y>21</y>
|
||||
<width>41</width>
|
||||
<height>20</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>7000</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>12</x>
|
||||
<y>21</y>
|
||||
<width>41</width>
|
||||
<height>16</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Адрес</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>140</x>
|
||||
<y>23</y>
|
||||
<width>29</width>
|
||||
<height>16</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Порт:</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="windowChannel" name="widget1" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>50</y>
|
||||
<width>257</width>
|
||||
<height>186</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="windowChannel" name="widget2" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>240</y>
|
||||
<width>257</width>
|
||||
<height>186</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="windowChannel" name="widget3" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>270</x>
|
||||
<y>50</y>
|
||||
<width>257</width>
|
||||
<height>186</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="windowChannel" name="widget4" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>270</x>
|
||||
<y>240</y>
|
||||
<width>257</width>
|
||||
<height>186</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>480</x>
|
||||
<y>20</y>
|
||||
<width>61</width>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>A142</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="pushButtonSettings">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>380</x>
|
||||
<y>20</y>
|
||||
<width>81</width>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Настройка...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>539</width>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>windowChannel</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">windowchannel.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
|
@ -1,6 +1,196 @@
|
|||
#include "modbusoverudp.h"
|
||||
|
||||
ModbusOverUdp::ModbusOverUdp(QObject *parent) : QObject(parent)
|
||||
{
|
||||
{timer= new QTimer();
|
||||
timer->setInterval(1000);
|
||||
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
|
||||
timer->start();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::timeout()
|
||||
{
|
||||
if(isConnected){//запросы по всем фронтам
|
||||
|
||||
for(quint16 i=1; i<=4; i++){
|
||||
req(i,SENS);
|
||||
req(i,STATE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint16_t ModbusOverUdp::Crc16(uint16_t len, uint16_t iobuf[]) //CRC для сообщения такой то длинны /Len - начало контрольной сумимы
|
||||
{
|
||||
uint16_t i;
|
||||
uint16_t crc = 0xFFFF;
|
||||
|
||||
for(i = 0; i < len; i++) {
|
||||
crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ (iobuf[i]& 0xFF)];
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t ModbusOverUdp::Crc16(uint16_t len, QByteArray iobuf) //CRC для сообщения такой то длинны /Len - начало контрольной сумимы
|
||||
{
|
||||
uint16_t i;
|
||||
uint16_t crc = 0xFFFF;
|
||||
|
||||
for(i = 0; i < len; i++) {
|
||||
crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ (iobuf[i] & 0xFF)]; // ввел маску 0xFF, тк прилетает 0хFFFFFFxx
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::readPendingDatagrams()
|
||||
{
|
||||
while (udpSocket->hasPendingDatagrams()) {
|
||||
QNetworkDatagram datagram = udpSocket->receiveDatagram();
|
||||
processTheDatagram(datagram);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::processTheDatagram(QNetworkDatagram & datagram)
|
||||
{
|
||||
|
||||
QByteArray recived = datagram.data(); // копируем датаграмку в аррэй для удобной работы
|
||||
|
||||
Set toSend; //структура для отправки в другой компонент
|
||||
sfloat res; //флоат для сборки из пакета модбас
|
||||
toSend.channel=(typeCHANNEL)(recived[0]-1); //Ch1 = 0 - в енаме
|
||||
|
||||
|
||||
switch (recived.size()){ // сужу о прибывшем по размеру пакета // ЭТО ПЛОХО!!!
|
||||
case 9:
|
||||
|
||||
res.ch[3]=recived[3]; // Собираю флоат
|
||||
res.ch[2]=recived[4];
|
||||
res.ch[1]=recived[5];
|
||||
res.ch[0]=recived[6];
|
||||
//qDebug() <<"Чувствительность для модбас адреса"<<toSend.channel+1 <<res.fl;
|
||||
toSend.SENS= res.fl;
|
||||
emit sensRecive(toSend);
|
||||
|
||||
break;
|
||||
|
||||
case 25:
|
||||
//qDebug() <<"Подвалило состояние для модбас адреса"<<toSend.channel+1;
|
||||
|
||||
toSend.IIN=(typeIIN)(recived[4]-0);
|
||||
toSend.IFV=(typeIFV)(recived[6]-0);
|
||||
toSend.IFN=(typeIFN)(recived[8]-0);
|
||||
toSend.IKU=(typeIKU)(recived[10]-0);
|
||||
//toSend.OUTPUT=(typeOUTPUT)(recived[2]-0);
|
||||
toSend.VALUE=(typeVALUE)(recived[22]-0);
|
||||
|
||||
emit stateRecive(toSend);
|
||||
|
||||
break;
|
||||
default:
|
||||
qDebug() <<"ТЫ не понимаешь, это другое";
|
||||
qDebug() <<"Это"<<recived<<"размером"<<recived.size();
|
||||
|
||||
break;
|
||||
//Разберись с этим
|
||||
// "\x01\x10\x13\x89\x00\n\x14\x00\x00\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x05\xB3" размером 29
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::connectTo(QString ipAdress, quint16 port)
|
||||
{
|
||||
udpSocket = new QUdpSocket(this);
|
||||
targetIp =QHostAddress(ipAdress);
|
||||
targetPort=port;
|
||||
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
|
||||
isConnected=1;
|
||||
}
|
||||
|
||||
void ModbusOverUdp::disconnectFrom()
|
||||
{
|
||||
isConnected=0;
|
||||
}
|
||||
|
||||
void ModbusOverUdp::req(quint16 adr, typeREQ TYPEREQ)
|
||||
{
|
||||
QByteArray data;
|
||||
switch (TYPEREQ)
|
||||
{
|
||||
case SENS:{
|
||||
data.resize(8);
|
||||
data[0]=adr;
|
||||
data[1]=0x3;
|
||||
data[2]=0x1b;
|
||||
data[3]=0x5c;
|
||||
data[4]=0x00;
|
||||
data[5]=0x2;
|
||||
uint16_t crcToSend= Crc16((uint16_t)6, data);
|
||||
data[6]=LO(crcToSend);
|
||||
data[7]=HI(crcToSend);
|
||||
break;
|
||||
}
|
||||
|
||||
case STATE:{
|
||||
data.resize(8);
|
||||
data[0]=adr;
|
||||
data[1]=0x3;
|
||||
data[2]=0x13;
|
||||
data[3]=0x89;
|
||||
data[4]=0x00;
|
||||
data[5]=0xa;
|
||||
uint16_t crcToSend= Crc16((uint16_t)6, data);
|
||||
data[6]=LO(crcToSend);
|
||||
data[7]=HI(crcToSend);
|
||||
break;
|
||||
}
|
||||
}
|
||||
sendPendingDatagrams(data);
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::testReq()
|
||||
{
|
||||
QByteArray data;
|
||||
data.resize(8);
|
||||
data[0]=0x1;
|
||||
data[1]=0x3;
|
||||
data[2]=0x13;
|
||||
data[3]=0x89;
|
||||
data[4]=0x00;
|
||||
data[5]=0x4;
|
||||
uint16_t crcToSend= Crc16((uint16_t)6, data);
|
||||
data[6]=LO(crcToSend);
|
||||
data[7]=HI(crcToSend);
|
||||
sendPendingDatagrams(data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void ModbusOverUdp::sendPendingDatagrams( QByteArray & data )
|
||||
{
|
||||
QNetworkDatagram datagram;
|
||||
|
||||
datagram.setDestination(targetIp,targetPort);
|
||||
datagram.setData(data);
|
||||
// qDebug()<<"sended"<<datagram.data();
|
||||
udpSocket->writeDatagram(datagram);
|
||||
}
|
||||
|
||||
|
||||
void ModbusOverUdp::stateSend(Set setWithState)
|
||||
{
|
||||
}
|
||||
|
||||
void ModbusOverUdp::sensSend(Set setWithSens)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -2,15 +2,88 @@
|
|||
#define MODBUSOVERUDP_H
|
||||
|
||||
#include <QObject>
|
||||
#include "enums.h"
|
||||
#include "QTimer"
|
||||
#include "QDebug"
|
||||
#include <QUdpSocket>
|
||||
#include <QtNetwork>
|
||||
|
||||
#define LO(x) ((uint8_t) ((x) & 0xff))
|
||||
#define HI(x) ((uint8_t) (((x) >> 8) & 0xff))
|
||||
|
||||
class ModbusOverUdp : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
uint16_t Crc16Table[256]=
|
||||
{
|
||||
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
|
||||
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
|
||||
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
|
||||
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
|
||||
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
|
||||
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
|
||||
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
|
||||
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
|
||||
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
|
||||
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
|
||||
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
|
||||
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
|
||||
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
|
||||
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
|
||||
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
|
||||
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
|
||||
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
|
||||
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
|
||||
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
|
||||
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
|
||||
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
|
||||
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
|
||||
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
|
||||
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
|
||||
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
|
||||
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
|
||||
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
|
||||
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
|
||||
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
|
||||
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
|
||||
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
|
||||
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
|
||||
};
|
||||
explicit ModbusOverUdp(QObject *parent = nullptr);
|
||||
void sendPendingDatagrams(QByteArray &data);
|
||||
|
||||
uint16_t Crc16(uint16_t len, QByteArray iobuf);
|
||||
uint16_t Crc16(uint16_t len, uint16_t iobuf[]);
|
||||
|
||||
QHostAddress targetIp;
|
||||
quint16 targetPort;
|
||||
|
||||
signals:
|
||||
|
||||
void stateRecive (Set setWithState);
|
||||
void sensRecive (Set setWithSens);
|
||||
|
||||
|
||||
public slots:
|
||||
void connectTo(QString ipAdress, quint16 port);
|
||||
void disconnectFrom();
|
||||
void stateSend(Set setWithState);
|
||||
void sensSend(Set setWithSens);
|
||||
void readPendingDatagrams();
|
||||
void timeout();
|
||||
void req(quint16 adr, typeREQ TYPEREQ);
|
||||
|
||||
|
||||
void testReq();
|
||||
private:
|
||||
QTimer *timer;
|
||||
bool isConnected=0;
|
||||
QUdpSocket* udpSocket;
|
||||
|
||||
void processTheDatagram(QNetworkDatagram &datagram);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // MODBUSOVERUDP_H
|
||||
|
|
|
@ -0,0 +1,513 @@
|
|||
#include "windowchannel.h"
|
||||
#include "ui_windowchannel.h"
|
||||
|
||||
|
||||
|
||||
windowChannel::windowChannel(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::windowChannel)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
|
||||
|
||||
//ДЕЛАЕМ ФОН ЧЕРНЫМ
|
||||
QPalette Pal(palette());
|
||||
Pal.setColor(QPalette::Background, Qt::black);
|
||||
this->setAutoFillBackground(true);
|
||||
this->setPalette(Pal);
|
||||
this->show();
|
||||
|
||||
thisData.IFN=Lp200;
|
||||
thisData.IFV=Hp1;
|
||||
thisData.IIN=ICP;
|
||||
thisData.IKU=Ku1;
|
||||
thisData.SENS=1.0;
|
||||
thisData.VALUE=Accel;
|
||||
|
||||
}
|
||||
|
||||
windowChannel::~windowChannel()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
void windowChannel::setSens(Set data)
|
||||
{
|
||||
if(data.channel==this->channel){
|
||||
thisData.SENS=data.SENS;
|
||||
reDraw();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void windowChannel::setState(Set data)
|
||||
{
|
||||
if(data.channel==this->channel){
|
||||
thisData.IKU=data.IKU;
|
||||
thisData.IIN=data.IIN;
|
||||
thisData.IFV=data.IFV;
|
||||
thisData.IFN=data.IFN;
|
||||
thisData.VALUE=data.VALUE;
|
||||
reDraw();
|
||||
}
|
||||
}
|
||||
|
||||
void windowChannel::reDraw()
|
||||
{
|
||||
if(thisData.SENS<100000&&thisData.SENS>=10000) { ui->labelSENS->setText(QString::number(thisData.SENS,'f', 0));}
|
||||
else if(thisData.SENS<10000&&thisData.SENS>=1000) { ui->labelSENS->setText(QString::number(thisData.SENS,'f', 1));}
|
||||
else if(thisData.SENS<1000&&thisData.SENS>=100) {ui->labelSENS->setText(QString::number(thisData.SENS,'f', 2));}
|
||||
else if(thisData.SENS<100&&thisData.SENS>=10){ui->labelSENS->setText(QString::number(thisData.SENS,'f', 3));}
|
||||
else {ui->labelSENS->setText(QString::number(thisData.SENS,'f', 4));}
|
||||
|
||||
|
||||
switch (thisData.IIN) {
|
||||
case ICP:{
|
||||
ui->labelIIN->setText("IEPE");
|
||||
break;
|
||||
}
|
||||
case CHARGE:{
|
||||
ui->labelIIN->setText("Заряд");
|
||||
break;
|
||||
}
|
||||
}//end switch
|
||||
|
||||
switch (thisData.IFV) {
|
||||
case Hp0_2:{
|
||||
ui->labelVCH->setText("0.2Гц");
|
||||
break;
|
||||
}
|
||||
case Hp0_3:{
|
||||
ui->labelVCH->setText("0.3Гц");
|
||||
break;
|
||||
}
|
||||
case Hp1:{
|
||||
ui->labelVCH->setText("1Гц");
|
||||
break;
|
||||
}
|
||||
case Hp2:{
|
||||
ui->labelVCH->setText("2Гц");
|
||||
break;
|
||||
}
|
||||
case Hp10:{
|
||||
ui->labelVCH->setText("10Гц");
|
||||
break;
|
||||
}
|
||||
}//end switch
|
||||
|
||||
|
||||
switch (thisData.IFN) {
|
||||
case Lp200:{
|
||||
ui->labelNCH->setText("200Гц");
|
||||
break;
|
||||
}
|
||||
case Lp500:{
|
||||
ui->labelNCH->setText("500Гц");
|
||||
break;
|
||||
}
|
||||
case Lp1000:{
|
||||
ui->labelNCH->setText("1кГц");
|
||||
break;
|
||||
}
|
||||
case Lp5000:{
|
||||
ui->labelNCH->setText("5кГц");
|
||||
break;
|
||||
}
|
||||
case Lp10000:{
|
||||
ui->labelNCH->setText("10кГц");
|
||||
break;
|
||||
}
|
||||
case Lp20000:{
|
||||
ui->labelNCH->setText("20кГц");
|
||||
break;
|
||||
}
|
||||
case Lp50000:{
|
||||
ui->labelNCH->setText("50кГц");
|
||||
break;
|
||||
}
|
||||
case Lp100000:{
|
||||
ui->labelNCH->setText("100кГц");
|
||||
break;
|
||||
}
|
||||
}//end switch
|
||||
|
||||
switch (thisData.VALUE) {
|
||||
case Accel:{
|
||||
if(thisData.IIN==ICP)(ui->labelUNIT1->setText("мВ/м/c2"));
|
||||
else{ui->labelUNIT1->setText("пКл/м/с2");}
|
||||
break;
|
||||
}
|
||||
case Nython:{
|
||||
if(thisData.IIN==ICP)(ui->labelUNIT1->setText("мВ/Н"));
|
||||
else{ui->labelUNIT1->setText("пКл/Н");}
|
||||
break;
|
||||
}
|
||||
case Pascal:{
|
||||
if(thisData.IIN==ICP)(ui->labelUNIT1->setText("мВ/Па"));
|
||||
else{ui->labelUNIT1->setText("пКл/Па");}
|
||||
break;
|
||||
}
|
||||
}//end switch
|
||||
|
||||
ui->labelOUT->setText(DisplayIKUA142(thisData.SENS, thisData.IKU, thisData.VALUE));
|
||||
|
||||
}
|
||||
|
||||
|
||||
void windowChannel::setWindowsChannel(typeCHANNEL channel)
|
||||
{
|
||||
this->channel = channel;
|
||||
ui->labelChanel->setNum((int)(channel+1));
|
||||
}
|
||||
|
||||
typeCHANNEL windowChannel::getWindowsChannel()
|
||||
{
|
||||
return channel;
|
||||
}
|
||||
|
||||
|
||||
typeIKU windowChannel::VerifyGainA142(float sens, typeIKU iku)
|
||||
{
|
||||
|
||||
|
||||
|
||||
if(sens <= 0.0010f) //0.001
|
||||
{
|
||||
if(iku > Ku1000)
|
||||
{
|
||||
iku = Ku1000;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0011f && */sens <= 10.000f) //0.002
|
||||
{
|
||||
if(iku > Ku1000)
|
||||
{
|
||||
iku = Ku1000;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 10.001f && */sens <= 20.000f) //20
|
||||
{
|
||||
if(iku > Ku500)
|
||||
{
|
||||
iku = Ku500;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 20.001f && */sens <= 50.000f) //50
|
||||
{
|
||||
if(iku > Ku200)
|
||||
{
|
||||
iku = Ku200;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 50.001f && */sens <= 100.00f) //100
|
||||
{
|
||||
if(iku > Ku100)
|
||||
{
|
||||
iku = Ku100;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 100.01f && */sens <= 200.00f) //200
|
||||
{
|
||||
if(iku > Ku50)
|
||||
{
|
||||
iku = Ku50;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 200.01f && */sens <= 500.00f) //500
|
||||
{
|
||||
if(iku > Ku20)
|
||||
{
|
||||
iku = Ku20;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 500.01f && */sens <= 1000.0f) //1000
|
||||
{
|
||||
if(iku > Ku10)
|
||||
{
|
||||
iku = Ku10;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 1000.01f && */sens <= 2000.0f) //2000
|
||||
{
|
||||
if(iku > Ku5)
|
||||
{
|
||||
iku = Ku5;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 2000.01f && */sens <= 5000.0f) //5000
|
||||
{
|
||||
if(iku > Ku2)
|
||||
{
|
||||
iku = Ku2;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 5000.01f && */sens <= 10000.0f) //10000
|
||||
{
|
||||
if(iku > Ku1)
|
||||
{
|
||||
iku = Ku1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 10001.0f && */sens <= 20000.0f) //20000
|
||||
{
|
||||
if(iku > Ku0_5)
|
||||
{
|
||||
iku = Ku0_5;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(/*sens >= 20001.0f && */sens <= 50000.0f) //50000
|
||||
{
|
||||
if(iku > Ku0_2)
|
||||
{
|
||||
iku = Ku0_2;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(sens < 100000.0f) //99999
|
||||
{
|
||||
if(iku > Ku0_1)
|
||||
{
|
||||
iku = Ku0_1;
|
||||
}
|
||||
}
|
||||
return iku;
|
||||
}
|
||||
|
||||
QString windowChannel::DisplayIKUA142(float sens, typeIKU iku ,typeVALUE value)
|
||||
|
||||
{uint out;
|
||||
//вбычку обьявлю тут
|
||||
|
||||
const char *pOUT[3][25] =
|
||||
{
|
||||
{
|
||||
"0.0001 мВ/м/c2",
|
||||
"0.0002 мВ/м/c2",
|
||||
"0.0005 мВ/м/c2",
|
||||
"0.001 мВ/м/c2",
|
||||
"0.002 мВ/м/c2",
|
||||
"0.005 мВ/м/c2",
|
||||
"0.01 мВ/м/c2",
|
||||
"0.02 мВ/м/c2",
|
||||
"0.05 мВ/м/c2",
|
||||
"0.1 мВ/м/c2",
|
||||
"0.2 мВ/м/c2",
|
||||
"0.5 мВ/м/c2",
|
||||
"1 мВ/м/c2",
|
||||
"2 мВ/м/c2",
|
||||
"5 мВ/м/c2",
|
||||
"10 мВ/м/c2",
|
||||
"20 мВ/м/c2",
|
||||
"50 мВ/м/c2",
|
||||
"100 мВ/м/c2",
|
||||
"200 мВ/м/c2",
|
||||
"500 мВ/м/c2",
|
||||
"1 В/м/c2",
|
||||
"2 В/м/c2",
|
||||
"5 В/м/c2",
|
||||
"10 В/м/c2"
|
||||
},
|
||||
{
|
||||
"0.0001 мВ/Па",
|
||||
"0.0002 мВ/Па",
|
||||
"0.0005 мВ/Па",
|
||||
"0.001 мВ/Па",
|
||||
"0.002 мВ/Па",
|
||||
"0.005 мВ/Па",
|
||||
"0.01 мВ/Па",
|
||||
"0.02 мВ/Па",
|
||||
"0.05 мВ/Па",
|
||||
"0.1 мВ/Па",
|
||||
"0.2 мВ/Па",
|
||||
"0.5 мВ/Па",
|
||||
"1 мВ/Па",
|
||||
"2 мВ/Па",
|
||||
"5 мВ/Па",
|
||||
"10 мВ/Па",
|
||||
"20 мВ/Па",
|
||||
"50 мВ/Па",
|
||||
"100 мВ/Па",
|
||||
"200 мВ/Па",
|
||||
"500 мВ/Па",
|
||||
"1 В/Па",
|
||||
"2 В/Па",
|
||||
"5 В/Па",
|
||||
"10 В/Па"
|
||||
},
|
||||
{
|
||||
"0.0001 мВ/Н",
|
||||
"0.0002 мВ/Н",
|
||||
"0.0005 мВ/Н",
|
||||
"0.001 мВ/Н",
|
||||
"0.002 мВ/Н",
|
||||
"0.005 мВ/Н",
|
||||
"0.01 мВ/Н",
|
||||
"0.02 мВ/Н",
|
||||
"0.05 мВ/Н",
|
||||
"0.1 мВ/Н",
|
||||
"0.2 мВ/Н",
|
||||
"0.5 мВ/Н",
|
||||
"1 мВ/Н",
|
||||
"2 мВ/Н",
|
||||
"5 мВ/Н",
|
||||
"10 мВ/Н",
|
||||
"20 мВ/Н",
|
||||
"50 мВ/Н",
|
||||
"100 мВ/Н",
|
||||
"200 мВ/Н",
|
||||
"500 мВ/Н",
|
||||
"1 В/Н",
|
||||
"2 В/Н",
|
||||
"5 В/Н",
|
||||
"10 В/Н"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
if(sens <= 0.0010f) //0.001
|
||||
{
|
||||
out = iku;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0011f && */sens <= 0.0020f) //0.002
|
||||
{
|
||||
out = (uint16_t)iku + 1;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0021f && */sens <= 0.0050f) //0.005
|
||||
{
|
||||
out = (uint16_t)iku + 2;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0051f && */sens <= 0.0100f) //0.01
|
||||
{
|
||||
out = (uint16_t)iku + 3;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0101f && */sens <= 0.0200f) //0.02
|
||||
{
|
||||
out = (uint16_t)iku + 4;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0201f && */sens <= 0.0500f) //0.05
|
||||
{
|
||||
out = (uint16_t)iku + 5;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.0501f && */sens <= 0.1000f) //0.1
|
||||
{
|
||||
out = (uint16_t)iku + 6;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.1001f && */sens <= 0.2000f) //0.2
|
||||
{
|
||||
out = (uint16_t)iku + 7;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.2001f && */sens <= 0.5000f) //0.5
|
||||
{
|
||||
out = (uint16_t)iku + 8;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 0.5001f && */sens <= 1.0000f) //1
|
||||
{
|
||||
out = (uint16_t)iku + 9;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 1.0001f && */sens <= 2.0000f) //2
|
||||
{
|
||||
out = (uint16_t)iku + 10;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 2.0001f && */sens <= 5.0000f) //5
|
||||
{
|
||||
out = (uint16_t)iku + 11;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 5.0001f && */sens <= 10.000f) //10
|
||||
{
|
||||
out = (uint16_t)iku + 12;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 10.001f && */sens <= 20.000f) //20
|
||||
{
|
||||
out = (uint16_t)iku + 13;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 20.001f && */sens <= 50.000f) //50
|
||||
{
|
||||
out = (uint16_t)iku + 14;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 50.001f && */sens <= 100.00f) //100
|
||||
{
|
||||
out = (uint16_t)iku + 15;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 100.01f && */sens <= 200.00f) //200
|
||||
{
|
||||
out = (uint16_t)iku + 16;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 200.01f && */sens <= 500.00f) //500
|
||||
{
|
||||
out = (uint16_t)iku + 17;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 500.01f && */sens <= 1000.0f) //1000
|
||||
{
|
||||
out = (uint16_t)iku + 18;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 1000.1f && */sens <= 2000.0f) //2000
|
||||
{
|
||||
out = (uint16_t)iku + 19;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 2000.1f && */sens <= 5000.0f) //2000
|
||||
{
|
||||
out = (uint16_t)iku + 20;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 5000.1f && */sens <= 10000.0f) //10000
|
||||
{
|
||||
out = (uint16_t)iku + 21;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 10001 && */sens <= 20000.0f) //20000
|
||||
{
|
||||
out = (uint16_t)iku + 22;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 20001 && */sens <= 50000.0f) //50000
|
||||
{
|
||||
out = (uint16_t)iku + 23;
|
||||
}
|
||||
else
|
||||
if(/*sens >= 50001 && */sens <= 100000) //100000
|
||||
{
|
||||
out = (uint16_t)iku + 24;
|
||||
}
|
||||
|
||||
return QString::fromStdString(pOUT[(uint16_t)value][out]);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef WINDOWCHANNEL_H
|
||||
#define WINDOWCHANNEL_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <enums.h>
|
||||
|
||||
namespace Ui {
|
||||
class windowChannel;
|
||||
}
|
||||
|
||||
class windowChannel : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
|
||||
void setWindowsChannel(typeCHANNEL channel);
|
||||
typeCHANNEL getWindowsChannel();
|
||||
typeIKU VerifyGainA142(float sens,typeIKU iku);
|
||||
QString DisplayIKUA142(float sens,typeIKU iku, typeVALUE value);
|
||||
|
||||
|
||||
|
||||
|
||||
explicit windowChannel(QWidget *parent = nullptr);
|
||||
~windowChannel();
|
||||
|
||||
public slots:
|
||||
void setSens(Set data);
|
||||
void setState(Set data);
|
||||
void reDraw();
|
||||
|
||||
private:
|
||||
Set thisData; //данные этой структуры
|
||||
typeCHANNEL channel;
|
||||
Ui::windowChannel *ui;
|
||||
};
|
||||
|
||||
#endif // WINDOWCHANNEL_H
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue