电机控制项目
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

313 lines
9.7 KiB

  1. /******************************addpar.cpp文件说明**********************************
  2. * Descript :源文件,包含C运动参数配置窗口的函数实现
  3. * Author :caitiancheng
  4. * Date :2021_12_19
  5. *******************************************************************************/
  6. /***********************************头文件****************************************/
  7. #include "addpar.h"
  8. #include "ui_addpar.h"
  9. #include <QCloseEvent>
  10. #include <QMessageBox>
  11. /***********************************类的声明和继承****************************************/
  12. AddPar::AddPar(QWidget *parent) :
  13. QWidget(parent),
  14. ui(new Ui::AddPar)
  15. {
  16. ui->setupUi(this);
  17. //初始化配置
  18. InitTree();
  19. //设置窗口标题
  20. setWindowTitle("C运动参数配置");
  21. }
  22. /****************************closeEvent函数*********************************
  23. Function :窗口关闭事件函数
  24. Output :
  25. *********************************************************************/
  26. void AddPar::closeEvent(QCloseEvent *event)
  27. {
  28. QMessageBox::StandardButton Value=QMessageBox::question(this,QStringLiteral("退出提示"),QStringLiteral("确认数据已经同步到设备?"));
  29. if(Value==QMessageBox::Yes)
  30. {
  31. emit CloseWin();
  32. event->accept();
  33. }else
  34. {
  35. event->ignore();
  36. }
  37. }
  38. /****************************showEvent函数*********************************
  39. Function :如果从站连接上,更新数据
  40. Output :
  41. *********************************************************************/
  42. void AddPar::showEvent(QShowEvent *event)
  43. {
  44. if(ConStatus())
  45. {
  46. event->accept();
  47. Updata();
  48. }
  49. }
  50. /****************************ReadArgRunCrl函数*********************************
  51. Function :读取从站数据
  52. Output :
  53. *********************************************************************/
  54. void AddPar::ReadArgRunCrl(QStandardItem *Item,int Addr,int Row)
  55. {
  56. int Value;
  57. Value=ReadSFDInt(Addr);
  58. Item->child(Row,2)->setText(QString::number(Value));
  59. }
  60. /****************************FreeQList函数*********************************
  61. Function :删除列表参数
  62. Output :
  63. *********************************************************************/
  64. void AddPar::FreeQList(QList<QStandardItem *> *Item)
  65. {
  66. for(int i=0;i<Item->length();i++)
  67. {
  68. delete Item->at(i);
  69. }
  70. }
  71. /****************************InitTree函数*********************************
  72. Function :初始化函数
  73. Output :
  74. *********************************************************************/
  75. void AddPar::InitTree()
  76. {
  77. //定义数据行对象
  78. QStringList QStrListTemp;
  79. //初始化模型
  80. Model=new QStandardItemModel();
  81. //配置分类选择信号
  82. connect(Model,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(TreeItemChanged(QStandardItem*)));
  83. //建立列名
  84. TreeHead.push_back(QStringLiteral("名称"));
  85. TreeHead.push_back(QStringLiteral("离线值"));
  86. TreeHead.push_back(QStringLiteral("在线值"));
  87. TreeHead.push_back(QStringLiteral("单位"));
  88. TreeHead.push_back(QStringLiteral("备注"));
  89. Model->setHorizontalHeaderLabels(TreeHead);
  90. //建立行分类
  91. BaseClass=new QStandardItem(QStringLiteral("基础参数"));
  92. RunCtrlClass=new QStandardItem(QStringLiteral("运动限制"));
  93. //建立分类可选择
  94. BaseClass->setCheckable(true);
  95. BaseClass->setEditable(false);
  96. RunCtrlClass->setCheckable(true);
  97. RunCtrlClass->setEditable(false);
  98. //分类加入模型
  99. Model->appendRow(BaseClass);
  100. Model->appendRow(RunCtrlClass);
  101. //建立数据行
  102. //编码器的旋转计数
  103. QStrListTemp.clear();
  104. QStrListTemp.push_back(QStringLiteral("单圈脉冲"));
  105. QStrListTemp.push_back("0");
  106. QStrListTemp.push_back("0");
  107. QStrListTemp.push_back("");
  108. QStrListTemp.push_back("编码器旋转一圈的计数值,根据电机编码器设定,如果17位,设置成131072");
  109. NewChildLine(BaseClass,&BaseOtp,QStrListTemp);
  110. //每圈移动量
  111. QStrListTemp.clear();
  112. QStrListTemp.push_back(QStringLiteral("移动量"));
  113. QStrListTemp.push_back("0");
  114. QStrListTemp.push_back("0");
  115. QStrListTemp.push_back("脉冲");
  116. QStrListTemp.push_back("每圈移动需要的脉冲");
  117. NewChildLine(BaseClass,&BaseMnum,QStrListTemp);
  118. //最高速度
  119. QStrListTemp.clear();
  120. QStrListTemp.push_back(QStringLiteral("最大速度"));
  121. QStrListTemp.push_back("0");
  122. QStrListTemp.push_back("0");
  123. QStrListTemp.push_back("脉冲/秒");
  124. QStrListTemp.push_back("电机可以运行的最大速度");
  125. NewChildLine(RunCtrlClass,&RunSpeed,QStrListTemp);
  126. //最快加速度
  127. QStrListTemp.clear();
  128. QStrListTemp.push_back(QStringLiteral("最快加速度时间"));
  129. QStrListTemp.push_back("0");
  130. QStrListTemp.push_back("0");
  131. QStrListTemp.push_back("毫秒");
  132. QStrListTemp.push_back("最快加速时间,根据该时间,系统自动计算对应加速相关参数");
  133. NewChildLine(RunCtrlClass,&RunAddSpeed,QStrListTemp);
  134. //最快减速度
  135. QStrListTemp.clear();
  136. QStrListTemp.push_back(QStringLiteral("最快减速度时间"));
  137. QStrListTemp.push_back("0");
  138. QStrListTemp.push_back("0");
  139. QStrListTemp.push_back("毫秒");
  140. QStrListTemp.push_back("最快减速时间,根据该时间,系统自动计算对应减速相关参数");
  141. NewChildLine(RunCtrlClass,&RunSubSpeed,QStrListTemp);
  142. //加载模型到树
  143. ui->ArgDataTreeView->setModel(Model);
  144. ui->ArgDataTreeView->expandAll();
  145. }
  146. /****************************TreeItemChanged函数*********************************
  147. Function :模型数参数改变
  148. Output :
  149. *********************************************************************/
  150. void AddPar::TreeItemChanged(QStandardItem *Item)
  151. {
  152. if (Item->isCheckable()&&Item->hasChildren())
  153. {
  154. Qt::CheckState status = Item->checkState ();
  155. for(int i = 0;i<Item->rowCount();++i)
  156. {
  157. QStandardItem* ItemChild = Item->child(i);
  158. ItemChild->setCheckState(status);
  159. }
  160. }
  161. }
  162. /****************************NewChildLine函数*********************************
  163. Function :新子行建立
  164. Output :
  165. *********************************************************************/
  166. void AddPar::NewChildLine(QStandardItem *Item,QList<QStandardItem *> *ItemList,QStringList Data)
  167. {
  168. int RowCount;
  169. ItemList->clear();
  170. for(int i=0;i<Data.length();i++)
  171. {
  172. ItemList->push_back(new QStandardItem(Data.at(i)));
  173. if(i!=1)
  174. {
  175. ItemList->at(i)->setEditable(false);
  176. }
  177. }
  178. RowCount=Item->rowCount();
  179. ItemList->at(0)->setCheckable(true);
  180. Item->appendRow(ItemList->at(0));
  181. for(int i=1;i<Data.length();i++)
  182. {
  183. Item->setChild(RowCount,i,ItemList->at(i));
  184. }
  185. }
  186. /****************************DownLoadData函数*********************************
  187. Function :下载从站数据
  188. Output :
  189. *********************************************************************/
  190. int AddPar::DownLoadData(QStandardItem *Item,QString Name,int Addr,int Row)
  191. {
  192. bool ok=true;
  193. int Value=0;
  194. if(Item->child(Row)->checkState()==Qt::Checked)
  195. {
  196. Value=Item->child(Row,1)->text().toInt(&ok);
  197. if(!ok)
  198. {
  199. QMessageBox::information(this,Name,QStringLiteral("写入失败"));
  200. return ReFild;
  201. }
  202. WriteSFDInt(Addr,Value);
  203. return ReSuess;
  204. }
  205. return ReUncheck;
  206. }
  207. /****************************下载按钮槽函数*********************************
  208. Function :点击下载按钮,会触发该槽函数
  209. Output :
  210. *********************************************************************/
  211. void AddPar::on_DownloadBtn_clicked()
  212. {
  213. int count=0;
  214. int value=0;
  215. if(!ConStatus())
  216. {
  217. QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
  218. }
  219. else
  220. {
  221. value=DownLoadData(BaseClass,"单圈脉冲",3002,0);
  222. count+=value==1?1:0;
  223. value=DownLoadData(BaseClass,"移动量",3004,1);
  224. count+=value==1?1:0;
  225. value=DownLoadData(RunCtrlClass,"最大速度",3018,0);
  226. count+=value==1?1:0;
  227. value=DownLoadData(RunCtrlClass,"最快加速度时间",3020,1);
  228. count+=value==1?1:0;
  229. value=DownLoadData(RunCtrlClass,"最快减速度时间",3022,2);
  230. count+=value==1?1:0;
  231. QMessageBox::information(this,QStringLiteral("下载提示"),QStringLiteral("写入成功:")+QString::number(count));
  232. }
  233. }
  234. /****************************Updata函数*********************************
  235. Function :更新数据的函数
  236. Output :
  237. *********************************************************************/
  238. void AddPar::Updata()
  239. {
  240. ReadArgRunCrl(BaseClass,3002,0);
  241. ReadArgRunCrl(BaseClass,3004,1);
  242. ReadArgRunCrl(RunCtrlClass,3018,0);
  243. ReadArgRunCrl(RunCtrlClass,3020,1);
  244. ReadArgRunCrl(RunCtrlClass,3022,2);
  245. }
  246. /****************************上载参数按钮槽函数*********************************
  247. Function :点击上载参数按钮,会触发该槽函数
  248. Output :
  249. *********************************************************************/
  250. void AddPar::on_UploadBtn_clicked()
  251. {
  252. if(!ConStatus())
  253. {
  254. QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
  255. }
  256. else
  257. {
  258. Updata();
  259. }
  260. }
  261. /******************************************************析构函数*****************************************************/
  262. AddPar::~AddPar()
  263. {
  264. delete Model;
  265. delete BaseClass;
  266. FreeQList(&BaseOtp);
  267. FreeQList(&BaseMnum);
  268. delete RunCtrlClass;
  269. FreeQList(&RunSpeed);
  270. FreeQList(&RunAddSpeed);
  271. FreeQList(&RunSubSpeed);
  272. delete ui;
  273. }