运行效果图

**一、 调试前准备工作
1.硬件平台
1.工控机(本人使用Win7 64位系统) 2.凌华AMP-204C运动控制卡一套 3. 步进电机和驱动器一套

2.开发软件
1.AMP-204C驱动安装(驱动下载网址如下)
https://www.adlinktech.com/Products/Motion_Control/CentralizedMotionControllers/AMP-204C_AMP-208C?lang=zh-cn

2.Qt5.9.8软件(官网下载缓慢,可以在清华大学开源镜像站下载)
https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.9/5.9.8/

运动控制卡驱动安装完成后,打开MotionCreatorPro2运动控制卡配置软件,完成每个轴的参数配置,最后保存参数到板卡Flash中(本人在调试过程中,在板卡初始化时,用的是从板卡的Flash初始化参数的方式。当然也可以将配置的参数保存为.ini文件,初始化板卡时,使用文件初始化板卡参数)。

二、开始程序的编写

1.打开安装的Qt Creater软件依次选择 文件 > 新建 > Qt Widget Application 输入项目名(我在这里命名为Motion) > 选择QWidget基类(默认创建类名为Widget)的窗体类。
创建的项目文件如下图:

2.打开安装运动控制卡驱动时创建的ADLINK文件夹(我的文件夹如下C:\Program Files (x86)\ADLINK\APS Library)找到如下几个文件

将这六个文件复制到Qt创建的Motion文件夹下

注意事项:(在导入APS168.h文件时,需要将该文件的内容转换为UTF-8格式,否则Qt编译时会报错)可以使用Notepad++软件将文件内容转换格式

3.返回Qt双击Motion.pro文件,在文件中添加下图两行代码

4.完成ui界面的设计

5.创建Motion类,用于封装板卡的库函数,实现相应的功能

Motion.h文件内容如下

#ifndef MOTION_H
#define MOTION_H#include "type_def.h"
#include "ErrorCodeDef.h"
#include "APS_Define.h"
#include "APS168.h"#define ON  (1)
#define OFF (0)
#define Step (0)
#define Cont (1)class Motion
{
public:Motion(I32 board_id, I32 axis_id, I32 mode, I32 position);~Motion();I32 Get_Board_ID();I32 Get_Axis_ID();I32 Get_Di_Data();public:I32 Motion_Init();I32 Motion_Close();I32 Motion_Stop_Move();I32 Motion_Load_Parameter_From_Flash();I32 Motion_Servo_On();I32 Motion_Servo_Off();I32 Motion_Home(F64 ACC, F64 VM, I32 Direction);I32 Motion_Absolute_Move(I32 Position, I32 Max_Speed, I32 ACC);I32 Motion_Jog_P(F64 ACC, F64 VM, I32 Mode);I32 Motion_Jog_N(F64 ACC, F64 VM, I32 Mode);I32 Motion_Jog_Stop();I32 Motion_State(I32 Axis_ID);I32 Motion_Get_Current_Position();F64 Motion_Current_Position();I32 Motion_Set_Current_Position_Zero();I32 Motion_Write_D_Group_output(I32 Board_ID, I32 Do_Group, I32 Do_Data);I32 Motion_Write_D_Channel_Output(I32 Board_ID, I32 Do_Group, I32 Ch_No, I32 Do_Data);I32 Motion_Read_D_Input(I32 Board_ID, I32 Di_Group);private:const I32 Board_ID;I32 Axis_ID;I32 Mode;F64 Position;I32 JogMode;I32 Di_Data;
};#endif // MOTION_H

Motion.cpp文件如下:

