点击上方“正运动小助手”,随时关注新动态!
本文导读
上节课程我们讲述了如何建立Delta并联机械手正逆解,本节课程我们主要讲解如何通过C#语言开发正运动Delta并联机械手视觉流水线同步分拣的视觉部分。
VPLC711硬件介绍
VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器视觉EtherCAT运动控制器,具备强大的运算能力和灵活性。它具有出色的实时性能和多路高速硬件输入与多路高速PSO输出,能够精准控制多轴同步运动,并与外部设备实现多协议的高速通信。
VPLC711支持多种硬件接口和通信协议,方便与其他设备的连接和集成。除此之外,VPLC711还具备视觉处理功能,能够实时处理图像数据,实现视觉检测、测量和定位等应用。
VPLC711内置Windows运动控制实时内核MotionRT7,形成一种开放式IPC形态实时软控制器/软PLC,为用户提供灵活集成的运动控制+视觉一体化解决方案。
1.采用x86高性能CPU,EtherCAT可支持1ms 64轴同步运行;
5.支持DVI-D,HDMI显示,支持双网口不同IP设置。
C#语言进行Delta并联机械手的开发之运动库和视觉库的添加
1.在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。
3.找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。
PC函数介绍
指令 | ZAux_OpenEth | ||||
指令原型 | int32 __stdcall ZAux_OpenEth(char *ipaddr, ZMC_HANDLE * phandle) | ||||
指令说明 | 以太网连接控制器。 | ||||
输入参数 |
| ||||
输出参数 |
| ||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||
指令示例 | 网口连接控制器 | ||||
详细说明 | 1.网口采用RJ45标准网线接口,通讯速率为100Mbit/s。 2.控制器出厂的IP地址为192.168.0.11,端口号为502。对端通讯设备需与控制器处于同一网段,才可进行连接。 3.最常用的控制器连接方式。 4.ZMC_HANDLE 类型:Zmotion库中,专门用于控制卡连接数据定义类型; |
指令 | CAM_SCAN | ||||||
指令原型 | int32 __stdcall CAM_SCAN(ZMC_HANDLE handle, const char* type); | ||||||
指令说明 | 相机扫描 | ||||||
输入参数 |
| ||||||
输出参数 | / | ||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||
指令示例 | 机械手的建立 | ||||||
详细说明 | type 相机品牌具体说明: "zmvcbase" ----USB免驱摄像头 "zmotion" ----正运动相机 "mvision" ----海康威视相机 "basler" ----basler相机 "mindvision" ----迈德威视相机 "huaray" ----大华相机 "dvpcamera" ----度申相机 "daheng" ----大恒相机 |
指令 | CAM_GET | ||||||||
指令原型 | int32 __stdcall CAM_GET(ZMC_HANDLE handle, const char* img, uint32 bufId); | ||||||||
指令说明 | 以太网连接控制器。 | ||||||||
输入参数 |
| ||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||
指令示例 | / | ||||||||
详细说明 | / |
指令 | ZV_SHAPECREATERE | ||||||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZV_SHAPECREATERE(ZMC_HANDLE handle, const char* img, const char* re, const char* model, float angleStart, float angleEnd, float scaleMin, float scaleMax, uint32 thresh, uint32 levelNum, uint32 ptReduce, float angleStep, float scaleStep, uint32 minContLen); | ||||||||||||||||||||||||||||||
指令说明 | 用图像创建模板 | ||||||||||||||||||||||||||||||
参数说明 |
| ||||||||||||||||||||||||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||||||||||||||||||||||||
指令示例 | / | ||||||||||||||||||||||||||||||
详细说明 | 注:创建模板时通常选取轮廓分明且具有唯一特性的目标作为模板,特征最好不要具有对称性。模板特征数据量大小通常与模板大小和模板参数有关,其数据量与模板大小、模板轮廓的复杂度、旋转角度范围、缩放范围成正比。模板越大使用的角度步长越小,在同等角度范围下特征数据量就越大,因此匹配时就越耗时。创建模板和匹配具有超时机制,默认的均是5000ms,当创建模板超时可以通过适当地调整模板参数减小模板特征数据量(如缩放范围调小点或使用轮廓点精简参数ptReduce,此参数默认值为0即不精简轮廓点,精简的过于严重可能会影响匹配精度),或者是通过手动设置超时时间,如ZV_SETSYSDBL("ShapeCreateTime out", 5000),ZV_SETSYSDBL("ShapeFindTimeout", 5000)。创建模板也具有内存保护机制,当使用过大的模板图像创建具有缩放的模板时,占用的内存达到保护临界值时,此时报内存错误导致模板创建失败可以通过调整模板参数减少数据量,如使用ptReduce参数精简一些点,或阈值thresh设大点只提取更为明显的轮廓特征。 |
指令 | ZV_SHAPEFINDST | ||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZV_SHAPEFINDST(ZMC_HANDLE handle, const char* model, const char* img, const char* matchs, const char* stats, float minScore, uint32 nums, float minDist, uint32 minThresh, uint32 accuracy, float speedspeed, uint32 polar); | ||||||||||||||||||||||||||
指令说明 | 形状匹配并输出轮廓状态。 | ||||||||||||||||||||||||||
参数说明 |
| ||||||||||||||||||||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||||||||||||||||||||
指令示例 | / |
C#例程建设之视觉相机标定与形状匹配
1.视觉配置文件的下载
//下载相关脚本到控制器,进行视觉变量的定义
string BasPath = "";
BasPath = string.Format(@"{0}", Application.StartupPath) + @"\Icon\视觉变量定义.bas";
//.bas文件下载到控制器
zmcaux.ZAux_BasDown(g_Handle,BasPath,0);
/************************************************************************************
'任务编号:无
'函数功能:视觉提取标定板上实心圆的像素坐标,获取标定板圆心的像素坐标的矩阵
'Input:无
'Output:无
'返回值:无
**************************************************************************************/
private void GetPictureMark()
{
float[] temp_thresh = new float[2];
int Err = 0;
//提取圆心图像坐标,得到像素坐标矩阵Inppts
Err = Zvision.ZV_CALGETSCAPTS(form.g_Handle, grabimg, inppts, Convert.ToUInt32(C_CalibThresh.Text), Convert.ToUInt32(C_CalibPolar.Text), Convert.ToUInt32(C_CalibMinArea.Text), Convert.ToUInt32(C_CalibMaxArea.Text));
int[] inppts_info = { 0, 0, 0 };
//获取矩阵行数和列数,行数表示识别到实心圆的个数
Err = Zvision.ZV_MATINFO(form.g_Handle, inppts, inppts_info);
int row, col;
row = (int)inppts_info[0];
col = (int)inppts_info[1];
//视觉识别到9个实心圆和标定板的实心圆数目一致
if (row == 9)
{
Err = Zvision.ZV_GRAYTORGB(form.g_Handle, grabimg, calibshowimg);
//inppts排好序输出排好序的像素坐标矩阵ppts
Err = Zvision.ZV_CALGETPTSMAP(form.g_Handle, inppts, ppts, wpts, Convert.ToSingle(C_CalibDis.Text));
Err = Zvision.ZV_MATINFO(form.g_Handle, ppts, inppts_info);
row = (int)inppts_info[0];
col = (int)inppts_info[1];
if (row >= 9)
{
uint i;
DataGridView1.Rows.Clear();
for (i = 0; i < row; i++)
{
//像素坐标在WinFrom的UI界面是显示出来
string[] tempstr = new string[4];
float[] outvalue = { 0, 0 };
Zvision.ZV_MATGETROW(form.g_Handle, wpts, i, 2, outvalue);
tempstr[2] = "0";
tempstr[3] = "0";
Zvision.ZV_MATGETROW(form.g_Handle, ppts, i, 2, outvalue);
tempstr[0] = outvalue[0].ToString();
tempstr[1] = outvalue[1].ToString();
DataGridView1.Rows.Add(tempstr);
//在原图是画出识别到的实心圆,并标记,然后在Ui界面上显示出图像
Zvision.ZV_MARKER(form.g_Handle, calibshowimg, outvalue[0], outvalue[1], 0, 40, 0, 255, 0);
Zvision.ZV_TEXT(form.g_Handle, calibshowimg, i.ToString(), outvalue[0] - 20, outvalue[1] - 20, 40, 0, 255, 0);
Zvision.ZV_LATCHCLEAR(form.g_Handle, 0);
Zvision.ZV_LATCHSETSIZE(form.g_Handle, 0, Convert.ToUInt32(pictureBox5.Width), Convert.ToUInt32(pictureBox5.Height)); pictureBox5.Image = Zvision.ZV_LATCH(form.g_Handle, calibshowimg, 0);
}
}
else
{
MessageBox.Show("提取mark点失败!", "提示");
}
}
else
{
MessageBox.Show("提取mark点失败!", "提示");
}
}
/************************************************************************************
'任务编号:无
'函数功能:相机标定
'Input:无
'Output:无
'返回值:无
'备注:计算像素坐标和世界坐标的转换关系
'备注:标定板圆心的世界坐标可以通过示教的方式获取
**************************************************************************************/
private void CamCalib()
{
//矩阵行和式
uint row, col;
row = 9;
col = 2;
//从Ui界面上获取世界坐标的矩阵数据
float[] wPontsValue = new float[row * col];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
wPontsValue[col * i + j] = float.Parse(DataGridView1.Rows[i].Cells[j + 2].Value.ToString());
}
}
//重新生成世界坐标矩阵
Zvision.ZV_MATGENDATA(form.g_Handle, wpts, row, col, wPontsValue);
//图像坐标矩阵数据
float[] pPontsValue = new float[row * col];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
pPontsValue[col * i + j] = float.Parse(DataGridView1.Rows[i].Cells[j].Value.ToString());
}
}
//重新生成图像坐标矩阵
Zvision.ZV_MATGENDATA(form.g_Handle, ppts, row, col, pPontsValue);
float[] outimginfo = { 0, 0, 0, 0, 0 };
//获取图像信息
Zvision.ZV_IMGINFO(form.g_Handle, grabimg, outimginfo);
//进行相机标定
Zvision.ZV_CALCAM(form.g_Handle, ppts, wpts, ZmotionCalPara, (ushort)outimginfo[0], (ushort)outimginfo[1], (uint)Convert.ToInt32(C_CalibType.Text));
float[] outcaliberror = { 0, 0, 0 };
//获取标定误差
Zvision.ZV_CALERROR(form.g_Handle, ZmotionCalPara, ppts, wpts, outcaliberror);
//平均误差小于0.5内算是优,0.5--1为良,1--1.5为一般,1.5以上建议重新标定
if (outcaliberror[0] >= 1.5)
{
MessageBox.Show("标定平均误差过大请重新标定");
}
else
{
//保存标定参数
Zvision.ZV_CALWRITE(form.g_Handle, ZmotionCalPara, form.CalFileDir);
}
}
/************************************************************************************
'任务编号:无
'函数功能:通过相机采集图像
'Input:无
'Output:无
'返回值:无
**************************************************************************************/
public Image CameAcquisition()
{
float Temp = 0;
Image ImageBuff = null;
Zvision.CAM_COUNT(form.g_Handle, ref Cam_Num);
//选择相机
Zvision.CAM_SEL(form.g_Handle, 0);
//采集一张图像
Zvision.CAM_TRIGGER(form.g_Handle);
//更新皮带位置
zauxBrr = zmcaux.ZAux_Direct_GetMpos(form.g_Handle, form.ConveyorAxisId, ref Temp);
form.BeltMpos = Temp;
//从相机缓存取里面获取刚刚采集的图像
Zvision.CAM_GET(form.g_Handle, grabimg, 0);
//RGB转灰度
Zvision.ZV_RGBTOGRAY(form.g_Handle, grabimg, grabimg);
//锁存数据清空
Zvision.ZV_LATCHCLEAR(form.g_Handle, 0);
//设置锁存的大小为图片显示控件的大小
Zvision.ZV_LATCHSETSIZE(form.g_Handle, 0, Convert.ToUInt32(ImgShow1.Width), Convert.ToUInt32(ImgShow1.Height));
//获取锁存中的图像
ImgShow1.Image = Zvision.ZV_LATCH(form.g_Handle, grabimg, 0);
//导出获取到的图像信息
return ImgShow1.Image;
}
/************************************************************************************
'任务编号:无
'函数功能:创建形状模版
'Input:无
'Output:无
'返回值:无
**************************************************************************************/
private void CreateTemplate()
{
//通过图像创建模板
Zvision.ZV_SHAPECREATERE(form.g_Handle, SubImg, mod_re, shape_mod, Convert.ToInt32(modStartAngle.Text), Convert.ToInt32(modEndAngle.Text), Convert.ToInt32(modMinScale.Text), Convert.ToInt32(modMaxScale.Text), Convert.ToUInt32(modThresh.Text), Convert.ToUInt32(modNum_Level.Text), Convert.ToUInt32(modPt_Reduce.Text), Convert.ToInt32(modAngle_Step.Text), Convert.ToInt32(modScale_Step.Text), 20);
//获取模板轮廓
Zvision.ZV_SHAPECONTOURS(form.g_Handle, shape_mod, modconlist, 0);
//灰度转rgb
Zvision.ZV_GRAYTORGB(form.g_Handle, cutimg, modimg);
float[] getimginfo = { 0, 0, 0, 0, 0 };
//图像信息
Zvision.ZV_IMGINFO(form.g_Handle, modimg, getimginfo);
//刚性变换
Zvision.ZV_GETRIGIDVECTOR(form.g_Handle, mod_matrigid, 0, 0, 0, getimginfo[0] / 2, getimginfo[1] / 2, 0);
//仿射变换
Zvision.ZV_CONTAFFINE(form.g_Handle, modconlist, mod_matrigid, tsmodconlist);
//绘制轮廓到图像上
Zvision.ZV_CONTLIST(form.g_Handle, modimg, tsmodconlist, 0, 255, 0, 1);
//清空控制器的锁存缓冲区
Zvision.ZV_LATCHCLEAR(form.g_Handle, 1);
//设置锁存缓冲区大小,设置锁存通道大小和显示控件picgbox控件一样大
Zvision.ZV_LATCHSETSIZE(form.g_Handle, 1, Convert.ToUInt32(pictureBox2.Width), Convert.ToUInt32(pictureBox2.Height)); //显示图像
pictureBox2.Image = Zvision.ZV_LATCH(form.g_Handle, modimg,1); //截取图像显示到ui上
pictureBox3.Image = pictureBox2.Image;
//清空控制器的锁存缓冲区
Zvision.ZV_LATCHCLEAR(form.g_Handle, 1);
//设置锁存缓冲区大小
Zvision.ZV_LATCHSETSIZE(form.g_Handle, 1, Convert.ToUInt32(pictureBox4.Width), Convert.ToUInt32(pictureBox4.Height)); //设置锁存通道大小和picgbox控件一样大
//显示图像
pictureBox4.Image = Zvision.ZV_LATCH(form.g_Handle, modimg, 1);//截取图像显示到Ui上
}
/************************************************************************************
'任务编号:无
'函数功能:形状匹配,在图像是查找模板
'Input:无
'Output:无
'返回值:无
**************************************************************************************/
public Image ShapeFind()
{
//结果数组清空
for (int m = 0; m < 10; m++)
{
for (int n = 0; n < 5; n++)
{
form.VisionRst[m, n] = 0;
}
}
//形状模板匹配
Zvision.ZV_SHAPEFIND(form.g_Handle, shape_mod, grabimg, find_outlist, Convert.ToInt32(findminscore.Text), Convert.ToUInt32(findnum.Text), Convert.ToInt32(findmindis.Text), Convert.ToInt32(findthresh.Text), Convert.ToUInt32(findaccuracy.Text), Convert.ToInt32(findspeed.Text), Convert.ToUInt32(findpolar.Text));
int[] mat_info = { 0, 0, 0 };
//输出信息
Zvision.ZV_MATINFO(form.g_Handle, find_outlist, mat_info);
//生成绘制彩图
Zvision.ZV_GRAYTORGB(form.g_Handle, grabimg, show_img);
//匹配到目标了
if ((int)mat_info[0] > 0)
{
for (uint i = 0; i < (int)mat_info[0]; i++)
{
float[] rst_value = { 0, 0, 0, 0, 0 };
Zvision.ZV_MATGETROW(form.g_Handle, find_outlist, i, 5, rst_value);
rstScore.Text = rst_value[0].ToString();
rstPixX.Text = rst_value[1].ToString();
rstPixY.Text = rst_value[2].ToString();
rstAngle.Text = rst_value[3].ToString();
rstScale.Text = rst_value[4].ToString();
//分数筛选
if (rst_value[0] >= form.VisionScore)
{
//输出结果
for (int k = 0; k < 5; k++)
{
form.VisionRst[i, k] = rst_value[k];
}
float[] outworldpos = { 0, 0 };
//像素转世界坐标
Zvision.ZV_CALTRANSW(form.g_Handle, ZmotionCalPara, rst_value[1], rst_value[2], outworldpos);
rstWorldX.Text = outworldpos[0].ToString();
rstWorldY.Text = outworldpos[1].ToString();
//输出世界坐标
for (int k = 1; k < 3; k++)
{
form.VisionRst[i, k] = outworldpos[k - 1];
}
//显示匹配结果
string RstWorldStr;
RstWorldStr = "OK_坐标(" + rstWorldX.Text + "," + rstWorldY.Text + ")";
Zvision.ZV_TEXT(form.g_Handle, show_img, RstWorldStr, rst_value[1], rst_value[2], 50, 0, 255, 0);
//计算刚性变换矩阵
Zvision.ZV_GETRIGIDVECTOR(form.g_Handle, find_matrigid, 0, 0, 0, rst_value[1], rst_value[2], rst_value[3]);
//轮廓序列仿射变换
Zvision.ZV_CONTAFFINE(form.g_Handle, modconlist, find_matrigid, tsmodconlist2);
//绘制轮廓数列
Zvision.ZV_CONTLIST(form.g_Handle, show_img, tsmodconlist2, 0, 255, 0, 1);
Zvision.ZV_TEXT(form.g_Handle, show_img, i.ToString(), rst_value[1], rst_value[2], 40, 255, 0, 0);
}
}
}
else
{
//显示匹配结果
string RstWorldStr;
RstWorldStr = "NG";
Zvision.ZV_TEXT(form.g_Handle, show_img, RstWorldStr, 20, 120, 100, 0, 255, 0);
}
//清空缓冲区显示图片
Zvision.ZV_LATCHCLEAR(form.g_Handle, 0);
Zvision.ZV_LATCHSETSIZE(form.g_Handle, 0, Convert.ToUInt32(ImgShow1.Width), Convert.ToUInt32(ImgShow1.Height)); //设置锁存通道大小和picgbox控件一样大
ImgShow1.Image = Zvision.ZV_LATCH(form.g_Handle, show_img, 0);//截取图像显示到图像上
return ImgShow1.Image;
}
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
回顾往期内容
开奖啦!参与《运动控制系统应用与实践》赠书活动的粉丝们看这里
送书福利!全自主IDE的《运动控制系统应用与实践》
C#之Delta并联机械手正逆解的建立和手动运动
PCIe EtherCAT实时运动控制卡PCIE464的安装与调试
PCIe EtherCAT实时运动控制卡的DXF图形的CAD导图与多条运动指令的快速加工
EtherCAT运动控制器在UVW对位平台中的应用
EtherCAT运动控制器Delta机械手应用
EtherCAT运动控制器的MATLAB开发
运动控制器/运动控制卡配套ZCAN总线ZIO模块的使用
运动控制卡/运动控制器的ZCAN总线ZMIO310扩展模块使用
EtherCAT运动控制器在ROS上的应用(下)
EtherCAT运动控制器在ROS上的应用(上)
皮带同步跟随:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十四)
自定义电子凸轮曲线的运动:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十三)
连续轨迹加工和速度前瞻:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十二)
PT/PVT运动模式介绍:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十一)
项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)
EtherCAT驱动器回零与控制器回零:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(九)
二维/三维的多轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(八)
单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(七)
硬件位置比较输出和编码器锁存:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(六)
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(五):通过RTSys进行调试与诊断
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(四):板载IO与总线扩展IO的编码器与脉冲配置的应用
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(三):EtherCAT总线CSP,CSV,CST模式切换
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(二):EtherCAT总线初始化
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接
全国产EtherCAT运动控制边缘控制器(六):RtBasic文件下载与连续轨迹加工的Python+Qt开发
全国产EtherCAT运动控制边缘控制器(五):IO配置与回零运动的Python+Qt开发
全国产EtherCAT运动控制边缘控制器(四):轴参数配置与单轴运动PC上位机C++控制
全国产EtherCAT运动控制边缘控制器(三):外设读写与RTSys开发诊断
全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口
全国产EtherCAT运动控制边缘控制器(一):ZMC432H硬件接口
简单易用的以太网数据采集卡应用开发之C#
高柔SS加减速曲线在锂电池焊接中的应用
EtherCAT和Ethernet的不同点有哪些, 通信周期又是什么意思?
工业以太网时代,该如何选择总线运动控制器?
正运动技术运动控制器如何快速实现单轴/多轴同步跟随功能?
EtherCAT运动控制器Delta机械手应用
EtherCAT运动控制器的MATLAB开发
EtherCAT运动控制器在数控加工手轮随动中的应用
EtherCAT运动控制器在数控加工手轮随动中的应用之C++
EtherCAT运动控制器在LabVIEW中的运动控制与实时数据采集
运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出
运动控制器PSO视觉飞拍与精准输出的C++开发(一):单轴PSO
运动控制器八通道PSO的视觉飞拍与精准输出
Windows实时运动控制软核(七):LOCAL高速接口测试之Labview
Windows实时运动控制软核(六):LOCAL高速接口测试之Matlab
Windows实时运动控制软核(五):LOCAL高速接口测试之VC6.0
Windows实时运动控制软核(四):LOCAL高速接口测试之VB.NET
Windows实时运动控制软核(三):LOCAL高速接口测试之C++
Windows实时运动控制软核(二):LOCAL高速接口测试之Qt
Windows实时运动控制软核(一):LOCAL高速接口测试之C#
开放式激光振镜运动控制器:C++ 快速调用图形库应用
开放式激光振镜运动控制器:C++振镜矫正方法与实现
开放式激光振镜运动控制器:C++快速开发
开放式激光振镜运动控制器(五):ZMC408SCAN 光纤激光器的能量控制
开放式激光振镜运动控制器(四):ZMC408SCAN振镜控制光纤激光器加工
开放式激光振镜运动控制器(三):ZMC408SCAN轴控光纤激光器加工
开放式激光振镜运动控制器(二):ZMC408SCAN激光接口与控制
开放式激光振镜运动控制器(一):ZMC408SCAN接口与功能
运动控制器PSO位置同步输出(三):高精度等间距二维三维PSO输出
运动控制器PSO位置同步输出(一):硬件平台与PSO指令简介
经济型EtherCAT运动控制器(四):ModbusRTU或ModbusTcp与触摸屏通讯
经济型EtherCAT运动控制器(三):PLC实现多轴直线插补与电子凸轮
经济型EtherCAT运动控制器(二):ZBasic实现多轴直线插补运动
运动控制+机器视觉Demo软件框架(三):视觉纠偏+连续插补的配方编辑
运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配
开放式激光振镜+运动控制器(五):ZMC408SCAN控制器硬件介绍
开放式激光振镜+运动控制器(四):PSO位置同步输出在激光振镜加工中的应用
快速入门 | 篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介
快速入门 | 篇十六:正运动控制器EtherCAT总线快速入门
快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令
快速入门 | 篇十三:正运动技术运动控制器ZDevelop 编程软件的使用
快速入门 | 篇八:如何进行运动控制器EtherCAT总线的基础使用?
快速入门 | 篇七:如何进行运动控制器ZCAN总线扩展模块的使用?
快速入门 | 篇五:如何进行运动控制器输入/输出IO的应用?
快速入门 | 篇二:如何进行运动控制器ZBasic程序开发?
EtherCAT与RTEX驱动器轴回零的配置与实现
EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续
EtherCAT运动控制卡开发教程之Qt(上):开发环境配置与简单运动控制应用
EtherCAT运动控制卡的PWM与模拟量输出和运动速度同步
EtherCAT运动控制卡的硬件接线与C#的硬件外设读写与回零运动
简单易用的运动控制卡(十四):PWM、模拟量输出与运动控制的同步
简单易用的运动控制卡(六):Basic文件下载和连续轨迹加工
EtherCAT运动控制卡和LabVIEW构建智能装备(五)
EtherCAT运动控制卡和LabVIEW构建智能装备(四)
EtherCAT运动控制卡和LabVIEW构建智能装备(三)
EtherCAT运动控制卡和LabVIEW构建智能装备(二)
EtherCAT运动控制卡和LabVIEW构建智能装备(一)
关于正运动技术
深圳市正运动技术有限公司成立于2013年,专注于纯国产运动控制技术研究和通用运动控制软硬件平台和产品的研发,是国家级高新技术和专精特新“小巨人”企业。
正运动技术汇集了来自华为、中兴等公司的优秀人才。力求创新,目前公司拥有专利、著作权等知识产权五十余项。在坚持自主创新的同时,积极联合各大高校和科研院所协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。
正运动技术除本部研发中心外,设有中山、武汉、上海三个研发分部。为更好地服务客户,本部之外设有苏州、东莞两个区域性服务中心,设有佛山、厦门、青岛、西安、武汉、成都、天津、郑州等销售和技术服务机构。
经过众多合作伙伴多年的开发应用,正运动技术的产品广泛地应用于3C电子、半导体、新能源、机器人、包装印刷、纺织服装、激光加工、医疗制药、数控机床、传统加工等领域。