Explorar el Código

项目代码上传

master
caitiancheng hace 3 años
padre
commit
eb54bd8661
Se han modificado 18 ficheros con 3227 adiciones y 0 borrados
  1. +50
    -0
      TraimCamp_MotorControl/MotorControll_Project.pro
  2. +312
    -0
      TraimCamp_MotorControl/addpar.cpp
  3. +71
    -0
      TraimCamp_MotorControl/addpar.h
  4. +71
    -0
      TraimCamp_MotorControl/addpar.ui
  5. +132
    -0
      TraimCamp_MotorControl/base.cpp
  6. +45
    -0
      TraimCamp_MotorControl/base.h
  7. +22
    -0
      TraimCamp_MotorControl/main.cpp
  8. +270
    -0
      TraimCamp_MotorControl/moretypemovement.cpp
  9. +59
    -0
      TraimCamp_MotorControl/moretypemovement.h
  10. +142
    -0
      TraimCamp_MotorControl/moretypemovement.ui
  11. +693
    -0
      TraimCamp_MotorControl/motorcontroll.cpp
  12. +161
    -0
      TraimCamp_MotorControl/motorcontroll.h
  13. +789
    -0
      TraimCamp_MotorControl/motorcontroll.ui
  14. +90
    -0
      TraimCamp_MotorControl/xnet/include/x_net.h
  15. +132
    -0
      TraimCamp_MotorControl/xnet/include/xnetclient.h
  16. +78
    -0
      TraimCamp_MotorControl/xnetconnect.cpp
  17. +44
    -0
      TraimCamp_MotorControl/xnetconnect.h
  18. +66
    -0
      TraimCamp_MotorControl/xnetconnect.ui

+ 50
- 0
TraimCamp_MotorControl/MotorControll_Project.pro Ver fichero

@@ -0,0 +1,50 @@
#-------------------------------------------------
#
# Project created by QtCreator 2021-12-19T08:09:36
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MotorControll_Project
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS

win32
{
CONFIG(debug,debug|release)
{
LIBS+=$$PWD/xnet/lib/debug/libX_Net.a
}
CONFIG(release,debug|release)
{
LIBS+=$$PWD/xnet/lib/release/libX_Net.a
}

INCLUDEPATH+=\
$$PWD/xnet/include/ \
$$PWD/motionctrl/include/
}


SOURCES += main.cpp\
motorcontroll.cpp \
base.cpp \
xnetconnect.cpp \
addpar.cpp \
moretypemovement.cpp

HEADERS += motorcontroll.h \
base.h \
xnet/include/x_net.h \
xnet/include/xnetclient.h \
xnetconnect.h \
addpar.h \
moretypemovement.h

FORMS += motorcontroll.ui \
xnetconnect.ui \
addpar.ui \
moretypemovement.ui

+ 312
- 0
TraimCamp_MotorControl/addpar.cpp Ver fichero

@@ -0,0 +1,312 @@
/******************************addpar.cpp文件说明**********************************
* Descript :源文件,包含C运动参数配置窗口的函数实现
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/


/***********************************头文件****************************************/
#include "addpar.h"
#include "ui_addpar.h"
#include <QCloseEvent>
#include <QMessageBox>


/***********************************类的声明和继承****************************************/
AddPar::AddPar(QWidget *parent) :
QWidget(parent),
ui(new Ui::AddPar)
{
ui->setupUi(this);
//初始化配置
InitTree();
//设置窗口标题
setWindowTitle("C运动参数配置");
}


/****************************closeEvent函数*********************************
Function :窗口关闭事件函数
Output :
*********************************************************************/
void AddPar::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton Value=QMessageBox::question(this,QStringLiteral("退出提示"),QStringLiteral("确认数据已经同步到设备?"));
if(Value==QMessageBox::Yes)
{
emit CloseWin();
event->accept();
}else
{
event->ignore();
}
}

/****************************showEvent函数*********************************
Function :如果从站连接上,更新数据
Output :
*********************************************************************/
void AddPar::showEvent(QShowEvent *event)
{
if(ConStatus())
{
event->accept();
Updata();
}
}

/****************************ReadArgRunCrl函数*********************************
Function :读取从站数据
Output :
*********************************************************************/
void AddPar::ReadArgRunCrl(QStandardItem *Item,int Addr,int Row)
{
int Value;
Value=ReadSFDInt(Addr);
Item->child(Row,2)->setText(QString::number(Value));
}


/****************************FreeQList函数*********************************
Function :删除列表参数
Output :
*********************************************************************/
void AddPar::FreeQList(QList<QStandardItem *> *Item)
{
for(int i=0;i<Item->length();i++)
{
delete Item->at(i);
}
}

/****************************InitTree函数*********************************
Function :初始化函数
Output :
*********************************************************************/
void AddPar::InitTree()
{
//定义数据行对象
QStringList QStrListTemp;
//初始化模型
Model=new QStandardItemModel();
//配置分类选择信号
connect(Model,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(TreeItemChanged(QStandardItem*)));
//建立列名
TreeHead.push_back(QStringLiteral("名称"));
TreeHead.push_back(QStringLiteral("离线值"));
TreeHead.push_back(QStringLiteral("在线值"));
TreeHead.push_back(QStringLiteral("单位"));
TreeHead.push_back(QStringLiteral("备注"));
Model->setHorizontalHeaderLabels(TreeHead);
//建立行分类
BaseClass=new QStandardItem(QStringLiteral("基础参数"));
RunCtrlClass=new QStandardItem(QStringLiteral("运动限制"));
//建立分类可选择
BaseClass->setCheckable(true);
BaseClass->setEditable(false);
RunCtrlClass->setCheckable(true);
RunCtrlClass->setEditable(false);

//分类加入模型
Model->appendRow(BaseClass);
Model->appendRow(RunCtrlClass);


//建立数据行
//编码器的旋转计数
QStrListTemp.clear();
QStrListTemp.push_back(QStringLiteral("单圈脉冲"));
QStrListTemp.push_back("0");
QStrListTemp.push_back("0");
QStrListTemp.push_back("");
QStrListTemp.push_back("编码器旋转一圈的计数值,根据电机编码器设定,如果17位,设置成131072");
NewChildLine(BaseClass,&BaseOtp,QStrListTemp);

//每圈移动量
QStrListTemp.clear();
QStrListTemp.push_back(QStringLiteral("移动量"));
QStrListTemp.push_back("0");
QStrListTemp.push_back("0");
QStrListTemp.push_back("脉冲");
QStrListTemp.push_back("每圈移动需要的脉冲");
NewChildLine(BaseClass,&BaseMnum,QStrListTemp);

//最高速度
QStrListTemp.clear();
QStrListTemp.push_back(QStringLiteral("最大速度"));
QStrListTemp.push_back("0");
QStrListTemp.push_back("0");
QStrListTemp.push_back("脉冲/秒");
QStrListTemp.push_back("电机可以运行的最大速度");
NewChildLine(RunCtrlClass,&RunSpeed,QStrListTemp);

//最快加速度
QStrListTemp.clear();
QStrListTemp.push_back(QStringLiteral("最快加速度时间"));
QStrListTemp.push_back("0");
QStrListTemp.push_back("0");
QStrListTemp.push_back("毫秒");
QStrListTemp.push_back("最快加速时间,根据该时间,系统自动计算对应加速相关参数");
NewChildLine(RunCtrlClass,&RunAddSpeed,QStrListTemp);

//最快减速度
QStrListTemp.clear();
QStrListTemp.push_back(QStringLiteral("最快减速度时间"));
QStrListTemp.push_back("0");
QStrListTemp.push_back("0");
QStrListTemp.push_back("毫秒");
QStrListTemp.push_back("最快减速时间,根据该时间,系统自动计算对应减速相关参数");
NewChildLine(RunCtrlClass,&RunSubSpeed,QStrListTemp);

//加载模型到树
ui->ArgDataTreeView->setModel(Model);
ui->ArgDataTreeView->expandAll();
}