#include "motion.h"Motion::Motion(I32 board_id, I32 axis_id, I32 mode, I32 position ):Board_ID(board_id)
{Axis_ID = axis_id;Mode = mode;Position = position;Di_Data = 0;
}Motion::~Motion()
{}I32 Motion::Get_Board_ID()
{return Board_ID;
}I32 Motion::Get_Axis_ID()
{return Axis_ID;
}I32 Motion::Get_Di_Data()
{return Di_Data;
}I32 Motion::Motion_Init()
{I32 ret = 0;I32 board_id = Board_ID;APS_initial(&board_id, Mode);return ret;
}I32 Motion::Motion_Close()
{I32 ret = 0;ret = APS_close();return ret;
}I32 Motion::Motion_Stop_Move()
{I32 ret = 0;APS_stop_move(Axis_ID);return ret;
}I32 Motion::Motion_Load_Parameter_From_Flash()
{I32 ret = 0;ret = APS_load_parameter_from_flash(Board_ID);return ret;
}I32 Motion::Motion_Servo_On()
{I32 ret = 0;ret = APS_set_servo_on(Axis_ID, ON);return ret;
}I32 Motion::Motion_Servo_Off()
{I32 ret = 0;ret = APS_set_servo_on(Axis_ID, OFF);return ret;
}I32 Motion::Motion_Home(F64 ACC, F64 VM, I32 Direction)
{I32 ret = 0;APS_set_axis_param(Axis_ID, PRA_HOME_MODE, 0);APS_set_axis_param(Axis_ID, PRA_HOME_DIR, Direction);APS_set_axis_param_f(Axis_ID, PRA_HOME_CURVE, 0);APS_set_axis_param_f(Axis_ID, PRA_HOME_ACC, ACC);APS_set_axis_param_f(Axis_ID, PRA_HOME_VM, VM);APS_set_axis_param_f(Axis_ID, PRA_HOME_VO, 0);APS_set_axis_param(Axis_ID, PRA_HOME_EZA, 0);APS_set_axis_param_f(Axis_ID, PRA_HOME_SHIFT, 0);APS_set_axis_param_f(Axis_ID, PRA_HOME_POS, 0);Motion_Servo_On();Sleep(500);ret = APS_home_move(Axis_ID);if( ret != ERR_NoError ){/* Error handling */}return ret;
}I32 Motion::Motion_Absolute_Move(I32 Position, I32 Max_Speed, I32 ACC)
{I32 ret = 0;APS_set_axis_param(Axis_ID, PRA_ACC, ACC);APS_set_axis_param(Axis_ID, PRA_DEC, ACC);APS_absolute_move(Axis_ID, Position, Max_Speed);return ret;
}I32 Motion::Motion_Jog_P(F64 ACC, F64 VM, I32 JogMode)
{I32 ret = 0;APS_set_axis_param(Axis_ID, PRA_JG_MODE, JogMode);APS_set_axis_param(Axis_ID, PRA_JG_DIR, 1);APS_set_axis_param_f( Axis_ID, PRA_JG_CURVE, 0.0  );APS_set_axis_param_f( Axis_ID, PRA_JG_ACC, ACC );APS_set_axis_param_f( Axis_ID, PRA_JG_DEC, ACC );APS_set_axis_param_f( Axis_ID, PRA_JG_VM,  VM  );if( !( (APS_motion_io_status(Axis_ID) >> MIO_SVON) & 1) ){Motion_Servo_On();}Sleep(500);APS_jog_start(Axis_ID, OFF);ret = APS_jog_start(Axis_ID, ON);return ret;
}I32 Motion::Motion_Jog_N(F64 ACC, F64 VM, I32 JogMode)
{I32 ret = 0;APS_set_axis_param(Axis_ID, PRA_JG_MODE, JogMode);APS_set_axis_param(Axis_ID, PRA_JG_DIR, 0);APS_set_axis_param_f( Axis_ID, PRA_JG_CURVE, 0.0  );APS_set_axis_param_f( Axis_ID, PRA_JG_ACC, ACC );APS_set_axis_param_f( Axis_ID, PRA_JG_DEC, ACC );APS_set_axis_param_f( Axis_ID, PRA_JG_VM,  VM  );if( !( (APS_motion_io_status(Axis_ID) >> MIO_SVON) & 1) ){Motion_Servo_On();}Sleep(500);APS_jog_start(Axis_ID, OFF);ret = APS_jog_start(Axis_ID, ON);return ret;
}I32 Motion::Motion_Jog_Stop()
{I32 ret = 0;ret = APS_jog_start(Axis_ID, OFF);return ret;
}I32 Motion::Motion_State(I32 Axis_ID)
{I32 ret = 0;ret = APS_motion_status(Axis_ID);return ret;
}I32 Motion::Motion_Get_Current_Position()
{I32 ret = 0;ret = APS_get_position_f(Axis_ID, &Position);return ret;
}F64 Motion::Motion_Current_Position()
{F64 postion;postion = this->Position;return postion;
}I32 Motion::Motion_Set_Current_Position_Zero()
{I32 ret = 0;ret = APS_set_position(Axis_ID, 0);return ret;
}I32 Motion::Motion_Write_D_Group_output(I32 Board_ID, I32 Do_Group, I32 Do_Data)
{I32 ret = 0;APS_write_d_output(Board_ID, Do_Group, Do_Data);return ret;
}I32 Motion::Motion_Write_D_Channel_Output(I32 Board_ID, I32 Do_Group, I32 Ch_No, I32 Do_Data)
{I32 ret = 0;ret = APS_write_d_channel_output(Board_ID, Do_Group, Ch_No, Do_Data);return ret;
}I32 Motion::Motion_Read_D_Input(I32 Board_ID, I32 Di_Group)
{I32 ret = 0;ret = APS_read_d_input(Board_ID, Di_Group, &(this->Di_Data));return ret;
}

