先来张图:

#include "mainwindow.h"
#include "ui_mainwindow.h"QMap<QString,QString>mymap;
QMap<QString,QString>programMap;static QString  sig_on="background-color: rgb(255, 255, 0);border-radius:12px";
static QString  sig_off="background-color: rgb(170, 170, 255);border-radius:12px";QString path_cwProgramList="./cwProgramList.ini";
QString path_toolDirs="./toolDirs.ini";
QString path_signalInfo="./signalInfo.ini";
char* path_config="./config.ini";static long sts;
QString myId;
QString myName;
QString myType;
QString myNum;
QString myAxisX;
QString myAxisY;
QString myAxisZ;
QString myAxisU;short axi_x,axi_y,axi_z,axi_u;double nowPos_x,nowPos_y,nowPos_z,nowPos_u;QString *arrystr[]={&myId,&myName,&myType,&myNum,&myAxisX,&myAxisY,&myAxisZ,&myAxisU};//判断是否取反,1:正常  0:取反
char bg_sigin[17];
char bg_sigout[17];
char bg_sigzheng[9];
char bg_sigfu[9];
char bg_sigyuan[9];
char bg_sigdalarm[9];
char bg_sigtomcan[9];
char bg_sigalclear[9];QStringList mylist;int speedGrade[]={2,4,8,12};static bool initReult=false;  //复位标识void myStop(int flag)       // 1.系统急停 2.轴暂停运动
{GT_Stop(1<<(axi_x-1),1<<(axi_x-1));if(axi_y!=0) GT_Stop(1<<(axi_y-1),1<<(axi_y-1));if(axi_z!=0) GT_Stop(1<<(axi_z-1),1<<(axi_z-1));if(axi_u!=0) GT_Stop(1<<(axi_u-1),1<<(axi_u-1));if(flag==1){GT_AxisOff(axi_x);if(axi_y!=0) GT_AxisOff(axi_y);if(axi_z!=0) GT_AxisOff(axi_z);if(axi_u!=0) GT_AxisOff(axi_u);GT_Close();initReult=FALSE;}
}//写配置信息到文件
bool write_tofile( char* filename)
{FILE *fp=fopen(filename,"w+");if (fp==NULL){QMessageBox::warning(NULL,"error","写配置信息失败!");return false;}char buf[100]={0};QString str;str=QString("ID=")+myId+QString(";\n")+\QString("名称=")+myName+QString(";\n")+\QString("类型=")+myType+QString(";\n")+\QString("轴数量=")+myNum+QString(";\n")+\QString("X轴ID=")+myAxisX+QString(";\n")+\QString("Y轴ID=")+myAxisY+QString(";\n")+\QString("Z轴ID=")+myAxisZ+QString(";\n")+\QString("U轴ID=")+myAxisU+QString(";\n");mymap.insert(myId,str);for(auto it=mymap.begin();it!=mymap.end();it++){strcpy(buf,it.value().toStdString().c_str());int ret=fwrite(buf,strlen(buf),1,fp);if(ret<=0) qDebug()<<"写出数据失败!";}fclose(fp);return true;
}//从配置文件读取信息
bool read_fromfile(char*filename,char*curSelect)
{FILE*fp=fopen(filename,"r");if(fp==NULL){QMessageBox::warning(NULL,"error","读取配置信息失败!");return false;}char buf[100]={0};char tmp1[50],tmp2[50];int i=0;while(fgets(buf,sizeof(buf),fp)){memset(tmp2,0,sizeof(tmp2));sscanf(buf,"%[^=]=%[^;]",tmp1,tmp2);if(strcmp(tmp2, curSelect) == 0 &&strcmp(tmp1,"ID")==0) break;*arrystr[i] = QString(tmp2);i++;if(myId.isEmpty()) myId="0";if (i == 8){QString str= QString("ID=") + myId + QString(";\n") + \QString("名称=") + myName + QString(";\n") + \QString("类型=") + myType + QString(";\n") + \QString("轴数量=") + myNum + QString(";\n") + \QString("X轴ID=") + myAxisX + QString(";\n") + \QString("Y轴ID=") + myAxisY + QString(";\n") + \QString("Z轴ID=") + myAxisZ + QString(";\n")+ \QString("U轴ID=") + myAxisU + QString(";\n");mymap.insert(myId, str);i = 0;}}fclose(fp);return true;
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("策维项目");// resize(1033,633);  // 设置窗口大小setFixedSize(1025,633);//输入信号createSignalArea(ui->frame_5,btngroup_sigin,"输入信号",16);//输出信号createSignalArea(ui->frame_12,btngroup_sigout,"输出信号",16);//正极限位createSignalArea(ui->frame_4,btngroup_sigzheng,"正极限位",8);//负极限位createSignalArea(ui->frame_7,btngroup_sigfu,"负极限位",8);//原点信号createSignalArea(ui->frame_8,btngroup_sigyuan,"原点信号",8);//驱动报警createSignalArea(ui->frame_9,btngroup_dalarm,"驱动报警",8);//伺服使能createSignalArea(ui->frame_10,btngroup_tomcan,"伺服使能",8);//报警清除createSignalArea(ui->frame_11,btngroup_alclear,"报警清除",8);memset(bg_sigin,'1',16);memset(bg_sigout,'1',16);memset(bg_sigzheng,'1',8);memset(bg_sigfu,'1',8);memset(bg_sigyuan,'1',8);memset(bg_sigdalarm,'1',8);memset(bg_sigtomcan,'1',8);memset(bg_sigalclear,'1',8);//读取信号状态signalFlag();rightMenu=new QMenu();isNormal= rightMenu->addAction(QIcon(":/new/prefix1/select.bmp"),"正常");isOpposite= rightMenu->addAction(QIcon(":/new/prefix1/blank.bmp"),"取反");rightMenu->addSeparator();QAction *saveTofile= rightMenu->addAction(QIcon(":/new/prefix1/add.bmp"),"保存");//设置底部状态栏QStatusBar *statusbar=statusBar();label=new QLabel(statusbar);statusbar->setStyleSheet(QString("QStatusBar::item{border: 0px}"));statusbar->addPermanentWidget(label);statusbar->addWidget(new QLabel("你好,欢迎使用策维系统!!!"));timer=new QTimer();timer->setInterval(200);timer->start();mylist<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8";//获取项目列表intiProgramList();//卡号列表初始化ui->comboBox_exchangeCardid->addItems(mylist);QStringList speedList;speedList<<"1-低速"<<"2-中速"<<"3-高速"<<"4-极速";ui->comboBox_speed->addItems(speedList);//读配置文件on_pushButton_readConfig_clicked();//工站详情workDetail(1);//设置初始速度nowSpeed=speedGrade[0];axi_x=myAxisX.toInt()+1;axi_y=myAxisY.toInt()+1;axi_z=myAxisZ.toInt()+1;axi_u=myAxisU.toInt()+1;//初始化点位运动的点ui->lineEdit_nextPosX->setText("0");ui->lineEdit_nextPosY->setText("0");ui->lineEdit_nextPosZ->setText("0");ui->lineEdit_nextPosU->setText("0");//底部状态栏与信号检测200sec/次connect(timer, SIGNAL(timeout()), this,SLOT(myTimeout()));//保存监测connect(saveTofile,&QAction::triggered,[](){QFile file(path_signalInfo);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QMessageBox::warning(NULL,"error","保存失败!");return;}QTextStream txtOutput(&file);txtOutput <<bg_sigin<<endl<<bg_sigout<<endl<<bg_sigzheng<<endl<<bg_sigfu<<endl<<bg_sigyuan<<endl<<bg_sigdalarm<<endl<<bg_sigtomcan<<endl<<bg_sigalclear;file.close();});//是否正常监测connect(isNormal,&QAction::triggered,[=](){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));for(int i=0;i<16;i++){if(isContain(btngroup_sigin.button(i),ui->frame_5,this->globalPos,0)){bg_sigin[i]='1';}else if(isContain(btngroup_sigout.button(i),ui->frame_12,this->globalPos,0)){bg_sigout[i]='1';}else if((i<8)&& isContain(btngroup_sigzheng.button(i),ui->frame_4,this->globalPos,0)){bg_sigzheng[i]='1';}else if((i<8) && isContain(btngroup_sigfu.button(i),ui->frame_7,this->globalPos,0)){bg_sigfu[i]='1';}else if((i<8) && isContain(btngroup_sigyuan.button(i),ui->frame_8,this->globalPos,0)){bg_sigyuan[i]='1';}else if((i<8) && isContain(btngroup_dalarm.button(i),ui->frame_9,this->globalPos,0)){bg_sigdalarm[i]='1';}else if((i<8) && isContain(btngroup_tomcan.button(i),ui->frame_10,this->globalPos,0)){bg_sigtomcan[i]='1';}else if((i<8) && isContain(btngroup_alclear.button(i),ui->frame_11,this->globalPos,0)){bg_sigalclear[i]='1';}}});//是否取反监测connect(isOpposite,&QAction::triggered,[=](){isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));for(int i=0;i<16;i++){if(isContain(btngroup_sigin.button(i),ui->frame_5,this->globalPos,0)){bg_sigin[i]='0';}else if(isContain(btngroup_sigout.button(i),ui->frame_12,this->globalPos,0)){bg_sigout[i]='0';}else if((i<8)&& isContain(btngroup_sigzheng.button(i),ui->frame_4,this->globalPos,0)){bg_sigzheng[i]='0';}else if((i<8) && isContain(btngroup_sigfu.button(i),ui->frame_7,this->globalPos,0)){bg_sigfu[i]='0';}else if((i<8) && isContain(btngroup_sigyuan.button(i),ui->frame_8,this->globalPos,0)){bg_sigyuan[i]='0';}else if((i<8) && isContain(btngroup_dalarm.button(i),ui->frame_9,this->globalPos,0)){bg_sigdalarm[i]='0';}else if((i<8) && isContain(btngroup_tomcan.button(i),ui->frame_10,this->globalPos,0)){bg_sigtomcan[i]='0';}else if((i<8) && isContain(btngroup_alclear.button(i),ui->frame_11,this->globalPos,0)){bg_sigalclear[i]='0';}}});//对输出信号的按钮监测connect(&btngroup_sigout,static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),[=](int index){GT_SetDo(MC_GPO,1<<index);});//对报警清除的按钮监测connect(&btngroup_alclear,static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),[=](int index){GT_SetDo(MC_CLEAR,1<<index);});//对使能的按钮监测connect(&btngroup_tomcan,static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),[=](int index){GT_SetDo(MC_ENABLE,1<<index);});
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::workDetail(int flag)
{//设置工站IDui->lineEdit_Id->setText(myId);//工站名称ui->lineEdit_Name->setText(myName);//电机类型if(flag==1) ui->comboBox_Type->addItem("电机工站");ui->comboBox_Type->setCurrentIndex(myType.toInt());//轴数量设置if (flag == 1){QStringList tmp;tmp<<"1"<<"2"<<"3"<<"4";ui->comboBox_Num->addItems(tmp);}ui->comboBox_Num->setCurrentIndex(myNum.toInt());//轴ID设置if (flag == 1){ui->comboBox_Axi_idx->addItems(mylist);ui->comboBox_Axi_idy->addItems(mylist);ui->comboBox_Axi_idz->addItems(mylist);ui->comboBox_Axi_idu->addItems(mylist);}ui->comboBox_Axi_idx->setCurrentIndex(myAxisX.toInt());ui->comboBox_Axi_idy->setCurrentIndex(myAxisY.toInt());ui->comboBox_Axi_idz->setCurrentIndex(myAxisZ.toInt());ui->comboBox_Axi_idu->setCurrentIndex(myAxisU.toInt());QString arg;on_comboBox_Num_currentIndexChanged(arg);return true;
}bool MainWindow::initWorkspace()
{for(auto it=mymap.begin();it!=mymap.end();it++){QString  str1;QString str, str2,str3;str1 = it.key();str2 = it.value();str3=str2.replace(";","");int slen=str3.indexOf("类型")-(str3.indexOf("名称=")+3);str = str3.mid(8,slen-1); //减1为去掉最后的换行符str1=str1+"-"+str;if(ui->comboBox_workSpace->findText(str1)>=0) continue;ui->comboBox_workSpace->addItem(str1);}ui->comboBox_workSpace->setCurrentIndex(mymap.size()-1);return true;
}bool MainWindow::jogAction(int axId, int flag)
{if(!initReult) return false;TThreadSts thread;short rtn;short funId;TVarInfo speed,axi,count,pclock,flag1,flag2;rtn = GT_Download("myJogaction.bin");// 获取函数IDrtn = GT_GetFunId("jogAction",&funId);// 获取局部变量的IDrtn = GT_GetVarId("jogAction","axi",&axi);rtn = GT_GetVarId("jogAction","speed",&speed);rtn = GT_GetVarId("jogAction","pclock",&pclock);rtn = GT_GetVarId("jogAction","count",&count);rtn = GT_GetVarId("jogAction","flag1",&flag1);rtn = GT_GetVarId("jogAction","flag2",&flag2);// 绑定线程,函数,数据页rtn = GT_Bind(0,funId,0);double value=axId;// 初始化运动程序的全局变量axirtn = GT_SetVarValue(0,&axi,&value);// 初始化运动程序的全局变量speedvalue=flag;rtn = GT_SetVarValue(0,&speed,&value);// 初始化运动程序的全局变量pclockvalue=NULL;rtn = GT_SetVarValue(0,&pclock,&value);// 初始化运动程序的全局变量countvalue=1;rtn = GT_SetVarValue(0,&count,&value);double sts=0;// 启动线程rtn = GT_RunThread(0);do{// 查询线程状态rtn = GT_GetThreadSts(0,&thread);rtn = GT_GetVarValue(0,&flag1,&sts);if(sts){qDebug()<<"运动到负限位!";}rtn = GT_GetVarValue(0,&flag2,&sts);if(sts){qDebug()<<"运动到负限位!";}}while( 1== thread.run );    // 等待线程运行结束return true;
}bool MainWindow::trapAction(int axId, int flag, long aimpos)
{if(!initReult) return false;TThreadSts thread;short rtn;short funId;TVarInfo speed,axi,count,pclock,flag1,flag2,pos;rtn = GT_Download("myTrapaction.bin");// 获取函数IDrtn = GT_GetFunId("myTrapaction",&funId);// 获取局部变量的IDrtn = GT_GetVarId("trapAction","axi",&axi);rtn = GT_GetVarId("trapAction","speed",&speed);rtn = GT_GetVarId("trapAction","pclock",&pclock);rtn = GT_GetVarId("trapAction","count",&count);rtn = GT_GetVarId("trapAction","flag1",&flag1);rtn = GT_GetVarId("trapAction","flag2",&flag2);rtn = GT_GetVarId("trapAction","pos",&pos);// 绑定线程,函数,数据页rtn = GT_Bind(axId,funId,axId);double value=axId;// 初始化运动程序的全局变量axirtn = GT_SetVarValue(axId,&axi,&value);// 初始化运动程序的全局变量speedvalue=flag;rtn = GT_SetVarValue(axId,&speed,&value);// 初始化运动程序的全局变量pclockvalue=NULL;rtn = GT_SetVarValue(axId,&pclock,&value);// 初始化运动程序的全局变量countvalue=1;rtn = GT_SetVarValue(axId,&count,&value);// 初始化运动程序的全局变量posvalue=aimpos;rtn = GT_SetVarValue(axId,&pos,&value);double sts=0;// 启动线程rtn = GT_RunThread(axId);do{// 查询线程状态rtn = GT_GetThreadSts(axId,&thread);rtn = GT_GetVarValue(axId,&flag1,&sts);if(sts){qDebug()<<"运动到负限位!";}rtn = GT_GetVarValue(axId,&flag2,&sts);if(sts){qDebug()<<"运动到正限位!";}}while( 1== thread.run );    // 等待线程运行结束return true;
}//初始化已经添加过的项目列表
bool MainWindow::intiProgramList()
{QFile file(path_cwProgramList);QByteArray readStr;if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(NULL, "error", "项目列表读取失败!!!");}while(1){readStr=file.readLine();if(readStr.length()<10) break;char kn[50]={0};char ktmp[50]={0};sscanf(readStr.data(),"%[^|]|",kn);strcpy(ktmp,kn);strcat(ktmp,"|");readStr.replace(ktmp,"").replace("\n","");programMap.insert(QString(kn),QString(readStr));ui->comboBox_selProgram->addItem(QString(kn));}
}//信号模块初始化
void MainWindow::createSignalArea(QFrame*frame,QButtonGroup&btngroup,QString signame, int count)
{QHBoxLayout *siginLayout=new QHBoxLayout;frame->setLayout(siginLayout);QLabel *lab_sigin=new QLabel(signame);lab_sigin->setFixedWidth(53);siginLayout->addWidget(lab_sigin);QGridLayout *sigRight=new QGridLayout;for(int i=0;i<count;i++){QToolButton *btn=new QToolButton;btn->setStyleSheet(sig_off); //无信号样式btn->setFixedSize(25,25);if(i<8){sigRight->addWidget(btn,0,i);}else{sigRight->addWidget(btn,1,i-8);}btngroup.addButton(btn,i);}siginLayout->addLayout(sigRight);static int flag_i=1;connect(&btngroup,static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),[&](int index){if(flag_i){btngroup.button(index)->setStyleSheet(sig_on);//有信号样式flag_i=0;}else{btngroup.button(index)->setStyleSheet(sig_off);//无信号样式flag_i=1;}});
}//状态栏时间显示部分
void MainWindow::myTimeout()
{//底部状态栏QDateTime time=QDateTime::currentDateTime();label->setText(time.toString("yyyy-MM-dd  hh:mm:ss  ddd"));label->update();//信号检测long lGpiValue_fu=0;long lGpiValue_yuan=0;long lGpiValue_zhen=0;long lGpiValue_dalarm=0;long lGpiValue_sigin=0;long lGpiValue_motcan=0;long lGpiValue_alclear=0;long lGpiValue_sigout=0;//读取IO输入状态GT_GetDi(MC_LIMIT_POSITIVE, &lGpiValue_zhen);GT_GetDi(MC_HOME, &lGpiValue_yuan);GT_GetDi(MC_LIMIT_NEGATIVE, &lGpiValue_fu);GT_GetDi(MC_ALARM, &lGpiValue_dalarm);GT_GetDi(MC_GPI, &lGpiValue_sigin);//读取IO输出状态GT_GetDo(MC_ENABLE, &lGpiValue_motcan);GT_GetDo(MC_CLEAR, &lGpiValue_alclear);GT_GetDo(MC_GPO, &lGpiValue_sigout);for(int i=0,j=0;i<8,j<16;i++,j+=2){//检测正限位if(bg_sigzheng[i]=='1'){if(lGpiValue_zhen&1<<i){btngroup_sigzheng.button(i)->setStyleSheet(sig_on);GT_Stop(1<<i,1<<i);}else btngroup_sigzheng.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_zhen&1<<i){btngroup_sigzheng.button(i)->setStyleSheet(sig_off);GT_Stop(1<<i,1<<i);}else btngroup_sigzheng.button(i)->setStyleSheet(sig_on);}//检测原点if(bg_sigyuan[i]=='1'){if(lGpiValue_yuan&1<<i) btngroup_sigyuan.button(i)->setStyleSheet(sig_on);else btngroup_sigyuan.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_yuan&1<<i) btngroup_sigyuan.button(i)->setStyleSheet(sig_off);else btngroup_sigyuan.button(i)->setStyleSheet(sig_on);}//检测负限位if(bg_sigfu[i]=='1'){if(lGpiValue_fu&1<<i){btngroup_sigfu.button(i)->setStyleSheet(sig_on);GT_Stop(1<<i,1<<i);}else btngroup_sigfu.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_fu&1<<i){btngroup_sigfu.button(i)->setStyleSheet(sig_off);GT_Stop(1<<i,1<<i);}else btngroup_sigfu.button(i)->setStyleSheet(sig_on);}//检测驱动报警if(bg_sigdalarm[i]=='1'){if(lGpiValue_dalarm&1<<i) btngroup_dalarm.button(i)->setStyleSheet(sig_on);else btngroup_dalarm.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_dalarm&1<<i) btngroup_dalarm.button(i)->setStyleSheet(sig_off);else btngroup_dalarm.button(i)->setStyleSheet(sig_on);}//检测输入信号if(bg_sigin[i]=='1'){if(lGpiValue_sigin&1<<j){btngroup_sigin.button(j)->setStyleSheet(sig_off);btngroup_sigin.button(j+1)->setStyleSheet(sig_on);}else{btngroup_sigin.button(j)->setStyleSheet(sig_on);btngroup_sigin.button(j+1)->setStyleSheet(sig_off);}}else{if(lGpiValue_sigin&1<<j){btngroup_sigin.button(j)->setStyleSheet(sig_on);btngroup_sigin.button(j+1)->setStyleSheet(sig_off);}else{btngroup_sigin.button(j)->setStyleSheet(sig_off);btngroup_sigin.button(j+1)->setStyleSheet(sig_on);}}//检测伺服使能if(bg_sigtomcan[i]=='1'){if(lGpiValue_motcan&1<<i) btngroup_tomcan.button(i)->setStyleSheet(sig_on);else btngroup_tomcan.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_motcan&1<<i) btngroup_tomcan.button(i)->setStyleSheet(sig_off);else btngroup_tomcan.button(i)->setStyleSheet(sig_on);}//检测报警清除if(bg_sigalclear[i]=='1'){if(lGpiValue_alclear&1<<i) btngroup_alclear.button(i)->setStyleSheet(sig_on);else btngroup_alclear.button(i)->setStyleSheet(sig_off);}else{if(lGpiValue_alclear&1<<i) btngroup_alclear.button(i)->setStyleSheet(sig_off);else btngroup_alclear.button(i)->setStyleSheet(sig_on);}//检测输出信号if(bg_sigout[i]=='1'){if(lGpiValue_sigout&1<<j){btngroup_sigout.button(j)->setStyleSheet(sig_off);btngroup_sigout.button(j+1)->setStyleSheet(sig_on);}else{btngroup_sigout.button(j)->setStyleSheet(sig_on);btngroup_sigout.button(j+1)->setStyleSheet(sig_off);}}else{if(lGpiValue_sigout&1<<j){btngroup_sigout.button(j)->setStyleSheet(sig_on);btngroup_sigout.button(j+1)->setStyleSheet(sig_off);}else{btngroup_sigout.button(j)->setStyleSheet(sig_off);btngroup_sigout.button(j+1)->setStyleSheet(sig_on);}}}//获取当前位置double enc[4]={0};GT_GetEncPos(axi_x,&enc[0],myNum.toShort()+1);nowPos_x=enc[0]/1000;nowPos_y=enc[1]/1000;nowPos_z=enc[2]/1000;nowPos_u=enc[3]/1000;ui->lineEdit_curPosX->setText(QString("%1").arg(nowPos_x));ui->lineEdit_curPosY->setText(QString("%1").arg(nowPos_y));ui->lineEdit_curPosZ->setText(QString("%1").arg(nowPos_z));ui->lineEdit_curPosU->setText(QString("%1").arg(nowPos_u));
}//外部工具
void MainWindow::on_pushButton_commTools_clicked()
{QDialog *toolwidget =new QDialog;toolwidget->setWindowTitle("常用工具");toolwidget->setFixedSize(400,300);QVBoxLayout *mainLayout=new QVBoxLayout;toolwidget->setLayout(mainLayout);mainLayout->setMargin(50);QHBoxLayout *topLayout=new QHBoxLayout;QLabel *lab1=new QLabel("添加工具");topLayout->addWidget(lab1);QLineEdit *toolName=new QLineEdit;topLayout->addWidget(toolName);QPushButton *addTool=new QPushButton;addTool->setIcon(QIcon(":/new/prefix1/add.bmp"));addTool->setMinimumWidth(60);topLayout->addWidget(addTool);QMap<QString,QString>myMap;QFile file(path_toolDirs);QByteArray readStr;if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(toolwidget, "error", "工具读取失败!!!");}while(1){readStr=file.readLine();if(readStr.length()<10) break;char kn[50]={0};char ktmp[50]={0};sscanf(readStr.data(),"%[^|]|",kn);strcpy(ktmp,kn);strcat(ktmp,"|");readStr.replace(ktmp,"").replace("\n","");myMap.insert(QString(kn),QString(readStr));// qDebug()<<kn<<":"<<readStr;}file.close();connect(addTool, &QPushButton::clicked, [=](){QString filename =QFileDialog::getOpenFileName(NULL, "选择程序","../", "可执行程序 (*.exe);;其它 (*.*)");toolName->setText(filename);QFileInfo fileinfo(filename);QFile file(path_toolDirs);if(!file.open(QIODevice::WriteOnly | QIODevice::Append)){QMessageBox::warning(toolwidget, "error", "添加失败!!!");return;}QTextStream txtOutput(&file);txtOutput << fileinfo.fileName()<<"|"<<fileinfo.filePath()<<endl;file.close();});QGridLayout *bottomLayout=new QGridLayout;int i=0;for( auto it=myMap.begin();it!=myMap.end();it++){QPushButton *btn=new QPushButton(toolwidget);btn->setFixedSize(60,30);if(i<3) bottomLayout->addWidget(btn,0,i,Qt::AlignCenter);else if(i<6) bottomLayout->addWidget(btn,1,i-3,Qt::AlignCenter);else if(i<9) bottomLayout->addWidget(btn,2,i-6,Qt::AlignCenter);QString disText=it.key();btn->setText(disText.replace(".exe",""));btn->setToolTip(it.key());i++;connect(btn,&QPushButton::clicked,[=](){QProcess myprocess;QString program=it.value();if(disText.indexOf("exe")){myprocess.startDetached(program.replace("/","//"),QStringList(program.replace("/","//")));}else{myprocess.startDetached("cmd.exe",QStringList(program.replace("/","//")));};});}mainLayout->addLayout(topLayout);mainLayout->addSpacing(20);mainLayout->addLayout(bottomLayout);toolwidget->exec();//模态显示}//写配置信息到文件
void MainWindow::on_pushButton_writeConfig_clicked()
{if(ui->lineEdit_Name->text().isEmpty()){QMessageBox::warning(this,"error","名称为空,请\n重新输入!");return;}myName=ui->lineEdit_Name->text();myType=QString("%1").arg(ui->comboBox_Type->currentIndex());myNum=QString("%1").arg(ui->comboBox_Num->currentIndex());myAxisX=QString("%1").arg(ui->comboBox_Axi_idx->currentIndex());myAxisY=QString("%1").arg(ui->comboBox_Axi_idy->currentIndex());myAxisZ=QString("%1").arg(ui->comboBox_Axi_idz->currentIndex());myAxisU=QString("%1").arg(ui->comboBox_Axi_idu->currentIndex());if (write_tofile(path_config)){int maplen = mymap.size();myId =QString("%1").arg(maplen);ui->lineEdit_Id->setText(myId);ui->lineEdit_Name->clear();ui->comboBox_Num->setCurrentIndex(0);}
}//从配置信息读取文件
void MainWindow::on_pushButton_readConfig_clicked()
{FILE*fp = fopen(path_config, "r");if (fp == NULL){QMessageBox::warning(NULL,"error","读取配置信息失败!");myId=QString("0");return;}char buf[100] = { 0 };int count = 0;while (fgets(buf, sizeof(buf), fp)){count++;}fclose(fp);count /= 8;memset(buf, 0, sizeof(buf));char* ch = itoa(count, buf, 10);mymap.clear();read_fromfile(path_config, ch);initWorkspace();
}//工站切换
void MainWindow::on_comboBox_workSpace_currentIndexChanged(const QString &arg1)
{int i = ui->comboBox_workSpace->currentIndex();QString val=mymap[QString("%1").arg(i)];char buf[100] = { 0 };strcpy(buf,val.toStdString().c_str());char *p=strtok(buf,";");for(int i=0;i<sizeof(arrystr)/sizeof(arrystr[0]);i++){char kn[50], kv[50];sscanf(p, "%[^=]=%[^;]", kn, kv);*arrystr[i]=QString(kv);p = strtok(NULL, ";");}axi_x=myAxisX.toInt()+1;axi_y=myAxisY.toInt()+1;axi_z=myAxisZ.toInt()+1;axi_u=myAxisU.toInt()+1;workDetail(2);
}//轴数量切换
void MainWindow::on_comboBox_Num_currentIndexChanged(const QString &arg1)
{int j=ui->comboBox_Num->currentIndex();switch(j){case 0:ui->label_idy->hide();ui->label_idz->hide();ui->label_idu->hide();ui->comboBox_Axi_idy->hide();ui->comboBox_Axi_idz->hide();ui->comboBox_Axi_idu->hide();break;case 1:ui->label_idy->show();ui->label_idz->hide();ui->label_idu->hide();ui->comboBox_Axi_idy->show();ui->comboBox_Axi_idz->hide();ui->comboBox_Axi_idu->hide();break;case 2:ui->label_idy->show();ui->label_idz->show();ui->label_idu->hide();ui->comboBox_Axi_idy->show();ui->comboBox_Axi_idz->show();ui->comboBox_Axi_idu->hide();break;case 3:ui->label_idy->show();ui->label_idz->show();ui->label_idu->show();ui->comboBox_Axi_idy->show();ui->comboBox_Axi_idz->show();ui->comboBox_Axi_idu->show();break;default:break;}
}//打开工站配置文件
void MainWindow::on_pushButton_openConfig_clicked()
{QProcess noteProcess;noteProcess.startDetached("notepad.exe",QStringList(path_config));
}//速度切换
void MainWindow::on_comboBox_speed_currentIndexChanged(const QString &arg1)
{int i=ui->comboBox_speed->currentIndex();switch(i){case 0:nowSpeed=speedGrade[0];break;case 1:nowSpeed=speedGrade[1];break;case 2:nowSpeed=speedGrade[2];break;case 4:nowSpeed=speedGrade[3];break;
deault:break;}
}//运动微调模块
void MainWindow::on_pushButton_axix_zheng_pressed()
{if(initReult) jogAction(axi_x,nowSpeed);
}void MainWindow::on_pushButton_axix_zheng_released()
{GT_Stop(1<<(axi_x-1),1<<(axi_x-1));
}void MainWindow::on_pushButton_axix_fu_pressed()
{if(initReult) jogAction(axi_x,-nowSpeed);
}void MainWindow::on_pushButton_axix_fu_released()
{GT_Stop(1<<(axi_x-1),1<<(axi_x-1));
}void MainWindow::on_pushButton_axiy_zheng_pressed()
{if(initReult) jogAction(axi_y,nowSpeed);
}void MainWindow::on_pushButton_axiy_zheng_released()
{GT_Stop(1<<(axi_y-1),1<<(axi_y-1));
}void MainWindow::on_pushButton_axiy_fu_pressed()
{if(initReult) jogAction(axi_y,-nowSpeed);
}void MainWindow::on_pushButton_axiy_fu_released()
{GT_Stop(1<<(axi_y-1),1<<(axi_y-1));
}void MainWindow::on_pushButton_axiz_zheng_pressed()
{if(initReult) jogAction(axi_z,nowSpeed);
}void MainWindow::on_pushButton_axiz_zheng_released()
{GT_Stop(1<<(axi_z-1),1<<(axi_z-1));
}void MainWindow::on_pushButton_axiz_fu_pressed()
{if(initReult) jogAction(axi_z,-nowSpeed);
}void MainWindow::on_pushButton_axiz_fu_released()
{GT_Stop(1<<(axi_z-1),1<<(axi_z-1));
}void MainWindow::on_pushButton_axiu_zheng_pressed()
{if(initReult) jogAction(axi_u,nowSpeed);
}void MainWindow::on_pushButton_axiu_zheng_released()
{GT_Stop(1<<(axi_u-1),1<<(axi_u-1));
}void MainWindow::on_pushButton_axiu_fu_pressed()
{if(initReult) jogAction(axi_u,-nowSpeed);
}void MainWindow::on_pushButton_axiu_fu_released()
{GT_Stop(1<<(axi_u-1),1<<(axi_u-1));
}//复位功能
void MainWindow::on_pushButton_sysInit_clicked()
{short sRtn;TJogPrm  jog;// 打开运动控制器sRtn = GT_Open();// 复位运动控制器sRtn = GT_Reset();if(sRtn!=0){QMessageBox::warning(NULL,"error","程序复位失败!");}// 配置运动控制器// 注意:配置文件取消了各轴的报警和限位sRtn = GT_LoadConfig("./test.cfg");// 清除各轴的报警和限位sRtn = GT_ClrSts(1, 8);// 伺服使能sRtn = GT_AxisOn(axi_x);if(axi_y!=0) sRtn = GT_AxisOn(axi_y);if(axi_z!=0) sRtn = GT_AxisOn(axi_z);if(axi_u!=0) sRtn = GT_AxisOn(axi_u);// 位置清零sRtn = GT_ZeroPos(axi_x);if(axi_y!=0) sRtn = GT_ZeroPos(axi_y);if(axi_z!=0) sRtn = GT_ZeroPos(axi_z);if(axi_u!=0) sRtn = GT_ZeroPos(axi_u);// AXIS轴规划位置清零sRtn = GT_SetPrfPos(axi_x, 0);if(axi_y!=0) sRtn = GT_SetPrfPos(axi_y, 0);if(axi_z!=0) sRtn = GT_SetPrfPos(axi_z, 0);if(axi_u!=0) sRtn = GT_SetPrfPos(axi_u, 0);// 将AXIS轴设为jog模式sRtn =GT_PrfJog(axi_x);if(axi_y!=0) sRtn =GT_PrfJog(axi_y);if(axi_z!=0) sRtn =GT_PrfJog(axi_z);if(axi_u!=0) sRtn =GT_PrfJog(axi_u);// 读取运动参数sRtn =GT_GetJogPrm(axi_x,&jog);if(axi_y!=0) sRtn =GT_GetJogPrm(axi_y,&jog);if(axi_z!=0) sRtn =GT_GetJogPrm(axi_z,&jog);if(axi_u!=0) sRtn =GT_GetJogPrm(axi_u,&jog);jog.acc=0.0625;jog.dec=0.0625;// 设置运动参数sRtn =GT_SetJogPrm(axi_x,&jog);if(axi_y!=0) sRtn =GT_SetJogPrm(axi_y,&jog);if(axi_z!=0) sRtn =GT_SetJogPrm(axi_z,&jog);if(axi_u!=0) sRtn =GT_SetJogPrm(axi_u,&jog);initReult=TRUE;}//系统急停
void MainWindow::on_pushButton_sysStop_clicked()
{myStop(1);
}void MainWindow::on_pushButton_setProgram_clicked()
{QProcess noteProcess;noteProcess.startDetached("notepad.exe",QStringList(path_cwProgramList));
}//启动项目
void MainWindow::on_pushButton_startProgram_clicked()
{QProcess myprocess;QString key=ui->comboBox_selProgram->currentText();QString program=programMap[key];myprocess.startDetached(program.replace("/","//"),QStringList(program.replace("/","//")));}//切换控制卡
void MainWindow::on_comboBox_exchangeCardid_currentIndexChanged(const QString &arg1)
{int cardIndex=ui->comboBox_exchangeCardid->currentIndex();cardId=cardIndex;int ret=GT_SetCardNo(cardId);if(ret!=0) QMessageBox::warning(NULL,"error","切换控制卡失败!");short sRtn;TJogPrm  jog;// 注意:配置文件取消了各轴的报警和限位sRtn = GT_LoadConfig("./test.cfg");// 清除各轴的报警和限位sRtn = GT_ClrSts(1, 8);// 伺服使能sRtn = GT_AxisOn(axi_x);if(axi_y!=0) sRtn = GT_AxisOn(axi_y);if(axi_z!=0) sRtn = GT_AxisOn(axi_z);if(axi_u!=0) sRtn = GT_AxisOn(axi_u);// 位置清零sRtn = GT_ZeroPos(axi_x);if(axi_y!=0) sRtn = GT_ZeroPos(axi_y);if(axi_z!=0) sRtn = GT_ZeroPos(axi_z);if(axi_u!=0) sRtn = GT_ZeroPos(axi_u);// AXIS轴规划位置清零sRtn = GT_SetPrfPos(axi_x, 0);if(axi_y!=0) sRtn = GT_SetPrfPos(axi_y, 0);if(axi_z!=0) sRtn = GT_SetPrfPos(axi_z, 0);if(axi_u!=0) sRtn = GT_SetPrfPos(axi_u, 0);// 将AXIS轴设为jog模式sRtn =GT_PrfJog(axi_x);if(axi_y!=0) sRtn =GT_PrfJog(axi_y);if(axi_z!=0) sRtn =GT_PrfJog(axi_z);if(axi_u!=0) sRtn =GT_PrfJog(axi_u);// 读取运动参数sRtn =GT_GetJogPrm(axi_x,&jog);if(axi_y!=0) sRtn =GT_GetJogPrm(axi_y,&jog);if(axi_z!=0) sRtn =GT_GetJogPrm(axi_z,&jog);if(axi_u!=0) sRtn =GT_GetJogPrm(axi_u,&jog);jog.acc=0.0625;jog.dec=0.0625;// 设置运动参数sRtn =GT_SetJogPrm(axi_x,&jog);if(axi_y!=0) sRtn =GT_SetJogPrm(axi_y,&jog);if(axi_z!=0) sRtn =GT_SetJogPrm(axi_z,&jog);if(axi_u!=0) sRtn =GT_SetJogPrm(axi_u,&jog);initReult=TRUE;
}//点位运动
void MainWindow::on_pushButton_nextGo_clicked()
{double aimpos_x,aimpos_y,aimpos_z,aimpos_u;aimpos_x=ui->lineEdit_nextPosX->text().toDouble()*1000;if(aimpos_x!=0) trapAction(axi_x,nowSpeed,aimpos_x);aimpos_y=ui->lineEdit_nextPosY->text().toDouble()*1000;if(aimpos_y!=0) trapAction(axi_y,nowSpeed,aimpos_y);aimpos_z=ui->lineEdit_nextPosZ->text().toDouble()*1000;if(aimpos_z!=0) trapAction(axi_z,nowSpeed,aimpos_z);aimpos_u=ui->lineEdit_nextPosU->text().toDouble()*1000;if(aimpos_u!=0) trapAction(axi_u,nowSpeed,aimpos_u);
}void MainWindow::on_lineEdit_nextStop_clicked()
{myStop(2);
}//重置运动
void MainWindow::on_pushButton_isStop_clicked()
{myStop(2);
}//工站回原
void MainWindow::on_pushButton_reWorkSpace_clicked()
{//找原点,点位运动模式if(axi_x!=0) trapAction(axi_x,nowSpeed,0);if(axi_y!=0) trapAction(axi_y,nowSpeed,0);if(axi_z!=0) trapAction(axi_z,nowSpeed,0);if(axi_u!=0) trapAction(axi_u,nowSpeed,0);//找原点,jog运动模式
//    double oldpos_x,oldpos_y,oldpos_z,oldpos_u;
//    oldpos_x=oldpos_y=oldpos_z=oldpos_u=0;
//    connect(timer,QTimer::timeout,[&](){
//        if(abs(nowPos_x)-abs(oldpos_x)>50)
//        {
//            nowSpeed=-nowSpeed;
//            jogAction(axi_x,nowSpeed);
//            oldpos_x=nowPos_x;
//        }
//        else GT_Stop(1<<(axi_x-1),1<<(axi_x-1));//        if(abs(nowPos_y)-abs(oldpos_y)>50)
//        {
//            nowSpeed=-nowSpeed;
//            jogAction(axi_y,nowSpeed);
//            oldpos_y=nowPos_y;
//        }
//        else GT_Stop(1<<(axi_y-1),1<<(axi_y-1));//        if(abs(nowPos_z)-abs(oldpos_z)>50)
//        {
//            nowSpeed=-nowSpeed;
//            jogAction(axi_z,nowSpeed);
//            oldpos_z=nowPos_z;
//        }
//        else GT_Stop(1<<(axi_z-1),1<<(axi_z-1));//        if(abs(nowPos_u)-abs(oldpos_u)>50)
//        {
//            nowSpeed=-nowSpeed;
//            jogAction(axi_u,nowSpeed);
//            oldpos_u=nowPos_u;
//        }
//        else GT_Stop(1<<(axi_u-1),1<<(axi_u-1));
//    });
}void MainWindow::on_pushButton_reAix_x_clicked()
{if(axi_x!=0) trapAction(axi_x,nowSpeed,0);
}void MainWindow::on_pushButton_reAix_y_clicked()
{if(axi_y!=0) trapAction(axi_y,nowSpeed,0);
}void MainWindow::on_pushButton_reAix_z_clicked()
{if(axi_z!=0) trapAction(axi_z,nowSpeed,0);
}void MainWindow::on_pushButton_reAix_u_clicked()
{if(axi_u!=0) trapAction(axi_u,nowSpeed,0);
}void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{globalPos=event->globalPos();
//    qDebug()<<ui->frame->parentWidget()->mapToGlobal(ui->frame->pos());
//    qDebug()<<ui->frame->pos();
//    qDebug()<<globalPos;if(isContain(ui->frame,ui->frame->parentWidget(),globalPos,0)){for(int i=0;i<16;i++){if(isContain(btngroup_sigin.button(i),ui->frame_5,this->globalPos,0)){if(bg_sigin[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if(isContain(btngroup_sigout.button(i),ui->frame_12,this->globalPos,0)){if(bg_sigout[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8)&& isContain(btngroup_sigzheng.button(i),ui->frame_4,this->globalPos,0)){if(bg_sigzheng[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8) && isContain(btngroup_sigfu.button(i),ui->frame_7,this->globalPos,0)){if(bg_sigfu[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8) && isContain(btngroup_sigyuan.button(i),ui->frame_8,this->globalPos,0)){if(bg_sigyuan[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8) && isContain(btngroup_dalarm.button(i),ui->frame_9,this->globalPos,0)){if(bg_sigdalarm[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8) && isContain(btngroup_tomcan.button(i),ui->frame_10,this->globalPos,0)){if(bg_sigtomcan[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}else if((i<8) && isContain(btngroup_alclear.button(i),ui->frame_11,this->globalPos,0)){if(bg_sigalclear[i]=='1'){isNormal->setIcon(QIcon(":/new/prefix1/select.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/blank.bmp"));}else{isNormal->setIcon(QIcon(":/new/prefix1/blank.bmp"));isOpposite->setIcon(QIcon(":/new/prefix1/select.bmp"));}}}rightMenu->exec(globalPos);}}bool MainWindow::isContain(QWidget *obj,QWidget*parent,QPoint globalpoint,int border)
{int w=obj->width();int h=obj->height();QPoint leftTop=parent->mapToGlobal(obj->pos());QRect includeArea(leftTop.rx(),leftTop.ry(),w,h);if(includeArea.contains(globalpoint)) return true;return false;
}bool MainWindow::signalFlag()
{QFile file(path_signalInfo);if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){QMessageBox::warning(NULL,"error","打开信号配置文件失败!");return false;}QTextStream txtin(&file);txtin >>bg_sigin>>bg_sigout>>bg_sigzheng>>bg_sigfu>>bg_sigyuan>>bg_sigdalarm>>bg_sigtomcan>>bg_sigalclear;file.close();
}

转载于:https://my.oschina.net/urlove/blog/1611235

自动化行业工控系统Demo相关推荐

  1. 解惑烟草行业工控系统如何风险评估

    上周五下午,威努特工控安全联合创始人 赵宇 先生,带来了一场关于"工控系统的风险评估"的技术讲座.此次近200注册报名的朋友,来自各大高校.国企.外企.测评中心.安全厂商.大型集成 ...

  2. 工控系统主动安全防御体系的构建

    目录 前言 一.工控安全事件 二.工控安全面临的主要风险 1.外围系统风险 2.过程控制风险 3.工控设备风险 三.工控系统主要使用的安全防御技术 1.传统安全防御技术 2.PKI数字证书技术 3.I ...

  3. 通过条形码扫描器攻击工控系统

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周二,网络安全公司IOActive 的研究人员指出,可通过条形码扫描器入侵工业控制系统 (ICS). 此前,黑客曾演示了如何通过工业 ...

  4. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  5. 工控计算机安全评估,工控系统信息安全的威胁发现及评估技术研究

    摘要: 工业控制系统(Industrial Control Systems,ICS)遍及石油.化工和电力等行业,随着信息化和工业化逐渐融合,使得工控系统内部通信网络逐渐与互联网互联互通.不可避免的打破 ...

  6. 工控系统安全测试平台及攻防验证【会议】

    工控系统安全测试平台及攻防验证 写在前面的话 会议记录 写在前面的话 <网络空间安全青年科学家长安论坛>,本篇博客为广州大学田志宏老师的报告内容. 会议记录

  7. MITRE 发布工控系统的 ATTCK 框架

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周二,MITRE宣布发布第一版 ATT&CK 知识库,涵盖恶意行动者在攻击工业控制系统时使用的战术和技术. MITRE 的AT ...

  8. 【肥海豹】-网络安全等级保护(等保)-2020体系会-工控系统学习笔记

    讲解专家:电子六所 衣然 一.工业控制系统基本概念 工业控制系统是对生产过程.工艺流程的监控和管理的集合: 工业控制系统是国家工业领域关键信息基础设施的核心系统: 工业控制系统五层架构: 现场设备层. ...

  9. 工控系统的安全噩梦,网络攻击工控系统的五大案例

     70%的IT和运营技术专业人员担心网络攻击会造成计算机和工业系统的物理损坏,这些损坏不仅需要耗费大量财力进行灾后恢复,严重的甚至可能危及人命. 今年3月,美国各机构警告称,俄罗斯政府部门正在针对 ...

最新文章

  1. PyCharm+QT Designer整合
  2. 2014/3/16 长沙多校(第三次)
  3. 学习之路三十一:Varchar和NVarchar的理解
  4. boost::qvm::deduce_vec相关的测试程序
  5. 理解水平扩展和垂直扩展
  6. 对乱糟糟的日志说再见
  7. 【转载】stackoverflow 上关于 rebar 的讨论
  8. 计算机虚拟现实技术论文好写吗,计算机虚拟现实技术论文.docx
  9. Java实现一个字符串的反转
  10. 全新AI内参:量子位精心打磨,最新产业资讯、科研进展一文呈现
  11. 开篇~试试word写博客
  12. bzoj 1005: [HNOI2008]明明的烦恼(prufer数列)
  13. SqlServer事务回滚失败
  14. 《你的灯亮着吗》第一遍读后感
  15. ffplay播放器-数据读取线程
  16. MSSQL · 实现分析 · SQL Server实现审计日志的方案探索
  17. SSM | Spring
  18. 快速乘-在乘法溢出的边缘疯狂试探
  19. js时间搓转时间,日期横杠转斜杠,时间转时间搓,年月日补个零,星期几,获取当前时间
  20. 解决 XXX cannot be resolved or is not a field 问题

热门文章

  1. 14期《温故知新》9月刊
  2. 定义一个dog类java_Java类的定义及其实例化
  3. [mini LCTF 2023] 西电的部分
  4. 【windows】如何全部关闭360安全的弹出guang告?(已解决)
  5. hznu 1437: Clockwise(隐藏的暴力水题,数学)
  6. 【代码的小乐趣】修改SpringBoot启动图案
  7. 模拟退火算法和遗传算法原理简述
  8. [Vue3]Unix时间戳转为真实时间方法
  9. 分享PS高手使用技能 你都只知道哪些?
  10. Solana流通盘“忘记”计入1100万做市代币,陷信任危机