/****************************TreeItemChanged函数*********************************
Function :模型数参数改变
Output :
*********************************************************************/
void AddPar::TreeItemChanged(QStandardItem *Item)
{
if (Item->isCheckable()&&Item->hasChildren())
{
Qt::CheckState status = Item->checkState ();
for(int i = 0;i<Item->rowCount();++i)
{
QStandardItem* ItemChild = Item->child(i);
ItemChild->setCheckState(status);
}
}
}


/****************************NewChildLine函数*********************************
Function :新子行建立
Output :
*********************************************************************/
void AddPar::NewChildLine(QStandardItem *Item,QList<QStandardItem *> *ItemList,QStringList Data)
{
int RowCount;
ItemList->clear();
for(int i=0;i<Data.length();i++)
{
ItemList->push_back(new QStandardItem(Data.at(i)));
if(i!=1)
{
ItemList->at(i)->setEditable(false);
}
}

RowCount=Item->rowCount();
ItemList->at(0)->setCheckable(true);
Item->appendRow(ItemList->at(0));
for(int i=1;i<Data.length();i++)
{
Item->setChild(RowCount,i,ItemList->at(i));
}
}


/****************************DownLoadData函数*********************************
Function :下载从站数据
Output :
*********************************************************************/
int AddPar::DownLoadData(QStandardItem *Item,QString Name,int Addr,int Row)
{
bool ok=true;
int Value=0;
if(Item->child(Row)->checkState()==Qt::Checked)
{
Value=Item->child(Row,1)->text().toInt(&ok);
if(!ok)
{
QMessageBox::information(this,Name,QStringLiteral("写入失败"));
return ReFild;
}
WriteSFDInt(Addr,Value);
return ReSuess;
}
return ReUncheck;
}


/****************************下载按钮槽函数*********************************
Function :点击下载按钮,会触发该槽函数
Output :
*********************************************************************/
void AddPar::on_DownloadBtn_clicked()
{
int count=0;
int value=0;
if(!ConStatus())
{
QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
}
else
{
value=DownLoadData(BaseClass,"单圈脉冲",3002,0);
count+=value==1?1:0;
value=DownLoadData(BaseClass,"移动量",3004,1);
count+=value==1?1:0;
value=DownLoadData(RunCtrlClass,"最大速度",3018,0);
count+=value==1?1:0;
value=DownLoadData(RunCtrlClass,"最快加速度时间",3020,1);
count+=value==1?1:0;
value=DownLoadData(RunCtrlClass,"最快减速度时间",3022,2);
count+=value==1?1:0;
QMessageBox::information(this,QStringLiteral("下载提示"),QStringLiteral("写入成功:")+QString::number(count));
}
}

/****************************Updata函数*********************************
Function :更新数据的函数
Output :
*********************************************************************/
void AddPar::Updata()
{
ReadArgRunCrl(BaseClass,3002,0);
ReadArgRunCrl(BaseClass,3004,1);
ReadArgRunCrl(RunCtrlClass,3018,0);
ReadArgRunCrl(RunCtrlClass,3020,1);
ReadArgRunCrl(RunCtrlClass,3022,2);
}




/****************************上载参数按钮槽函数*********************************
Function :点击上载参数按钮,会触发该槽函数
Output :
*********************************************************************/
void AddPar::on_UploadBtn_clicked()
{
if(!ConStatus())
{
QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
}
else
{
Updata();
}
}



/******************************************************析构函数*****************************************************/
AddPar::~AddPar()
{
delete Model;
delete BaseClass;
FreeQList(&BaseOtp);
FreeQList(&BaseMnum);
delete RunCtrlClass;
FreeQList(&RunSpeed);
FreeQList(&RunAddSpeed);
FreeQList(&RunSubSpeed);
delete ui;
}



+ 71
- 0
TraimCamp_MotorControl/addpar.h Ver fichero

@@ -0,0 +1,71 @@
/******************************addpar.h文件说明**********************************
* Descript :头文件,包含C运动参数配置窗口的头文件引用,以及宏定义
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/
#ifndef ADDPAR_H
#define ADDPAR_H


/***********************************头文件****************************************/
#include <QWidget>
#include <QStandardItemModel>
#include <Base.h>



/***********************************类的声明和继承****************************************/
namespace Ui {
class AddPar;
}

class AddPar : public QWidget,public Base
{
Q_OBJECT

public:
explicit AddPar(QWidget *parent = 0);
~AddPar();
signals:
void CloseWin();

protected:
void closeEvent(QCloseEvent *event=NULL);
void showEvent(QShowEvent *event=NULL);

private slots:
void TreeItemChanged(QStandardItem *Item);

void on_DownloadBtn_clicked();
void on_UploadBtn_clicked();

private:
typedef enum {ReFild,ReSuess,ReUncheck}ReturnFlag;
Ui::AddPar *ui;
void InitTree();
QStringList TreeHead;
QStandardItemModel *Model;
//基础参数
QStandardItem *BaseClass;
//一圈脉冲
QList<QStandardItem *> BaseOtp;
//移动量
QList<QStandardItem *> BaseMnum;

//运动限制
QStandardItem *RunCtrlClass;
//最高速度
QList<QStandardItem *> RunSpeed;
//最快加速度
QList<QStandardItem *> RunAddSpeed;
//最快减速度
QList<QStandardItem *> RunSubSpeed;

int DownLoadData(QStandardItem *Item,QString Name,int Addr,int Row);
void Updata();
void NewChildLine(QStandardItem *Item,QList<QStandardItem *> *ItemList,QStringList Data);
void ReadArgRunCrl(QStandardItem *Item,int Addr,int Row);
void FreeQList(QList<QStandardItem *> *Item);
};

