/******************************motorcontroll.cpp文件说明********************************** * Descript :源文件,包含主窗口的页面设计、函数的实现、信号的连接 * Author :caitiancheng * Date :2021_12_19 *******************************************************************************/ /***********************************头文件****************************************/ #include "motorcontroll.h" #include "ui_motorcontroll.h" #include #include /***********************************类的声明和继承****************************************/ MotorControll::MotorControll(QWidget *parent) : QMainWindow(parent), ui(new Ui::MotorControll) { ui->setupUi(this); //从站连接状态定时器 StatuTimer=new QTimer; //时间显示定时器 TimeShow=new QTimer; //监视栏定时器 Monitor=new QTimer; //控件连接的信号和槽函数 InitConnect(); //状态栏界面设置初始化函数 InitBarStatus(); //监视栏舒适化函数 InitMonitor(); //未进行通信连接时设置按钮不可按 //基础配置的按钮(3个) ui->pushButton_2->setEnabled(false); ui->pushButton_3->setEnabled(false); ui->pushButton_4->setEnabled(false); //点动的按钮(6个) ui->DotKeepRunBtn->setEnabled(false); ui->DotPositiveBtn->setEnabled(false); ui->DotReverseBtn->setEnabled(false); ui->DotSpeedUpdataBtn->setEnabled(false); ui->DotStepUpdataBtn->setEnabled(false); ui->DotStopRunBtn->setEnabled(false); //基础运动的按钮(8个) ui->RunKeepBtn->setEnabled(false); ui->RunPlaceUpdataBtn->setEnabled(false); ui->RunSpeedUpdataBtn->setEnabled(false); ui->RunStartAbsolutBtn->setEnabled(false); ui->RunStartPlaceModifyBtn->setEnabled(false); ui->RunStartRelativeBtn->setEnabled(false); ui->RunStopBtn->setEnabled(false); ui->RunTimeUpdataBtn->setEnabled(false); //多段运动的按钮(5个)+1个多选框 ui->RunMoreAddRunBtn->setEnabled(false); ui->RunMoreDataUpdataBtn->setEnabled(false); ui->RunMoreKeepBtn->setEnabled(false); ui->RunMoreModelBox->setEnabled(false); ui->RunMoreStartBtn->setEnabled(false); ui->RunMoreStopBtn->setEnabled(false); } /******************************************************析构函数*****************************************************/ MotorControll::~MotorControll() { //销毁状态栏显示相关 delete ConStatusText; delete ConStatusImg; delete SalveStatusText; delete SalveStatusShow; //销毁定时器 delete StatuTimer; delete TimeShow; delete Monitor; //销毁监视栏的监视对象 int MonitorLogsLen=MonitorLogs.length(); for(int i=0;istatusBar->setStyleSheet(QString("QStatusBar::item{border:0px}")); ConStatusText=new QLabel; ConStatusText->setAlignment(Qt::AlignRight | Qt::AlignVCenter); ConStatusText->setText(QStringLiteral("通信状态:")); ui->statusBar->addPermanentWidget(ConStatusText); ConStatusImg=new QLabel; ConStatusImg->setStyleSheet(m_red_SheetStyle); ConStatusImg->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); ui->statusBar->addPermanentWidget(ConStatusImg); SalveStatusText=new QLabel; SalveStatusText->setMinimumWidth(100); SalveStatusText->setAlignment(Qt::AlignRight | Qt::AlignVCenter); SalveStatusText->setText(QStringLiteral("从站状态:")); ui->statusBar->addPermanentWidget(SalveStatusText); SalveStatusShow=new QLabel; SalveStatusShow->setMinimumWidth(60); SalveStatusShow->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); SalveStatusShow->setText(QStringLiteral("其它")); ui->statusBar->addPermanentWidget(SalveStatusShow); } /****************************InitConnect函数********************************* Function :主窗口界面涉及的槽函数和信号的连接 Output : *********************************************************************/ void MotorControll::InitConnect() { connect(&Xcon,SIGNAL(CloseWin()),this,SLOT(Slot_ShowWin())); connect(&Apar,SIGNAL(CloseWin()),this,SLOT(Slot_ShowWin())); connect(&Movement,SIGNAL(CloseWin()),this,SLOT(Slot_ShowWin())); connect(StatuTimer,SIGNAL(timeout()),this,SLOT(Slot_Status())); connect(Monitor,SIGNAL(timeout()),this,SLOT(Slot_Monitor())); //开启从站连接状态定时器 StatuTimer->start(1000); //开启监视栏定时器 Monitor->start(500); //开启时间显示定时器 TimeShow->start(1000); //连接定时器和timeout信号 connect(TimeShow,&QTimer::timeout,[=](){ ui->statusBar->showMessage(QDateTime::currentDateTime().toString( "yyyy年MM月dd日 hh:mm:ss")); }); //多段运动启动与停止绑定 connect(ui->RunMoreStopBtn,SIGNAL(clicked()),this,SLOT(on_RunStopBtn_clicked())); connect(ui->RunMoreKeepBtn,SIGNAL(clicked()),this,SLOT(on_RunKeepBtn_clicked())); } /****************************Slot_Status函数********************************* Function :从站状态显示函数 Output : *********************************************************************/ void MotorControll::Slot_Status() { //如果从站连接成功,变为绿色,开启按钮;否则是红色,关闭按钮 if(ConStatus()) { ConStatusImg->setStyleSheet(m_green_SheetStyle); //基础配置的按钮(3个) ui->pushButton_2->setEnabled(true); ui->pushButton_3->setEnabled(true); ui->pushButton_4->setEnabled(true); //点动的按钮(6个) ui->DotKeepRunBtn->setEnabled(true); ui->DotPositiveBtn->setEnabled(true); ui->DotReverseBtn->setEnabled(true); ui->DotSpeedUpdataBtn->setEnabled(true); ui->DotStepUpdataBtn->setEnabled(true); ui->DotStopRunBtn->setEnabled(true); //基础运动的按钮(8个) ui->RunKeepBtn->setEnabled(true); ui->RunPlaceUpdataBtn->setEnabled(true); ui->RunSpeedUpdataBtn->setEnabled(true); ui->RunStartAbsolutBtn->setEnabled(true); ui->RunStartPlaceModifyBtn->setEnabled(true); ui->RunStartRelativeBtn->setEnabled(true); ui->RunStopBtn->setEnabled(true); ui->RunTimeUpdataBtn->setEnabled(true); //多段运动的按钮(5个)+1个多选框 ui->RunMoreAddRunBtn->setEnabled(true); ui->RunMoreDataUpdataBtn->setEnabled(true); ui->RunMoreKeepBtn->setEnabled(true); ui->RunMoreModelBox->setEnabled(true); ui->RunMoreStartBtn->setEnabled(true); ui->RunMoreStopBtn->setEnabled(true); } else { ConStatusImg->setStyleSheet(m_red_SheetStyle); //基础配置的按钮(3个) ui->pushButton_2->setEnabled(false); ui->pushButton_3->setEnabled(false); ui->pushButton_4->setEnabled(false); //点动的按钮(6个) ui->DotKeepRunBtn->setEnabled(false); ui->DotPositiveBtn->setEnabled(false); ui->DotReverseBtn->setEnabled(false); ui->DotSpeedUpdataBtn->setEnabled(false); ui->DotStepUpdataBtn->setEnabled(false); ui->DotStopRunBtn->setEnabled(false); //基础运动的按钮(8个) ui->RunKeepBtn->setEnabled(false); ui->RunPlaceUpdataBtn->setEnabled(false); ui->RunSpeedUpdataBtn->setEnabled(false); ui->RunStartAbsolutBtn->setEnabled(false); ui->RunStartPlaceModifyBtn->setEnabled(false); ui->RunStartRelativeBtn->setEnabled(false); ui->RunStopBtn->setEnabled(false); ui->RunTimeUpdataBtn->setEnabled(false); //多段运动的按钮(5个)+1个多选框 ui->RunMoreAddRunBtn->setEnabled(false); ui->RunMoreDataUpdataBtn->setEnabled(false); ui->RunMoreKeepBtn->setEnabled(false); ui->RunMoreModelBox->setEnabled(false); ui->RunMoreStartBtn->setEnabled(false); ui->RunMoreStopBtn->setEnabled(false); } //显示对应的从站状态 switch (SalveStatus()) { case 1: { SalveStatusShow->setText(QStringLiteral("INIT")); break; } case 2: { SalveStatusShow->setText(QStringLiteral("PreOP")); break; } case 4: { SalveStatusShow->setText(QStringLiteral("SafeOP")); break; } case 8: { SalveStatusShow->setText(QStringLiteral("OP")); break; } default: SalveStatusShow->setText(QStringLiteral("其它")); break; } } /****************************Slot_ShowWin函数********************************* Function :设置对话框为模态窗口 Output : *********************************************************************/ void MotorControll::Slot_ShowWin() { this->setWindowModality(Qt::ApplicationModal); } /****************************InitMonitor函数********************************* Function :初始化监视窗口的函数 Output : *********************************************************************/ void MotorControll::InitMonitor() { //添加表头 QStringList TableHeadTitle; int TableHeadTitleLength; TableHeadTitle.push_back(QStringLiteral("寄存器")); TableHeadTitle.push_back(QStringLiteral("监控值")); TableHeadTitle.push_back(QStringLiteral("备注")); TableHeadTitleLength=TableHeadTitle.length(); ui->DataMonitorTableWidget->setColumnCount(TableHeadTitleLength); ui->DataMonitorTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); for(int i=0;iDataMonitorTableWidget->setHorizontalHeaderItem(i,TableHeadItem[i]); } //添加监控值初始数据 AddMonitorVal(&MonitorSM2001,"false","SM2001","轴运动标识"); AddMonitorVal(&MonitorSM2010,"false","SM2010","使能标识"); AddMonitorVal(&MonitorSM2011,"false","SM2011","正向点动标识"); AddMonitorVal(&MonitorSM2012,"false","SM2012","反向点动标识"); AddMonitorVal(&MonitorSD2042,"0","SD2042","点动速度"); AddMonitorVal(&MonitorSD2040,"0","SD2040","点动步长"); AddMonitorVal(&MonitorSD2001,"0","SD2001","运行模式"); AddMonitorVal(&MonitorSD2010,"0","SD2010","当前运行速度"); AddMonitorVal(&MonitorSD2008,"0","SD2008","当前位置"); AddMonitorVal(&MonitorSD2030,"0","SD2030","设定位置"); AddMonitorVal(&MonitorSD2032,"0","SD2032","设定速度"); AddMonitorVal(&MonitorSD2034,"0","SD2034","设定加速时间"); AddMonitorVal(&MonitorSD2036,"0","SD2036","设定减速时间"); } /****************************AddMonitorVal函数********************************* Function :添加监视栏数据 Output : *********************************************************************/ void MotorControll::AddMonitorVal(QTableWidgetItem **Item,QString Value,QString QStrName,QString QStrVal) { int Row=ui->DataMonitorTableWidget->rowCount(); ui->DataMonitorTableWidget->insertRow(Row); MonitorLogs.push_back(new QTableWidgetItem(QStrName)); MonitorLogs.at(MonitorLogs.length()-1)->setTextAlignment(Qt::AlignCenter); ui->DataMonitorTableWidget->setItem(Row,0,MonitorLogs.at(MonitorLogs.length()-1)); (*Item)=new QTableWidgetItem(Value); (*Item)->setTextAlignment(Qt::AlignCenter); ui->DataMonitorTableWidget->setItem(Row,1,*Item); MonitorLogs.push_back(new QTableWidgetItem(QStrVal)); MonitorLogs.at(MonitorLogs.length()-1)->setTextAlignment(Qt::AlignCenter); ui->DataMonitorTableWidget->setItem(Row,2,MonitorLogs.at(MonitorLogs.length()-1)); } /****************************SetMonitorVal函数********************************* Function :将需要监控的对象加入到监视表中 Output : *********************************************************************/ void MotorControll::SetMonitorVal(QTableWidgetItem *Item,bool Type,int addr) { if(Type) { Item->setText(QString::number(ReadSDShort(addr))); }else { if(ReadSMBool(addr)) { Item->setText("true"); }else { Item->setText("false"); } } } /****************************Slot_Monitor函数********************************* Function :信号,当触发该信号时,将需要监视的对象设置到监视表中 Output : *********************************************************************/ void MotorControll::Slot_Monitor() { SetMonitorVal(MonitorSM2001,false,2001); SetMonitorVal(MonitorSM2010,false,2010); SetMonitorVal(MonitorSM2011,false,2011); SetMonitorVal(MonitorSM2012,false,2012); SetMonitorVal(MonitorSD2042,true,2042); SetMonitorVal(MonitorSD2040,true,2040); SetMonitorVal(MonitorSD2001,true,2001); SetMonitorVal(MonitorSD2010,true,2010); SetMonitorVal(MonitorSD2008,true,2008); SetMonitorVal(MonitorSD2030,true,2030); SetMonitorVal(MonitorSD2032,true,2032); SetMonitorVal(MonitorSD2034,true,2034); SetMonitorVal(MonitorSD2036,true,2036); } /****************************通信连接按钮的槽函数函数********************************* Function :点击通信连接按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_pushButton_clicked() { Xcon.setWindowFlags(Qt::Dialog|Qt::WindowCloseButtonHint); Xcon.setWindowModality(Qt::ApplicationModal); Xcon.show(); } /****************************C运动相关参数配置的槽函数********************************* Function :点击C运动参数配置按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_pushButton_2_clicked() { Apar.setWindowFlags(Qt::Dialog|Qt::WindowCloseButtonHint|Qt::WindowMaximizeButtonHint); Apar.setWindowModality(Qt::ApplicationModal); Apar.show(); } /****************************************************点动模块*****************************************************/ /****************************开启电机的槽函数********************************* Function :点击开启电机按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_pushButton_3_clicked() { //关闭 WriteMBool(5,false); WriteMBool(10,false); WriteMBool(15,false); WriteMBool(20,false); WriteMBool(25,false); WriteMBool(30,false); WriteMBool(35,false); //使能 WriteMBool(0,true); } /****************************关闭电机的槽函数********************************* Function :点击关闭电机按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_pushButton_4_clicked() { //关闭 WriteMBool(5,false); WriteMBool(10,false); WriteMBool(15,false); WriteMBool(20,false); WriteMBool(25,false); WriteMBool(30,false); WriteMBool(35,false); WriteMBool(0,false); } /****************************更新步长的槽函数********************************* Function :点击更新步长按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotStepUpdataBtn_clicked() { short value=ui->DotStepLedit->text().toShort(); WriteDShort(0,value); } /****************************更新点动速度的槽函数********************************* Function :点击更新点动速度按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotSpeedUpdataBtn_clicked() { short value=ui->DotSpeedLedit->text().toShort(); WriteDShort(50,value); } /****************************正向点动的槽函数********************************* Function :点击正向点动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotPositiveBtn_clicked() { WriteMBool(10,false); WriteMBool(5,true); } /****************************反向点动的槽函数********************************* Function :点击反向点动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotReverseBtn_clicked() { WriteMBool(5,false); WriteMBool(10,true); } /****************************停止运动的槽函数********************************* Function :点击停止运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotStopRunBtn_clicked() { WriteMBool(15,true); } /****************************继续运动的槽函数********************************* Function :点击继续运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_DotKeepRunBtn_clicked() { WriteMBool(15,false); } /****************************************************基础运动模块*****************************************************/ /****************************更新位置的槽函数********************************* Function :点击更新位置按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunPlaceUpdataBtn_clicked() { int value=ui->RunPlaceLedit->text().toInt(); WriteDInt(100,value); } /****************************更新速度的槽函数********************************* Function :点击更新速度按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunSpeedUpdataBtn_clicked() { int value=ui->RunSpeedLedit->text().toInt(); WriteDInt(150,value); } /****************************更新时间的槽函数********************************* Function :点击更新时间按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunTimeUpdataBtn_clicked() { int value=ui->RunTimeLedit->text().toInt(); WriteDInt(200,value); } /****************************修改位置的槽函数********************************* Function :点击修改位置按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunStartPlaceModifyBtn_clicked() { int value=ui->RunStartPlaceLedit->text().toInt(); WriteDInt(450,value); WriteMBool(40,true); WriteMBool(40,false); } /****************************绝对运动的槽函数********************************* Function :点击绝对运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunStartAbsolutBtn_clicked() { WriteMBool(30,true); WriteMBool(30,false); } /****************************相对运动的槽函数********************************* Function :点击相对运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunStartRelativeBtn_clicked() { WriteMBool(25,true); WriteMBool(25,false); } /****************************停止运动的槽函数********************************* Function :点击停止运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunStopBtn_clicked() { WriteMBool(20,false); WriteMBool(15,true); } /****************************继续运动的槽函数********************************* Function :点击继续运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunKeepBtn_clicked() { WriteMBool(15,false); WriteMBool(20,true); } /****************************************************多段运动模块*****************************************************/ /****************************添加运动的槽函数********************************* Function :点击添加运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunMoreAddRunBtn_clicked() { Movement.setWindowFlags(Qt::Dialog|Qt::WindowCloseButtonHint|Qt::WindowMaximizeButtonHint); Movement.setWindowModality(Qt::ApplicationModal); Movement.show(); } /****************************更新数据的槽函数********************************* Function :点击更新数据按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunMoreDataUpdataBtn_clicked() { int AddValue=ui->RunMoreAddSpeedTimeLedit->text().toInt(); int SubValue=ui->RunMoreSubSpeedTimeLedit->text().toInt(); int RunModel=ui->RunMoreModelBox->currentIndex(); WriteDInt(400,RunModel); WriteDInt(404,AddValue); WriteDInt(406,SubValue); } /****************************启动运动的槽函数********************************* Function :点击启动运动按钮,会触发该槽函数 Output : *********************************************************************/ void MotorControll::on_RunMoreStartBtn_clicked() { WriteMBool(35,true); WriteMBool(35,false); } /****************************closeEvent函数********************************* Function :窗口关闭事件函数 Output : *********************************************************************/ void MotorControll::closeEvent(QCloseEvent *event) { QMessageBox::StandardButton Value=QMessageBox::question(this,QStringLiteral("退出提示"),QStringLiteral("确认退出程序?")); if(Value==QMessageBox::Yes) { emit CloseWin(); event->accept(); }else { event->ignore(); } }