6.Widget窗体主函数实现如下:

Widget.h文件:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>bool Widget::m_OutputFlag = true;   // 初始化Output FlagWidget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{Fun_Init_Widget();Fun_Init_Motion();Fun_Motion_Action();Fun_Start_Thread_Position();Fun_Start_Thread_Working();Fun_Start_Thread_Input();Fun_Signal_Connect();
}Widget::~Widget()
{delete ui;delete m_pMotion;m_pMotion = nullptr;delete m_pThreadPosition;m_pThreadPosition = nullptr;delete m_pThreadWorking;m_pThreadWorking = nullptr;delete m_pThreadInput;m_pThreadInput = nullptr;
}/******系统函数实现******/
void Widget::closeEvent(QCloseEvent *event) //该函数系统函数,关闭窗口时执行
{Fun_Stop_Thread_Position();Fun_Stop_Thread_Working();Fun_Stop_Thread_Input();Fun_Motion_Close();event->accept();
}void Widget::paintEvent(QPaintEvent *event) //该函数为系统函数,用于绘制窗口
{QPainter painter(this);QPen pen;pen.setColor(Qt::blue);painter.setPen(pen);QBrush brush;brush.setColor(Qt::blue);painter.setBrush(brush);//    painter.setWindow(0, 0, this->width(), this->height());
//    painter.drawRect(rect());
//    painter.drawRect(10, 10, this->width(), this->height());
//    QPixmap pixmap;
//    pixmap.load(":/res/ADLINK.ico");
//    painter.drawPixmap(0, 0, this->width(), this->height(), pixmap);event->accept();
}/******成员函数实现******/
void Widget::Fun_Init_Widget()  //窗口初始化函数
{ui->setupUi(this);//设置窗口标题、图标和各参数的默认值this->setWindowTitle("Motion");this->setWindowIcon( QIcon(":/Photo/ADLINK.ico") );ui->lineEditACC->setText("4000000");ui->lineEditVM->setText("400000");ui->lineEditAbsPos->setText("0");//设置背景色QPalette WinPat(this->palette());WinPat.setColor(QPalette::Background, QColor(128, 255, 255));this->setPalette(WinPat);//LCD的屏幕显示设置QPalette lcdpat = ui->lcdPosition->palette();lcdpat.setColor(QPalette::Normal, QPalette::WindowText, Qt::red);ui->lcdPosition->setPalette(lcdpat);bool isOK = false;QInputDialog input;m_Axis_ID = input.getInt(this, "Axis_ID", "Axis_ID Input", 0, 0, 3, 1, &isOK, Qt::WindowFlags(nullptr));if(!isOK){m_Axis_ID = 0;}
}void Widget::Fun_Init_Motion()  //轴初始化函数
{m_pMotion = new Motion(0, this->m_Axis_ID, 0, 0);m_pMotion->Motion_Init();m_pMotion->Motion_Load_Parameter_From_Flash();m_pMotion->Motion_Write_D_Group_output(0, 0, 0);
}void Widget::Fun_Motion_Action()    //轴功能实现函数
{//Servo On实现connect(ui->btnMotorOn, &QPushButton::pressed, [=](){if(m_ServoFlag == false){m_pMotion->Motion_Write_D_Channel_Output(m_pMotion->Get_Board_ID(), 0, 8, true);m_pMotion->Motion_Servo_On();m_ServoFlag = true;ui->btnMotorOn->setText("点击下电");}else{m_pMotion->Motion_Servo_Off();m_pMotion->Motion_Write_D_Channel_Output(m_pMotion->Get_Board_ID(), 0, 8, false);m_ServoFlag = false;ui->btnMotorOn->setText("点击上电");}});//Jog+实现connect(ui->btnJogP, &QPushButton::pressed, [=](){m_pMotion->Motion_Jog_P(ui->lineEditACC->text().toDouble(), ui->lineEditVM->text().toDouble(), ui->comboBoxJogMode->currentIndex());connect(ui->btnJogP, &QPushButton::released, [=](){m_pMotion->Motion_Jog_Stop();});});//Jog-实现connect(ui->btnJogN, &QPushButton::pressed, [=](){m_pMotion->Motion_Jog_N(ui->lineEditACC->text().toDouble(), ui->lineEditVM->text().toDouble(), ui->comboBoxJogMode->currentIndex());connect(ui->btnJogN, &QPushButton::released, [=](){m_pMotion->Motion_Jog_Stop();});});//AbsMove实现connect(ui->btnAbsMove, &QPushButton::pressed, [=](){m_pMotion->Motion_Absolute_Move(ui->lineEditAbsPos->text().toInt(), ui->lineEditVM->text().toInt(), ui->lineEditACC->text().toInt());});//GoHome实现connect(ui->btnGoHome, &QPushButton::pressed, [=](){m_pMotion->Motion_Home(ui->lineEditACC->text().toDouble(), ui->lineEditVM->text().toDouble(), ui->comboBoxHomeDir->currentIndex());});//Stop Moveconnect(ui->btnStop, &QPushButton::pressed, [=](){m_pMotion->Motion_Stop_Move();});//当前位置设置为该轴的0点connect(ui->btnSetCurPosIsZero, &QPushButton::pressed, [=](){m_pMotion->Motion_Set_Current_Position_Zero();});//Line单个端口输出connect(ui->btnOutput, &QPushButton::pressed, [=](){if(m_OutputFlag){m_pMotion->Motion_Write_D_Channel_Output(0, 0, ui->comboBoxOutput->currentIndex()+8, 1);m_OutputFlag = false;}else{m_pMotion->Motion_Write_D_Channel_Output(0, 0, ui->comboBoxOutput->currentIndex()+8, 0);m_OutputFlag = true;}});
}void Widget::Fun_Motion_Close()
{m_pMotion->Motion_Write_D_Group_output(0, 0, 0);m_pMotion->Motion_Close();
}void Widget::Fun_Start_Thread_Position()    //Position点位实时显示开启线程
{m_pThreadPosition = new ThreadPosition(ui, m_pMotion);Fun_Stop_Thread_Position();m_pThreadPosition->Fun_Start_Thread();m_pThreadPosition->start();
}void Widget::Fun_Stop_Thread_Position() //Position点位实时显示关闭线程
{if(m_pThreadPosition->isRunning()){m_pThreadPosition->Fun_Stop_Thread();m_pThreadPosition->quit();m_pThreadPosition->wait();}
}void Widget::Fun_Start_Thread_Working() //Working线程开启函数
{m_pThreadWorking = new ThreadWorking(ui, m_pMotion);connect(ui->btnStartWorking, &QPushButton::clicked, [=](){if(m_pThreadWorking->isRunning()){return;}m_pThreadWorking->Slot_Start_Thread();m_pThreadWorking->start();});connect(ui->btnStopWorking, &QPushButton::clicked, [=](){Fun_Stop_Thread_Working();});
}void Widget::Fun_Stop_Thread_Working()  //Working线程关闭函数
{if(m_pThreadWorking->isRunning()){m_pThreadWorking->Slot_Stop_Thread();m_pThreadWorking->quit();m_pThreadWorking->wait();}
}void Widget::Fun_Start_Thread_Input()   //Input信号实时采集开启线程
{m_pThreadInput = new ThreadInput(m_pMotion, ui);m_pThreadInput->Fun_Start_Thread();m_pThreadInput->start();
}void Widget::Fun_Stop_Thread_Input()    //Input信号实时采集关闭线程
{m_pThreadInput->Fun_Stop_Thread();m_pThreadInput->quit();m_pThreadInput->wait();
}void Widget::Fun_Signal_Connect()   //用于Working线程的信号链接
{void (ThreadWorking::*pSignalMsg)(QString) = &ThreadWorking::Signal_Send_Move_OK;connect(m_pThreadWorking, pSignalMsg, this, &Widget::Slot_Msg_Show);
}/******槽函数实现******/
void Widget::Slot_Msg_Show(QString str)
{QMessageBox msg(this);msg.setText(str);msg.exec();
}