#endif // ADDPAR_H

+ 71
- 0
TraimCamp_MotorControl/addpar.ui Ver fichero

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AddPar</class>
<widget class="QWidget" name="AddPar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>535</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QTreeView" name="ArgDataTreeView">
<property name="geometry">
<rect>
<x>11</x>
<y>11</y>
<width>513</width>
<height>241</height>
</rect>
</property>
<attribute name="headerCascadingSectionResizes">
<bool>true</bool>
</attribute>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>260</y>
<width>511</width>
<height>30</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="DownloadBtn">
<property name="text">
<string>下载参数</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="UploadBtn">
<property name="text">
<string>上载参数</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

+ 132
- 0
TraimCamp_MotorControl/base.cpp Ver fichero

@@ -0,0 +1,132 @@
/******************************base.cpp文件说明**********************************
* Descript :源文件,包含项目所需要使用的Xnet函数的实现
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/



/******************************************头文件***********************************************/
#include "base.h"

/****************************ConStatus函数*********************************
Function :读从站连接状态
Output :从站连接状态
*********************************************************************/
bool Base::ConStatus()
{
bool Ok=true;
short Res;
Read_Short(XNet_SD,8020,1,&Res);
if(Res==1)
{
Ok=true;
}else
{
Ok=false;
}
return Ok;
}


/****************************SalveStatus函数*********************************
Function :读从站状态
Output :返回读出的值
*********************************************************************/
int Base::SalveStatus()
{
short Res;
Read_Short(XNet_SD,8021,1,&Res);
return Res;
}



/****************************WriteMBool函数*********************************
Function :写M寄存器的值
Output :
*********************************************************************/
void Base::WriteMBool(int start,bool ok)
{
Write_Bool(XNet_M,start,1,ok);
}


/****************************WriteDShort函数*********************************
Function :写D寄存器short型(单字)的值
Output :
*********************************************************************/
void Base::WriteDShort(int start,short value)
{
Write_Short(XNet_D,start,1,value);
}


/****************************WriteDInt函数*********************************
Function :写D寄存器int型(双字)的值
Output :
*********************************************************************/
void Base::WriteDInt(int start,int value)
{
Write_Int(XNet_D,start,2,value);
}


/****************************WriteSDShort函数*********************************
Function :写SD寄存器short型的值
Output :
*********************************************************************/
void Base::WriteSDShort(int start,int value)
{
Write_Short(XNet_SD,start,2,value);
}


/****************************WriteSFDInt函数*********************************
Function :写SFD寄存器int型的值
Output :
*********************************************************************/
void Base::WriteSFDInt(int start,int value)
{
Write_Int(XNet_SFD,start,2,value);
}



/****************************ReadSFDInt函数*********************************
Function :读SFD寄存器int型的值
Output :返回读出的值
*********************************************************************/
int Base::ReadSFDInt(int Addr)
{
int ResValue;
Read_Int(XNet_SFD,Addr,2,&ResValue);
return ResValue;
}


/****************************ReadSMBool函数*********************************
Function :读SM寄存器的值
Output :返回读出的值
*********************************************************************/
bool Base::ReadSMBool(int Addr)
{
bool ResValue;
Read_Bool(XNet_SM,Addr,1,&ResValue);
return ResValue;
}


/****************************ReadSDShort函数*********************************
Function :读SD寄存器的值
Output :返回读出的值
*********************************************************************/
short Base::ReadSDShort(int Addr)
{
short ResValue;
Read_Short(XNet_SD,Addr,1,&ResValue);
return ResValue;
}




+ 45
- 0
TraimCamp_MotorControl/base.h Ver fichero

@@ -0,0 +1,45 @@
/******************************base.h文件说明**********************************
* Descript :头文件,包含项目需要调用的Xnet函数的头文件引用,以及宏定义
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/
#ifndef BASE_H
#define BASE_H


/***********************************头文件****************************************/
#include <x_net.h>
#include <QString>


/***********************************类的声明和继承****************************************/
class Base
{
public:
//判断连接状态的函数
bool ConStatus();
//从从站状态函数
int SalveStatus();


//M寄存器写值函数
void WriteMBool(int start,bool ok);
//D寄存器写short型值函数
void WriteDShort(int start,short value);
//SD寄存器写short型值函数
void WriteSDShort(int start,int value);
//D寄存器写int型值函数
void WriteDInt(int start,int value);
//SFD寄存器写int型值函数
void WriteSFDInt(int start,int value);


//读SM寄存器的值
bool ReadSMBool(int Addr);
//读SFD寄存器的值
int ReadSFDInt(int Addr);
//读SD寄存器的值
short ReadSDShort(int Addr);
};

#endif // BASE_H

+ 22
- 0
TraimCamp_MotorControl/main.cpp Ver fichero

@@ -0,0 +1,22 @@
/******************************main.cpp文件说明**********************************
* Descript :.cpp文件,包含main函数的程序入口
* Author :caitiancheng
* Date :2021_12_18
*******************************************************************************/


/***********************************头文件****************************************/
#include "motorcontroll.h"
#include <QApplication>



/***********************************主函数****************************************/
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MotorControll w;
w.show();

return a.exec();
}

+ 270
- 0
TraimCamp_MotorControl/moretypemovement.cpp Ver fichero

@@ -0,0 +1,270 @@
/******************************moretypemovement.cpp文件说明**********************************
* Descript :.源文件,包含多段运动添加数据窗口的函数实现
* Author :caitiancheng
* Date :2021_12_18
*******************************************************************************/


/******************************************头文件***********************************************/
#include "moretypemovement.h"
#include "ui_moretypemovement.h"
#include <QMessageBox>
#include <QCloseEvent>


/***********************************类的声明和继承****************************************/
MoreTypeMovement::MoreTypeMovement(QWidget *parent) :
QWidget(parent),
ui(new Ui::MoreTypeMovement)
{
ui->setupUi(this);
InitDataTable();
}



/****************************InitDataTable函数*********************************
Function :初始化数据窗口函数
Output :
*********************************************************************/
void MoreTypeMovement::InitDataTable()
{
QStringList TableHeadTitle;
int TableHeadTitleLength;
TableHeadTitle.push_back(QStringLiteral("位置"));
TableHeadTitle.push_back(QStringLiteral("速度"));
TableHeadTitleLength=TableHeadTitle.length();
ui->RunDataTWidget->setColumnCount(TableHeadTitleLength);

for(int i=0;i<TableHeadTitleLength;i++)
{
TableHeadItem.push_back(new QTableWidgetItem(TableHeadTitle[i]));
ui->RunDataTWidget->setHorizontalHeaderItem(i,TableHeadItem[i]);
}
ui->RunDataTWidget->horizontalHeader()->setStretchLastSection(true);
ui->DelRowDataBtn->setEnabled(false);
ui->DownRowDataBtn->setEnabled(false);
ui->UpRowDataBtn->setEnabled(false);
ui->WriteRowDataBtn->setEnabled(false);
}