7.各子线程的代码实现:

7.1点位实时采集:
ThreadPosition.h代码

#ifndef THREADPOSITION_H
#define THREADPOSITION_H#include <QObject>
#include <QThread>
#include <QTimer>
#include "ui_widget.h"
#include "motion.h"class ThreadPosition : public QThread
{Q_OBJECT
public:ThreadPosition(Ui::Widget* _ui, Motion* _motion);~ThreadPosition();void Fun_Start_Thread();void Fun_Stop_Thread();signals:public slots:protected:void run();private:bool m_isStart = false;Ui::Widget* m_pUi = nullptr;Motion* m_pMotion = nullptr;
};#endif // THREADPOSITION_H

ThreadPosition.cpp代码

#include "threadposition.h"
#include <QDebug>ThreadPosition::ThreadPosition(Ui::Widget* _ui, Motion* _motion)
{m_pUi = _ui;m_pMotion = _motion;
}ThreadPosition::~ThreadPosition()
{}void ThreadPosition::run()
{while(m_isStart){m_pMotion->Motion_Get_Current_Position();msleep(10);m_pUi->lcdPosition->display(m_pMotion->Motion_Current_Position());}
}/******成员函数实现******/
void ThreadPosition::Fun_Start_Thread()
{m_isStart = true;
}void ThreadPosition::Fun_Stop_Thread()
{m_isStart = false;
}

7.2 Input输入端实时采集线程

ThreadInput.h

#ifndef THREADINPUT_H
#define THREADINPUT_H#include <QObject>
#include <QThread>
#include <QTimer>
#include "motion.h"
#include "ui_widget.h"class ThreadInput : public QThread
{Q_OBJECT
public:ThreadInput(Motion* _motion, Ui::Widget* _ui);~ThreadInput();void Fun_Start_Thread();void Fun_Stop_Thread();protected:void run();private:bool m_isStart = false;Motion* m_pMotion = nullptr;Ui::Widget* m_pUi = nullptr;
};#endif // THREADINPUT_H

ThreadInput.cpp代码

#include "threadinput.h"ThreadInput::ThreadInput(Motion* _motion, Ui::Widget* _ui)
{m_pMotion = _motion;m_pUi = _ui;
}ThreadInput::~ThreadInput()
{}void ThreadInput::run()
{while(m_isStart){m_pMotion->Motion_Read_D_Input(m_pMotion->Get_Board_ID(), 0);msleep(10);m_pUi->Di01->setChecked((m_pMotion->Get_Di_Data() >> 8 ) & 1);m_pUi->Di02->setChecked((m_pMotion->Get_Di_Data() >> 9 ) & 1);m_pUi->Di03->setChecked((m_pMotion->Get_Di_Data() >> 10 ) & 1);m_pUi->Di04->setChecked((m_pMotion->Get_Di_Data() >> 11 ) & 1);m_pUi->Di05->setChecked((m_pMotion->Get_Di_Data() >> 12 ) & 1);m_pUi->Di06->setChecked((m_pMotion->Get_Di_Data() >> 13 ) & 1);m_pUi->Di07->setChecked((m_pMotion->Get_Di_Data() >> 14 ) & 1);m_pUi->Di08->setChecked((m_pMotion->Get_Di_Data() >> 15 ) & 1);m_pUi->Di09->setChecked((m_pMotion->Get_Di_Data() >> 16 ) & 1);m_pUi->Di10->setChecked((m_pMotion->Get_Di_Data() >> 17 ) & 1);m_pUi->Di11->setChecked((m_pMotion->Get_Di_Data() >> 18 ) & 1);m_pUi->Di12->setChecked((m_pMotion->Get_Di_Data() >> 19 ) & 1);m_pUi->Di13->setChecked((m_pMotion->Get_Di_Data() >> 20 ) & 1);m_pUi->Di14->setChecked((m_pMotion->Get_Di_Data() >> 21 ) & 1);m_pUi->Di15->setChecked((m_pMotion->Get_Di_Data() >> 22 ) & 1);m_pUi->Di16->setChecked((m_pMotion->Get_Di_Data() >> 23 ) & 1);}
}void ThreadInput::Fun_Start_Thread()
{m_isStart = true;
}void ThreadInput::Fun_Stop_Thread()
{m_isStart = false;
}