/****************************CopyTableRow函数*********************************
Function :复制数据表排函数
Output :
*********************************************************************/
void MoreTypeMovement::CopyTableRow(int AtRow,int ToRow)
{
int ColumnCountLog = ui->RunDataTWidget->columnCount();
for(int i=0; i<ColumnCountLog; i++){
QString TableItemValue = ui->RunDataTWidget->item(AtRow, i)->text();
QTableWidgetItem *TableItemdm = new QTableWidgetItem;
TableItemdm->setText(TableItemValue);
ui->RunDataTWidget->setItem(ToRow, i, TableItemdm);
}
}




/****************************MoveTableRow函数*********************************
Function :移动数据表排函数
Output :
*********************************************************************/
void MoreTypeMovement::MoveTableRow(int AtRow,int ToRow)
{
int RowSum=ui->RunDataTWidget->rowCount();
int RowTarget=0;
bool direction=AtRow<ToRow?true:false;
if(direction&&ToRow>RowSum-1)
{
return;
}
if(!direction&&ToRow<0)
{
return;
}
int SelectColumn=-1;
QTableWidgetItem *SelectItem= ui->RunDataTWidget->currentItem();
if(SelectItem!=NULL)
{
SelectColumn=SelectItem->column();
}
if(direction)
{
RowTarget=ToRow+1;
ui->RunDataTWidget->insertRow(RowTarget);
CopyTableRow(AtRow,RowTarget);
ui->RunDataTWidget->removeRow(AtRow);
}else
{
RowTarget=ToRow;
ui->RunDataTWidget->insertRow(RowTarget);
CopyTableRow(AtRow+1,RowTarget);
ui->RunDataTWidget->removeRow(AtRow+1);
}
ui->RunDataTWidget->selectRow(ToRow);

if(SelectColumn>-1)
{
ui->RunDataTWidget->setCurrentCell(ToRow,SelectColumn);
}

}


/****************************GetTableNum函数*********************************
Function :获取列表行数
Output :
*********************************************************************/
int MoreTypeMovement::GetTableNum(QString &Str,bool *ok)
{
int ResNum=0;
int Slen=0;
if(ok==NULL)
{
bool BoolTemp;
ok=&BoolTemp;
}
*ok=false;
if(Str.isEmpty())
{
return ResNum;
}
Slen=Str.length();
for(int i=0;i<Slen;i++)
{
if(Str.at(i)>='0'&&Str.at(i)<='9')
{
ResNum=ResNum*10+Str.at(i).toLatin1()-'0';
}else
{
return 0;
}
}
*ok=true;
return ResNum;
}



/****************************closeEvent函数*********************************
Function :关闭窗口事件函数
Output :
*********************************************************************/
void MoreTypeMovement::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton Value=QMessageBox::question(this,QStringLiteral("退出提示"),QStringLiteral("确认数据已经同步到设备?"));
if(Value==QMessageBox::Yes)
{
emit CloseWin();
event->accept();
}else
{
event->ignore();
}
}



/******************************************************析构函数*****************************************************/
MoreTypeMovement::~MoreTypeMovement()
{
delete ui;
}



/****************************************************槽函数*****************************************************/
/****************************添加按钮槽函数*********************************
Function :点击添加按钮,触发该槽函数
Output :
*********************************************************************/
void MoreTypeMovement::on_AddRowDataBtn_clicked()
{
int Row=ui->RunDataTWidget->rowCount();
if(Row>14)
{
QMessageBox::information(this,QStringLiteral("添加数据"),QStringLiteral("最多只能添加15段运动"));
return;
}
ui->RunDataTWidget->insertRow(Row);
ui->DelRowDataBtn->setEnabled(true);
ui->DownRowDataBtn->setEnabled(true);
ui->UpRowDataBtn->setEnabled(true);
ui->WriteRowDataBtn->setEnabled(true);
}



/****************************删除按钮槽函数*********************************
Function :点击删除按钮,触发该槽函数
Output :
*********************************************************************/
void MoreTypeMovement::on_DelRowDataBtn_clicked()
{
int Row=ui->RunDataTWidget->currentRow();
if(Row!=-1)
{
ui->RunDataTWidget->removeRow(Row);
}
}


/****************************上移按钮槽函数*********************************
Function :点击上移按钮,触发该槽函数
Output :
*********************************************************************/
void MoreTypeMovement::on_UpRowDataBtn_clicked()
{
int Row=ui->RunDataTWidget->currentRow();
MoveTableRow(Row,Row-1);
}



/****************************下移按钮槽函数*********************************
Function :点击上移按钮,触发该槽函数
Output :
*********************************************************************/
void MoreTypeMovement::on_DownRowDataBtn_clicked()
{
int Row=ui->RunDataTWidget->currentRow();
MoveTableRow(Row,Row+1);
}



/****************************写入按钮槽函数*********************************
Function :点击写入按钮,触发该槽函数
Output :
*********************************************************************/
void MoreTypeMovement::on_WriteRowDataBtn_clicked()
{
int Row=ui->RunDataTWidget->rowCount();
QString PlaceTemp;
QString SpeedTemp;
int WriteCount=0;
int RegAddr=250;
bool ok1,ok2;
int iPlaceTemp;
int iSpeedTemp;
for(int i=0;i<Row;i++)
{
PlaceTemp=ui->RunDataTWidget->item(i,0)->text();
SpeedTemp=ui->RunDataTWidget->item(i,1)->text();
iPlaceTemp=GetTableNum(PlaceTemp,&ok1);
iSpeedTemp=GetTableNum(SpeedTemp,&ok2);
if(ok1&&ok2)
{
WriteDInt(RegAddr,iPlaceTemp);
WriteDInt(RegAddr+2,iSpeedTemp);
RegAddr+=10;
WriteCount++;
}
}
WriteDInt(402,WriteCount);
QMessageBox::information(this,QStringLiteral("写入提示"),QStringLiteral("总共写入:")+QString::number(WriteCount)+QStringLiteral("段"));
}

+ 59
- 0
TraimCamp_MotorControl/moretypemovement.h Ver fichero

@@ -0,0 +1,59 @@
/******************************moretypemovement.h文件说明**********************************
* Descript :头文件,包含多段运动添加数据窗口的函数声明、头文件引用,以及宏定义
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/
#ifndef MORETYPEMOVEMENT_H
#define MORETYPEMOVEMENT_H



/***********************************头文件****************************************/
#include <QWidget>
#include<QTableWidgetItem>
#include<QMessageBox>
#include<Base.h>


/***********************************类的声明和继承****************************************/
namespace Ui {
class MoreTypeMovement;
}

class MoreTypeMovement : public QWidget,public Base
{
Q_OBJECT

public:
explicit MoreTypeMovement(QWidget *parent = 0);
~MoreTypeMovement();


signals:
void CloseWin();

protected:
void closeEvent(QCloseEvent *event=NULL);

private slots:
void on_AddRowDataBtn_clicked();

void on_DelRowDataBtn_clicked();

void on_UpRowDataBtn_clicked();

void on_DownRowDataBtn_clicked();

void on_WriteRowDataBtn_clicked();


private:
Ui::MoreTypeMovement *ui;
QList<QTableWidgetItem *> TableHeadItem;
void InitDataTable();
void CopyTableRow(int AtRow,int ToRow);
void MoveTableRow(int AtRow,int ToRow);
int GetTableNum(QString &Str,bool *ok=NULL);
};

#endif // MORETYPEMOVEMENT_H

+ 142
- 0
TraimCamp_MotorControl/moretypemovement.ui Ver fichero

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MoreTypeMovement</class>
<widget class="QWidget" name="MoreTypeMovement">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>662</width>
<height>367</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QTableWidget" name="RunDataTWidget">
<property name="geometry">
<rect>
<x>30</x>
<y>10</y>
<width>598</width>
<height>290</height>
</rect>
</property>
<property name="showGrid">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="cornerButtonEnabled">
<bool>true</bool>
</property>
<attribute name="horizontalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>131</number>
</attribute>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>30</number>
</attribute>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
<widget class="QPushButton" name="AddRowDataBtn">
<property name="geometry">
<rect>
<x>30</x>
<y>320</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>添加</string>
</property>
</widget>
<widget class="QPushButton" name="DelRowDataBtn">
<property name="geometry">
<rect>
<x>150</x>
<y>320</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>删除</string>
</property>
</widget>
<widget class="QPushButton" name="UpRowDataBtn">
<property name="geometry">
<rect>
<x>270</x>
<y>320</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>上移</string>
</property>
</widget>
<widget class="QPushButton" name="DownRowDataBtn">
<property name="geometry">
<rect>
<x>390</x>
<y>320</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>下移</string>
</property>
</widget>
<widget class="QPushButton" name="WriteRowDataBtn">
<property name="geometry">
<rect>
<x>520</x>
<y>320</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>写入</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

+ 693
- 0
TraimCamp_MotorControl/motorcontroll.cpp Ver fichero

@@ -0,0 +1,693 @@
/******************************motorcontroll.cpp文件说明**********************************
* Descript :源文件,包含主窗口的页面设计、函数的实现、信号的连接
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/


/***********************************头文件****************************************/
#include "motorcontroll.h"
#include "ui_motorcontroll.h"
#include<QDateTime>
#include <QCloseEvent>


/***********************************类的声明和继承****************************************/
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;i<MonitorLogsLen;i++)
{
delete MonitorLogs.at(i);
}
delete MonitorSM2001;
delete MonitorSM2010;
delete MonitorSM2011;
delete MonitorSM2012;
delete MonitorSD2042;
delete MonitorSD2040;
delete MonitorSD2001;
delete MonitorSD2010;
delete MonitorSD2008;
delete MonitorSD2030;
delete MonitorSD2032;
delete MonitorSD2034;
delete MonitorSD2036;


delete ui;
}


/****************************InitBarStatus函数*********************************
Function :初始化界面状态栏,进行相应的设置
Output :
*********************************************************************/
void MotorControll::InitBarStatus()
{
ui->statusBar->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;i<TableHeadTitleLength;i++)
{
TableHeadItem.push_back(new QTableWidgetItem(TableHeadTitle[i]));
ui->DataMonitorTableWidget->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();
}
}

+ 161
- 0
TraimCamp_MotorControl/motorcontroll.h Ver fichero

@@ -0,0 +1,161 @@
/******************************motorcontroll.h文件说明**********************************
* Descript :头文件,包含主窗口的头文件引用,以及宏定义
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/
#ifndef MOTORCONTROLL_H
#define MOTORCONTROLL_H


/***********************************头文件****************************************/
#include <QMainWindow>
#include <Base.h>
#include "XnetConnect.h"
#include "Addpar.h"
#include "moretypemovement.h"
#include <QTimer>
#include <QTableWidgetItem>
#include <QMessageBox>



/***********************************类的声明和继承****************************************/
namespace Ui {
class MotorControll;
}

class MotorControll : public QMainWindow,public Base
{
Q_OBJECT

public:
explicit MotorControll(QWidget *parent = 0);
~MotorControll();

signals:
void CloseWin();

protected:
void closeEvent(QCloseEvent *event=NULL);

private slots:

void Slot_Status();
void Slot_ShowWin();
void Slot_Monitor();

void on_pushButton_clicked();

void on_pushButton_2_clicked();

void on_pushButton_3_clicked();

void on_pushButton_4_clicked();

void on_DotStepUpdataBtn_clicked();

void on_DotSpeedUpdataBtn_clicked();

void on_DotPositiveBtn_clicked();

void on_DotReverseBtn_clicked();

void on_DotStopRunBtn_clicked();

void on_DotKeepRunBtn_clicked();

void on_RunPlaceUpdataBtn_clicked();

void on_RunSpeedUpdataBtn_clicked();

void on_RunTimeUpdataBtn_clicked();

void on_RunStartPlaceModifyBtn_clicked();

void on_RunStartAbsolutBtn_clicked();

void on_RunStartRelativeBtn_clicked();

void on_RunStopBtn_clicked();

void on_RunKeepBtn_clicked();

void on_RunMoreAddRunBtn_clicked();

void on_RunMoreDataUpdataBtn_clicked();

void on_RunMoreStartBtn_clicked();

private:
Ui::MotorControll *ui;
XnetConnect Xcon;
AddPar Apar;
MoreTypeMovement Movement;

//定义时间显示定时器
QTimer *TimeShow;
//定义监视栏定时器
QTimer *Monitor;

//监视栏初始化函数
void InitMonitor();

//控件连接的信号和槽函数
void InitConnect();

//状态栏界面设置初始化函数
void InitBarStatus();


//声明表格控件对象
QList<QTableWidgetItem *> TableHeadItem;

//状态栏
//定义连接状态定时器
QTimer *StatuTimer;
const QString m_red_SheetStyle = "min-width: 16px; min-height: 16px;max-width:16px; max-height: 16px;border-radius: 8px; border:1px solid black;background:red";
const QString m_green_SheetStyle = "min-width: 16px; min-height: 16px;max-width:16px; max-height: 16px;border-radius: 8px; border:1px solid black;background:green";
QLabel *ConStatusText;
QLabel *ConStatusImg;
QLabel *SalveStatusText;
QLabel *SalveStatusShow;



//监控的值对象
//用于记录一些不需要操作的数据,但需要释放
QList<QTableWidgetItem *> MonitorLogs;
//运动标识
QTableWidgetItem *MonitorSM2001;
//使能标识
QTableWidgetItem *MonitorSM2010;
//正向点动标识
QTableWidgetItem *MonitorSM2011;
//方向点动标识
QTableWidgetItem *MonitorSM2012;
//点动速度
QTableWidgetItem *MonitorSD2042;
//点动步长
QTableWidgetItem *MonitorSD2040;
//运行模式
QTableWidgetItem *MonitorSD2001;
//监控速度
QTableWidgetItem *MonitorSD2010;
//抽位置
QTableWidgetItem *MonitorSD2008;
//位置设定
QTableWidgetItem *MonitorSD2030;
//速度设定
QTableWidgetItem *MonitorSD2032;
//加速时间设定
QTableWidgetItem *MonitorSD2034;
//减速时间设定
QTableWidgetItem *MonitorSD2036;
//添加监控值函数
void AddMonitorVal(QTableWidgetItem **Item,QString Value,QString QStrName,QString QStrVal);
//加入监控槽
void SetMonitorVal(QTableWidgetItem *Item,bool Type,int addr);

};