7.3 ThreadWorking线程(该线程用于实现相应的工作逻辑)
ThreadWorking.h文件

#ifndef THREADWORKING_H
#define THREADWORKING_H#include <QObject>
#include <QThread>
#include <QTimer>
#include "ui_widget.h"
#include "motion.h"class ThreadWorking : public QThread
{Q_OBJECT
public:ThreadWorking(Ui::Widget* _ui, Motion* _motion);~ThreadWorking();void Fun_Start_Thread();void Fun_Stop_Thread();bool Fun_Check_Motion_Move_OK();signals:void Signal_Send_Move_OK(QString str);public slots:void Slot_Start_Thread();void Slot_Stop_Thread();protected:void run();private:bool m_isStart = false;Ui::Widget* m_pUi = nullptr;Motion* m_pMotion = nullptr;
};#endif // THREADWORKING_H

ThreadWorking.cpp文件:

#include "threadworking.h"
#include <QDebug>ThreadWorking::ThreadWorking(Ui::Widget* _ui, Motion* _motion)
{m_pUi = _ui;m_pMotion = _motion;
}ThreadWorking::~ThreadWorking()
{}/******系统函数实现******/
void ThreadWorking::run()
{while(m_isStart){m_pMotion->Motion_Read_D_Input(m_pMotion->Get_Axis_ID(), 0);msleep(10);if( ((m_pMotion->Get_Di_Data())>>8) & 1 ){m_pMotion->Motion_Absolute_Move(m_pUi->lineEditAbsPos->text().toInt(),m_pUi->lineEditVM->text().toInt(),m_pUi->lineEditACC->text().toInt());while(!Fun_Check_Motion_Move_OK()){msleep(1);}}if( ((m_pMotion->Get_Di_Data())>>9) & 1 ){m_pMotion->Motion_Absolute_Move(-m_pUi->lineEditAbsPos->text().toInt(),m_pUi->lineEditVM->text().toInt(),m_pUi->lineEditACC->text().toInt());while(!Fun_Check_Motion_Move_OK()){msleep(1);}}}
}/******成员函数实现******/
void ThreadWorking::Fun_Start_Thread()
{this->m_isStart = true;
}void ThreadWorking::Fun_Stop_Thread()
{this->m_isStart = false;
}bool ThreadWorking::Fun_Check_Motion_Move_OK()
{bool flag = false;flag = (m_pMotion->Motion_State(m_pMotion->Get_Axis_ID()) >> 5) & 1;return flag;
}/******槽函数实现******/
void ThreadWorking::Slot_Start_Thread()
{this->Fun_Start_Thread();qDebug() << "Start";
}void ThreadWorking::Slot_Stop_Thread()
{this->Fun_Stop_Thread();qDebug() << "Stop";
}

该线程我只是简单实现了输入Di00有输入信号时,当前使用的轴移至主窗口的AbsMovPos所输入的点位;当Di01有输入信号时,该轴移至负的AbsMovPos所输入点位。

三. 窗体各区域介绍:

四.总结
该程序通过Qt软件实现了对AMP-204C运动控制卡的基本功能调试工作。可以实现板卡相应的Jog运动、Abs点位运动、回零运动,实现对板卡I/O的输入采集和输出控制。