#endif // MOTORCONTROLL_H

+ 789
- 0
TraimCamp_MotorControl/motorcontroll.ui Ver fichero

@@ -0,0 +1,789 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MotorControll</class>
<widget class="QMainWindow" name="MotorControll">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>965</width>
<height>867</height>
</rect>
</property>
<property name="windowTitle">
<string>MotorControll</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>361</width>
<height>161</height>
</rect>
</property>
<property name="title">
<string>基础配置</string>
</property>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>通信连接</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>230</x>
<y>30</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>C运动配置</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_3">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>开启电机</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_4">
<property name="geometry">
<rect>
<x>230</x>
<y>110</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>关闭电机</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>175</y>
<width>421</width>
<height>261</height>
</rect>
</property>
<property name="title">
<string>点动</string>
</property>
<widget class="QPushButton" name="DotPositiveBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>正向点动</string>
</property>
</widget>
<widget class="QPushButton" name="DotStepUpdataBtn">
<property name="geometry">
<rect>
<x>300</x>
<y>20</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新步长</string>
</property>
</widget>
<widget class="QPushButton" name="DotSpeedUpdataBtn">
<property name="geometry">
<rect>
<x>300</x>
<y>80</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新速度</string>
</property>
</widget>
<widget class="QPushButton" name="DotReverseBtn">
<property name="geometry">
<rect>
<x>160</x>
<y>140</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>反向点动</string>
</property>
</widget>
<widget class="QPushButton" name="DotKeepRunBtn">
<property name="geometry">
<rect>
<x>160</x>
<y>200</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>继续运动</string>
</property>
</widget>
<widget class="QPushButton" name="DotStopRunBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>200</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>停止运动</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>点动步长</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>10</x>
<y>90</y>
<width>70</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>点动速度</string>
</property>
</widget>
<widget class="QLineEdit" name="DotStepLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>30</y>
<width>131</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="DotSpeedLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>90</y>
<width>131</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>240</x>
<y>30</y>
<width>31</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>脉冲</string>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>240</x>
<y>90</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>脉冲/秒</string>
</property>
</widget>
<zorder>DotPositiveBtn</zorder>
<zorder>DotStepUpdataBtn</zorder>
<zorder>DotSpeedUpdataBtn</zorder>
<zorder>DotReverseBtn</zorder>
<zorder>DotKeepRunBtn</zorder>
<zorder>DotStopRunBtn</zorder>
<zorder>label</zorder>
<zorder>label_2</zorder>
<zorder>DotSpeedLedit</zorder>
<zorder>label_3</zorder>
<zorder>label_4</zorder>
<zorder>DotStepLedit</zorder>
</widget>
<widget class="QGroupBox" name="groupBox_3">
<property name="geometry">
<rect>
<x>480</x>
<y>10</y>
<width>481</width>
<height>434</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1000</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>监控</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTableWidget" name="DataMonitorTableWidget">
<property name="textElideMode">
<enum>Qt::ElideMiddle</enum>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox_4">
<property name="geometry">
<rect>
<x>10</x>
<y>480</y>
<width>441</width>
<height>341</height>
</rect>
</property>
<property name="title">
<string>基础运动</string>
</property>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>60</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>运行速度</string>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>60</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>目标位置</string>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>10</x>
<y>130</y>
<width>60</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>加速时间</string>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>10</x>
<y>180</y>
<width>60</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>位置修改</string>
</property>
</widget>
<widget class="QLineEdit" name="RunSpeedLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>80</y>
<width>140</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLineEdit" name="RunPlaceLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>30</y>
<width>140</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>10000</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLineEdit" name="RunTimeLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>130</y>
<width>140</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLineEdit" name="RunStartPlaceLedit">
<property name="geometry">
<rect>
<x>90</x>
<y>180</y>
<width>140</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>250</x>
<y>30</y>
<width>31</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>脉冲</string>
</property>
</widget>
<widget class="QLabel" name="label_10">
<property name="geometry">
<rect>
<x>250</x>
<y>80</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>脉冲/秒</string>
</property>
</widget>
<widget class="QLabel" name="label_11">
<property name="geometry">
<rect>
<x>250</x>
<y>130</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>毫秒</string>
</property>
</widget>
<widget class="QLabel" name="label_12">
<property name="geometry">
<rect>
<x>250</x>
<y>180</y>
<width>31</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>脉冲</string>
</property>
</widget>
<widget class="QPushButton" name="RunPlaceUpdataBtn">
<property name="geometry">
<rect>
<x>310</x>
<y>15</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新位置</string>
</property>
</widget>
<widget class="QPushButton" name="RunSpeedUpdataBtn">
<property name="geometry">
<rect>
<x>310</x>
<y>70</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新速度</string>
</property>
</widget>
<widget class="QPushButton" name="RunTimeUpdataBtn">
<property name="geometry">
<rect>
<x>310</x>
<y>120</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新时间</string>
</property>
</widget>
<widget class="QPushButton" name="RunStartPlaceModifyBtn">
<property name="geometry">
<rect>
<x>310</x>
<y>170</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>修改位置</string>
</property>
</widget>
<widget class="QPushButton" name="RunStartAbsolutBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>230</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>绝对运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunStartRelativeBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>280</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>相对运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunStopBtn">
<property name="geometry">
<rect>
<x>210</x>
<y>230</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>停止运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunKeepBtn">
<property name="geometry">
<rect>
<x>210</x>
<y>280</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>继续运动</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_5">
<property name="geometry">
<rect>
<x>480</x>
<y>480</y>
<width>441</width>
<height>341</height>
</rect>
</property>
<property name="title">
<string>多段运动</string>
</property>
<widget class="QLabel" name="label_13">
<property name="geometry">
<rect>
<x>20</x>
<y>34</y>
<width>60</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>运动模式</string>
</property>
</widget>
<widget class="QComboBox" name="RunMoreModelBox">
<property name="geometry">
<rect>
<x>100</x>
<y>34</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<item>
<property name="text">
<string>相对运动</string>
</property>
</item>
<item>
<property name="text">
<string>绝对运动</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_14">
<property name="geometry">
<rect>
<x>20</x>
<y>100</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>加速时间</string>
</property>
</widget>
<widget class="QLineEdit" name="RunMoreAddSpeedTimeLedit">
<property name="geometry">
<rect>
<x>100</x>
<y>100</y>
<width>111</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_15">
<property name="geometry">
<rect>
<x>220</x>
<y>100</y>
<width>31</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>毫秒</string>
</property>
</widget>
<widget class="QLabel" name="label_16">
<property name="geometry">
<rect>
<x>20</x>
<y>160</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>减速时间</string>
</property>
</widget>
<widget class="QLineEdit" name="RunMoreSubSpeedTimeLedit">
<property name="geometry">
<rect>
<x>100</x>
<y>160</y>
<width>111</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_17">
<property name="geometry">
<rect>
<x>220</x>
<y>160</y>
<width>31</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>毫秒</string>
</property>
</widget>
<widget class="QPushButton" name="RunMoreDataUpdataBtn">
<property name="geometry">
<rect>
<x>290</x>
<y>110</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>更新数据</string>
</property>
</widget>
<widget class="QPushButton" name="RunMoreAddRunBtn">
<property name="geometry">
<rect>
<x>290</x>
<y>34</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>添加运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunMoreStartBtn">
<property name="geometry">
<rect>
<x>20</x>
<y>250</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>启动运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunMoreStopBtn">
<property name="geometry">
<rect>
<x>160</x>
<y>250</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>停止运动</string>
</property>
</widget>
<widget class="QPushButton" name="RunMoreKeepBtn">
<property name="geometry">
<rect>
<x>290</x>
<y>250</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>继续运动</string>
</property>
</widget>
</widget>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

+ 90
- 0
TraimCamp_MotorControl/xnet/include/x_net.h Ver fichero

@@ -0,0 +1,90 @@
#ifndef X_NET_H
#define X_NET_H

//#include "x_net_global.h"
#include <Windows.h>
#include <string>
#include <iostream>
using namespace std;
#include "XNetClient.h"

#define XNet_X 1
#define XNet_Y 2
#define XNet_M 3
#define XNet_S 4
#define XNet_T 5
#define XNet_C 6
#define XNet_ET 7
#define XNet_HM 8
#define XNet_HS 9
#define XNet_HT 10
#define XNet_HC 11
#define XNet_HSC 12
#define XNet_SM 13
#define XNet_SSM 14
#define XNet_TG 15
#define XNet_HTG 16
#define XNet_PF 17
#define XNet_SEM 18
#define XNet_STG 19 //add 2016.4.8
#define XNet_HSTG 20

#define XNet_D 128
#define XNet_TD 129
#define XNet_CD 130
#define XNet_SD 131
#define XNet_ETD 133
#define XNet_ID 134
#define XNet_QD 135
#define XNet_HD 136
#define XNet_HTD 137
#define XNet_HCD 138
#define XNet_HSCD 139
#define XNet_HSD 140
#define XNet_FD 141
#define XNet_SFD 142
#define XNet_SSFD 143
#define XNet_SSD 144
#define XNet_FS 145

#define FLAG 200
#define LW 201
#define LB 202
#define BARCODE "BARCODE"

//为了和将来用到的程序中公用一个头文件,创建dll时用到的是__declspec(dllexport),而使用dll时用到__declspec(dllimport),完全可以各自写一下
#define X_NETSHARED_EXPORT __declspec(dllexport)
#ifdef X_NETSHARED_EXPORT
#else
#define X_NETSHARED_EXPORT __declspec(dllimport)
#endif


//static XINJE::XNetClient device;

extern "C" X_NETSHARED_EXPORT void SetXNetClient(char *);

extern "C" X_NETSHARED_EXPORT void CloseXNetClient();

extern "C" X_NETSHARED_EXPORT void Write_Short(unsigned char regType, int start, int count,short value);

extern "C" X_NETSHARED_EXPORT void Write_Int(unsigned char regType, int start, int count, int value);

extern "C" X_NETSHARED_EXPORT void Write_Float(unsigned char regType, int start, int count, float value);

extern "C" X_NETSHARED_EXPORT void Write_Double(unsigned char regType, int start, int count, double value);

extern "C" X_NETSHARED_EXPORT void Write_Bool(unsigned char regType, int start, int count, bool value);

extern "C" X_NETSHARED_EXPORT void Read_Short(unsigned char regType, int start, int count, short* value);

extern "C" X_NETSHARED_EXPORT void Read_Int(unsigned char regType, int start, int count, int* value);

extern "C" X_NETSHARED_EXPORT void Read_Float(unsigned char regType, int start, int count, float* value);

extern "C" X_NETSHARED_EXPORT void Read_Double(unsigned char regType, int start, int count, double* value);

extern "C" X_NETSHARED_EXPORT void Read_Bool(unsigned char regType, int start, int count,bool* value);


#endif // X_NET_H

+ 132
- 0
TraimCamp_MotorControl/xnet/include/xnetclient.h Ver fichero

@@ -0,0 +1,132 @@
#pragma once