凌华运动控制卡AMP_204C_Qt C++调试相关推荐

  1. 凌华运动控制卡调试记录

    硬件组态: 凌华工控机,运动控制卡:AMP204C  IO卡:PCI7432 接线端子台:DIN825-4P0(G)-0010. 系统是Win7  32 专业版/  我马上开始测试 Win32 旗舰版 ...

  2. 凌华运动控制卡的函数。

    上表里面的七个结构体是凌华函数里面会用到的七个结构体,先声明出来. 链接: http://pan.baidu.com/s/1i38RV4T 密码: bmn2 转载于:https://www.cnblo ...

  3. 凌华科技aTCA-6200A服务器刀片完美搭配Intel® DPDK技术显著提升包转发服务性能

    前言 近年来,随着市场和技术的发展,越来越多的网络基础架构开始向基于通用计算平台或模块化计算平台的架构方向融合,用以支持和提供多样的网络单元和丰富的功能,如应用处理.控制处理.包处理.信号处理等.除了 ...

  4. 给研华, 控创, 西门子, 凌华, 研祥, 艾迅, 盛博, 诺达佳, 阿普奇 ,桦汉工控机外扩一路,二路CAN,四路等CAN通讯

    工控机基于X86架构,为用户提供支持ATX工业主板的上架式和壁挂式工控机,同时还提供7个扩展插槽,方便扩充多种总线功能卡,并可根据客户需求提供定制化服务,产品广泛应用于工业自动化.自助终端.医疗设备. ...

  5. 研华运动控制卡接线图_ADVANTECH研华PCI-1245S运动控制卡4轴DSP架构脉冲型 步进/伺服电机SCARA控制通用PCI卡...

    研华运动控制卡 总线式AMONET AMAX-2241/PMA-BE      4轴AMONet RS-485支持松下Minas A系列运动从站模块 AMAX-2752SY-AE         32 ...

  6. 凌华服务器维护手册,鸿鹄专业电脑 成功修复台湾凌华ADLINK工控设备。

    马上注册,获取阅读精华内容及下载权限 您需要 登录 才可以下载或查看,没有帐号?注册 x 本帖最后由 鸿鹄专业电脑 于 2014-7-24 22:33 编辑 客户送修两台机器,刚开始以为是普通的主机, ...

  7. API卡_浦洛电子科技代理凌华GPIB卡

    凌华科技高性价比GPIB系列产品,已连续超过10年针对数家仪器大厂持续供货,且价格低于领导品牌1/3以上,质量绝对值得信赖! 凌华科技GPIB接口卡亮点: 与您现有应用程序完全兼容 凌华科技GPIB接 ...

  8. gpib通信协议_【成功案例】生命科学仪器测试设备公司借助凌华GPIB通信卡 突破旧式仪器与系统兼容整合管理的困境...

    背景 欧美某家专门生产生命科学仪器.半导体.光纤网络测试设备的公司,所生产的仪器设备广泛用于各种工业.生医科学场合中,产品质量优良可靠,赢得了全球各国厂商的热爱.其仪器设备历史悠久,采用的是以GPIB ...

  9. python 研华控制卡_研华运动控制卡VB.Net开发

    1.安装工具文件获得dll文件 默认路径安装"Advantech Common Motion Driver & Utility.exe",如下图为该安装文件. 具体安装步骤 ...

最新文章

  1. Java 技术篇 - 从指定的web网页页面中读取html内容实例演示,从http协议下的url地址中读取web页面内容方法
  2. 洛谷 P1410 子序列(DP)
  3. [云炬创业基础笔记]第六章商业模式测试20
  4. Codeforces 698D Limak and Shooting Points (搜索)
  5. Spring Boot Transaction 源码解析(二)
  6. Unity Api集合
  7. k折交叉验证法python实现_Jason Brownlee专栏| 如何解决不平衡分类的k折交叉验证-不平衡分类系列教程(十)...
  8. OOP in PHP
  9. 在使用FireFox浏览器时,经常打开新标签,页面总是不断自动刷新,解决办法
  10. ASP.NET Web API 异常日志记录
  11. oracle怎么锁表以及解锁,Oracle锁表与解锁
  12. matlab投资组合权重,【原创】投资组合风险-收益关系的Matlab实现
  13. 商场云WiFi靠谱吗
  14. 人类2100年长啥样?3D建模模拟出来让人惊掉下巴!
  15. Codeforces Round #727 (Div. 2)题解A-D
  16. ue4 unreal4 自定义网格 绘制自定义网格 绘制面 (Plus)
  17. LeetCode刷题日记盛最多水的容器
  18. java书写开头,JAVA代码书写规范汇总详解
  19. 不要使用矿泉水瓶接热水喝——致癌
  20. python pandas读取csv文件指定行_python pandas获取csv指定行 列的操作方法

热门文章

  1. 好用的商业智能bi软件
  2. 股市投资必修课二十七--护城河的宽窄与行业个股那个更重要
  3. SGC - Simplifying Graph Convolutional Networks 简化的图卷积网络 论文详解 ICML 2019
  4. JAVA实现发送邮件
  5. 汽车行业会用到python吗_二手车行业的猫腻,用Python都扒出来了
  6. 程序员的上帝视角(4)——视角
  7. 嵌入式系统测试题40道附详细解析
  8. 机智云无需代码就能搞定IoT小程序开发和管理
  9. Linux必会命令集
  10. JAVASE零基础入门——package、封装、继承、访问权限修饰符、super、重写、Javabean 和 final 关键字