namespace XINJE
{
//类型定义
typedef unsigned char Byte;
typedef unsigned short UInt16;

//XNet服务端口
#define ServicePort 2323
#define ServiceIp "127.0.0.1"

//操作结果(仅告知操作是否成功)
#define XNetCommResult int
#define XNetCommResult_Err -1
#define XNetCommResult_Success 0

//XNet设备类型
typedef enum
{
PLC_XD = 0,
PLC_XE,
TouchWin,
WBox,
_4GBox,
COBox,
ABox
}XNetDevice;

//线圈类型
typedef enum
{
XNet_X = 1,
XNet_Y = 2,
XNet_M = 3,
XNet_S = 4,
XNet_T = 5,
XNet_C = 6,
XNet_ET = 7,
XNet_HM = 8,
XNet_HS = 9,
XNet_HT = 10,
XNet_HC = 11,
XNet_HSC = 12,
XNet_SM = 13,
XNet_SSM = 14,
XNet_TG = 15,
XNet_HTG = 16,
XNet_PF = 17,
XNet_SEM = 18,
XNet_STG = 19,//add 2016.4.8
XNet_HSTG = 20,
}CoilType;

//寄存器类型
typedef enum
{
XNet_D = 128,
XNet_TD = 129,
XNet_CD = 130,
XNet_SD = 131,
XNet_ETD = 133,
XNet_ID = 134,
XNet_QD = 135,
XNet_HD = 136,
XNet_HTD = 137,
XNet_HCD = 138,
XNet_HSCD = 139,
XNet_HSD = 140,
XNet_FD = 141,
XNet_SFD = 142,
XNet_SSFD = 143,
XNet_SSD = 144,
XNet_FS = 145,
}RegType;

//通信对象
//每一个和每一个设备的连接都建议创建一个此对象,以避免不必要的线程同步
class XNetClient
{
private:
int Sock;
unsigned short Net;
unsigned short Station;
unsigned char Com;
Byte Type;
Byte Serial;
Byte Model;
void LibXNetRegsToBuf(short* _regs, unsigned char* _buf, int _num);
void LibXNetBufToRegs(unsigned char* _buf, unsigned short* _regs, int _num);
void LibXNetCoilsToBuf(short* _coils, unsigned char* _buf, int _num);
void LibXNetBufToCoils(char* _buf, short* _coils, Byte _startBit, int _num);
unsigned short Byte2Word(Byte high, Byte low);
public:
//初始化WindowsSocket
// XNetClient(char *ttyNo);
static XNetCommResult WinSockInit();

//启动XNet服务
static XNetCommResult StartXNetWindows();
static XNetCommResult CloseXNetWindows();

//和XNet服务建立连接
XNetCommResult XNetCommunication();

//打开串口(网口也需配置一次,网口_com填129)
XNetCommResult SetComPort(Byte _com);

//关闭串口
XNetCommResult ReleaseComPort(Byte _com);

//直接指定设备地址
void AdderLink(const char* _ipStr);
void AdderLink(UInt16 _net, UInt16 _station);

//对指定端口或网口查找设备,使本对象自动获取到设备地址
XNetCommResult FindDevice(Byte _comPort, Byte _type, Byte _serial, Byte _model);
XNetCommResult FindDevice(Byte _comPort, XNetDevice _dev);
XNetCommResult FindDevice(Byte _comPort, const char* _id);

//读写寄存器(用户提供一个short数组缓存,用于传入或获取XNet16位寄存器的值)
XNetCommResult WriteRegs(Byte _regType, int _offSet, int _num, short* _writeRegs);
XNetCommResult ReadRegs(Byte _regType, int _offSet, int _num, short* _readRegs);

//读写线圈(用户提供一个short数组缓存,用于传入或获取XNet线圈状态,0为off,1为on)
XNetCommResult WriteCoils(Byte _coilType, int _offSet, int _num, short* _writeCoils);
XNetCommResult ReadCoils(Byte _coilType, int _offSet, int _num, short* _readCoil);

// ~XNetClient();
};
}


+ 78
- 0
TraimCamp_MotorControl/xnetconnect.cpp Ver fichero

@@ -0,0 +1,78 @@
/******************************xnetconnect.cpp文件说明**********************************
* Descript :源文件,包含通信配置窗口的函数实现
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/


/***********************************头文件****************************************/
#include "xnetconnect.h"
#include "ui_xnetconnect.h"
#include "Base.h"
#include <QCloseEvent>


/***********************************类的声明和继承****************************************/
XnetConnect::XnetConnect(QWidget *parent) :
QWidget(parent),
ui(new Ui::XnetConnect)
{
ui->setupUi(this);
//禁止修改窗体大小
setFixedSize(this->width(), this->height());
ServiceFlag=false;
//设置窗口标题
setWindowTitle("通信连接");
}


/****************************closeEvent函数*********************************
Function :窗口关闭事件函数
Output :
*********************************************************************/
void XnetConnect::closeEvent(QCloseEvent *event)
{
emit CloseWin();
event->accept();
}


/****************************启动服务槽函数函数*********************************
Function :点击启动服务会触发该槽函数
Output :
*********************************************************************/
void XnetConnect::on_CtrlServiceBtn_clicked()
{
Base TempBase;
if(!ServiceFlag)
{
QString NeetSetIp=ui->NeedIPEdit->text();
SetXNetClient(NeetSetIp.toLatin1().data());
if(TempBase.ConStatus())
{
ServiceFlag=true;
ui->CtrlServiceBtn->setText(QStringLiteral("关闭服务"));
QMessageBox::information(this,QStringLiteral("启动提示"),QStringLiteral("通信成功"));

}else
{
QMessageBox::information(this,QStringLiteral("启动提示"),QStringLiteral("通信失败"));
}

}else
{
CloseXNetClient();
ServiceFlag=false;
ui->CtrlServiceBtn->setText(QStringLiteral("开启服务"));
QMessageBox::information(this,QStringLiteral("关闭提示"),QStringLiteral("关闭成功"));
}
}



/******************************************************析构函数*****************************************************/
XnetConnect::~XnetConnect()
{
delete ui;
}


+ 44
- 0
TraimCamp_MotorControl/xnetconnect.h Ver fichero

@@ -0,0 +1,44 @@
/******************************xnetconnect.h文件说明**********************************
* Descript :头文件,包含通信配置窗口的头文件引用,以及宏定义
* Author :caitiancheng
* Date :2021_12_19
*******************************************************************************/
#ifndef XNETCONNECT_H
#define XNETCONNECT_H



/***********************************头文件****************************************/
#include <QWidget>
#include <QMessageBox>



/***********************************类的声明和继承****************************************/
namespace Ui {
class XnetConnect;
}

class XnetConnect : public QWidget
{
Q_OBJECT

public:
explicit XnetConnect(QWidget *parent = 0);
~XnetConnect();

signals:
void CloseWin();
protected:
void closeEvent(QCloseEvent *event=NULL);
private slots:

void on_CtrlServiceBtn_clicked();


private:
Ui::XnetConnect *ui;
bool ServiceFlag;
};

#endif // XNETCONNECT_H

+ 66
- 0
TraimCamp_MotorControl/xnetconnect.ui Ver fichero

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>XnetConnect</class>
<widget class="QWidget" name="XnetConnect">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>371</width>
<height>81</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="CtrlServiceBtn">
<property name="geometry">
<rect>
<x>260</x>
<y>30</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>启动服务</string>
</property>
</widget>
<widget class="QLineEdit" name="NeedIPEdit">
<property name="geometry">
<rect>
<x>20</x>
<y>30</y>
<width>181</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="inputMask">
<string/>
</property>
<property name="text">
<string>192.168.6.6</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="placeholderText">
<string>请输入PLC的IP!</string>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

Cargando…
Cancelar
Guardar