文章目录:
运动控制系统集成与PLC系统集成有什么差别?
深圳正运动技术的多轴脉冲、EtherCAT总线运动控制器ZMC432系列、XPLC系列,4-8轴网络zhi型运动控制卡daoECI2418和ECI2828系列
支持Basic,PLC梯形图,HMI组态三种编程环境,易于仿真,调试与诊断,支持电子凸轮,直线,圆弧,小线段前瞻,多种机械手算法等复杂的运动轨迹控制,
同时支持C#,C++,LabVIEW, VB,.NET,python等多种PC上位机软件开发,广泛应用于3C电子、视觉点胶、半导体、激光加工、木工加工、绕线、印刷包装、机械人delta/SCARA/码垛/五轴加工等行业领域。
还有他们家的EtherCAT IO模块也蛮好用的,具体资料可以上官网找到。
求悬挂运动控制器系统程序
主程序清单
/*************************************/
/******主控程序*****/
/**功能*****/
/*切换子程序,调整坐标,显示实时坐标和目标坐标,计时*/
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
long time,t0;//秒钟计时参数
uchar lcdc=0x0f,place=0x94;//液晶控制字和光标闪烁地址
bit enter=0,cancle=0,l=1,set=1;//输入,取消,液晶刷新,设置
uint stat=0;//状态指示
uint time1[4]={0,0,0,0};//目标坐标
uint bitcount=0;
uint xc=0,yc=0,xt,yt,xs,ys;//当前坐标,中间坐标,最终坐标
uchar llt,lrt;//当前左右绳长,需改变长,最终长
bit ok=1;//指示下位机运行成功
uint bittemp;//在作图,画圆状态下的取位变量
uint x0,y0;//圆心
uint cnt;//作图和画圆时设定点的变量
uint ccnt;//作图时候坐标显示
uchar begin[2]={0,0};
uchar string[10][2];
bit xungui=0;
sbit sa=P0^2;//上
sbit sb=P0^3;//右
sbit sc=P0^1;//下
sbit sd=P0^0;//左,寻轨时的4个传感器
/*********液晶显示*********/
sbit scl=P0^7;//液晶显示时钟线
sbit sid=P0^6;//数据线
sbit cs=P0^5;//使能端
uchar code line1[12]={"画笔: , "};//第一行显示数据
uchar code line2[11]={"坐标: , "};//第二行
uchar code line3[12]={"时间: .秒 "};
uchar code line4[12]={"状态: "};
uchar code yuan[141][2]={{ 0, 25},{ 0, 24},{ 0, 23},{ 0, 22},{ 0, 21},{ 1, 20},{ 1, 19},{ 1, 18},{ 1, 17},{ 2, 16},
{ 2, 15},{ 3, 14},{ 3, 13},{ 4, 12},{ 4, 11},{ 5, 10},{ 6, 9},{ 7, 8},{ 8, 7},{ 9, 6},
{10, 5},{11, 4},{12, 4},{13, 4},{14, 3},{15, 2},{16, 2},{17, 2},{18, 1},{19, 1},
{20, 1},{21, 0},{22, 0},{23, 0},{24, 0},
{25, 0},{26, 0},{27, 0},{28, 0},{29, 0},{30, 0},{31, 1},{32, 1},{33, 1},{34, 2},
{35, 2},{36, 3},{37, 3},{38, 4},{39, 4},{40, 5},{41, 6},{42, 7},{43, 8},{44, 9},
{45, 10},{46, 11},{46, 12},{47, 13},{47, 14},{48, 15},{48, 16},{49, 17},{49, 18},{49, 19},
{49, 20},{50, 21},{50, 22},{50, 23},{50, 24},
{50, 25},{50, 26},{50, 27},{50, 28},{50, 29},{50, 30},{49, 31},{49, 32},{49, 33},{48, 34},
{48, 35},{48, 36},{47, 37},{46, 38},{46, 39},{45, 40},{44, 41},{43, 42},{42, 43},{41, 44},
{40, 45},{39, 46},{38, 46},{37, 47},{36, 47},{35, 48},{34, 48},{33, 49},{32, 49},{31, 49},
{30, 49},{29, 50},{28, 50},{27, 50},{26, 50},
{25, 50},{24, 50},{23, 50},{22, 50},{21, 50},{20, 50},{19, 49},{18, 49},{17, 49},{16, 48},
{15, 48},{14, 47},{13, 47},{12, 46},{11, 46},{10, 45},{ 9, 44},{ 8, 43},{ 7, 42},{ 6, 41},
{ 5, 40},{ 4, 39},{ 4, 38},{ 3, 37},{ 3, 36},{ 2, 35},{ 2, 34},{ 1, 33},{ 1, 32},{ 1, 31},
{ 1, 30},{ 0, 29},{ 0, 28},{ 0, 27},{ 0, 26},{ 0, 25}};
uchar line44[4]={"坐标"};
void sendcom();
void delay(uint v)//延时程序
{
while(v!=0)
v--;
}
void writelcd(uchar date,bit k)//液晶写数据
{uchar temp;
uint i=0;
temp=date;
for(i=0;i5;i++)
{
scl=0;
sid=1;
scl=1;
}
scl=0;
sid=0;
scl=1;
scl=0;
sid=k;
scl=1;
scl=0;
sid=0;
scl=1;
for(i=0;i16;i++)
{
if(i=8i12))
{
scl=0;
temp=temp1;
sid=CY;
scl=1;
}
else
{
scl=0;
sid=0;
scl=1;
}
}
delay(100);
}
void initiallcd(void)//液晶初始化
{
writelcd(0x30,0); //基本指令集
writelcd(0x06,0); //光标右移
writelcd(lcdc,0);//显示控制
}
void lcddriver(void)//显示
{
uint i=0;
initiallcd();
writelcd(0x80,0);
for(i=0;i16;i++)
{
if(i9i12)
{writelcd(line1[i-2],1);}
else if(i==12)
{writelcd((yc/10+0x30),1);}
else if(i==13)
{writelcd((yc%10+0x30),1);}
else
{writelcd(line1[i-4],1);}
}
writelcd(0x90,0);
for(i=0;i16;i++)
{
if(i9i12)
{writelcd(line2[i-3],1);}
else if(i==12||i==13)
{writelcd(time1[i-10]+0x30,1);}
else
{writelcd(line2[i-5],1);}
}
writelcd(0x88,0);
for(i=0;i16;i++)
{
if(i7)
{writelcd(line3[i],1);}
else if(i==7)
{writelcd((time/1000+0x30),1);}
else if(i==8)
{writelcd((time%1000/100+0x30),1);}
else if(i==9)
{writelcd((time%100/10+0x30),1);}
else if(i==10)
{writelcd(line3[7],1);}
else if(i==11)
{writelcd((time%10+0x30),1);}
else
{writelcd(line3[i-4],1);}
}
writelcd(0x98,0);
for(i=0;i16;i++)
{
if(i7i12)
{writelcd(line44[i-8],1);}
else
{writelcd(line4[i-4],1);}
}
writelcd(place,0);
l=0;
}
/***************键盘读取及参数设定***********/
sbit key1=P2^0;//扫描矩阵键盘的四行
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
bit keyon,keyoff,key0on,key1on,key2on,key3on,key4on,key5on,
key6on,key7on,key8on,key9on,keyAon,keyBon,av;//各个按键和其他的防连击的位
uchar buffer;//按键值0~9
void readkey(void)//读键
{keyon=0;//键按下标志
P2=0xef;//对键进行扫描
if(key1==0){key0on=1;keyon=1;keyoff=1;l=1;}//0
if(key2==0){key8on=1;keyon=1;keyoff=1;l=1;}//8
if(key3==0){key4on=1;keyon=1;keyoff=1;l=1;}//4
if(key4==0){stat=0;l=1;set=1;cnt=0;bittemp=0;ccnt=0;}//写坐标
P2=0xdf;
if(key1==0){key1on=1;keyon=1;keyoff=1;l=1;}//1
if(key2==0){key9on=1;keyon=1;keyoff=1;l=1;}//9
if(key3==0){key5on=1;keyon=1;keyoff=1;l=1;}//5
if(key4==0){stat=1;l=1;set=1,cnt=0;bittemp=0;ccnt=0;}//作图
P2=0xbf;
if(key1==0){key2on=1;keyon=1;keyoff=1;l=1;}//2
if(key2==0){keyAon=1;keyon=1;keyoff=1;l=1;bittemp=0;ccnt=0;}//确认
if(key3==0){key6on=1;keyon=1;keyoff=1;l=1;}//6
if(key4==0){stat=2;l=1;set=1,cnt=100;bittemp=0;time1[0]=x0/10;time1[1]=x0%10;
time1[2]=y0/10;time1[3]=y0%10;ccnt=0;}//画圆
P2=0x7f;
if(key1==0){key3on=1;keyon=1;keyoff=1;l=1;}//3
if(key2==0){keyBon=1;keyon=1;keyoff=1;l=1;}//取消
if(key3==0){key7on=1;keyon=1;keyoff=1;l=1;}//7
if(key4==0){stat=3;l=1;ccnt=0;}//寻轨
}
void keyprocess(void)//防连击和对键赋值,还有使键有效
{
readkey();
while(keyoff)
{readkey();
if(keyon==0)
{if(key0on==1){buffer=0;key0on=0;av=1;}
if(key1on==1){buffer=1;key1on=0;av=1;}
if(key2on==1){buffer=2;key2on=0;av=1;}
if(key3on==1){buffer=3;key3on=0;av=1;}
if(key4on==1){buffer=4;key4on=0;av=1;}
if(key5on==1){buffer=5;key5on=0;av=1;}
if(key6on==1){buffer=6;key6on=0;av=1;}
if(key7on==1){buffer=7;key7on=0;av=1;}
if(key8on==1){buffer=8;key8on=0;av=1;}
if(key9on==1){buffer=9;key9on=0;av=1;}
if(keyAon==1){enter=1;keyAon=0;}
if(keyBon==1){cancle=1;keyBon=0;}
keyoff=0;
}
}
}
/**************************************************************/
void state(void)//状态
{
switch(stat)
{case 0 : line44[0]=0xd7;
line44[1]=0xf8;
line44[2]=0xb1;
line44[3]=0xea;
keyprocess();//写坐标状态
if(bitcount=4)
{
bitcount=0;
}
av=0;
l=1;
}
}
else
{
av=0;
xs=time1[0]*10+time1[1];
ys=time1[2]*10+time1[3];
}
if(enter)
{
set=~set;
if(set)
{
lcdc=0x0f;
TR0=0;
time=0;
l=1;
}
else
{
lcdc=0x0c;
TR0=1;
}
enter=0;
}
break;
case 1 : line44[0]=0xd7;
line44[1]=0xf7;
line44[2]=0xcd;
line44[3]=0xbc;
keyprocess();//作图状态
if(bitcount=4)
{
bitcount=0;
}
av=0;
l=1;
}
if(cancle)
{
if(cnt8)
{cnt=0;}
else
{
cnt++;
}
string[cnt][0]=time1[0]*10+time1[1];
string[cnt][1]=time1[2]*10+time1[3];
cancle=0;
}
ccnt=cnt;
}
else
{ccnt=bittemp;
av=0;
xs=string[bittemp][0];
ys=string[bittemp][1];
time1[0]=xs/10;
time1[1]=xs%10;
time1[2]=ys/10;
time1[3]=ys%10;
}
if(enter)
{
set=~set;
bitcount=0;
if(set)
{
lcdc=0x0f;
TR0=0;
time=0;
l=1;
}
else
{
lcdc=0x0c;
TR0=1;
}
enter=0;
}
break;
case 2 : line44[0]=0xbb;
line44[1]=0xad;
line44[2]=0xd4;
line44[3]=0xb2;
keyprocess();//画圆状态
if(bitcount=4)
{
bitcount=0;
}
av=0;
l=1;
}
}
else
{
av=0;
x0=time1[0]*10+time1[1];
y0=time1[2]*10+time1[3];
if(x055||x075||y025)
{enter=1;TR0=0;}
xs=yuan[bittemp][0]+x0-25;
ys=yuan[bittemp][1]+y0-25;
}
if(enter)
{
set=~set;
bitcount=0;
if(set)
{
lcdc=0x0f;
TR0=0;
time=0;
l=1;
}
else
{
lcdc=0x0c;
TR0=1;
}
enter=0;
}
break;
case 3 : line44[0]=0xd1;
line44[1]=0xb0;
line44[2]=0xb9;
line44[3]=0xec;
keyprocess();//寻轨状态
if(bitcount=4)
{
bitcount=0;
}
av=0;
l=1;
}
}
else
{
av=0;
begin[0]=time1[0]*10+time1[1];
begin[1]=time1[2]*10+time1[3];
}
if(enter)
{
set=~set;
if(set)
{
lcdc=0x0f;
TR0=0;
time=0;
l=1;
}
else
{
lcdc=0x0c;
TR0=1;
xs=begin[0];
ys=begin[1];
xungui=1;
}
enter=0;
}
break;
default : break;
}
}
void comero(void)//坐标处理
{
if(xcxs)//对X坐标进行处理
{
xt=xc-1;
}
else if(xcys)//对Y坐标进行处理
{
yt=yc-1;
}
else if(yc0)
yt=yc-1;}
if(sa==0sb==0sc==0sd==1)
{if(xc0)
xt=xc-1;}
if(sa==1sb==1sc==0sd==1)
{if(xc0)
xt=xc-1;
yt=yc+1;}
if(sa==0sb==1sc==1sd==0)
{if(xc0)
xt=xc-1;
if(yc0)
yt=yc-1;}
if(sa==0sb==0sc==1sd==1)
{if(yc0)
yt=yc-1;
xt=xc+1;}
if(sa==1sb==0sc==0sd==1)
{xt=xc+1;
yt=yc+1;}
if(sa==0sb==1sc==1sd==1)
{xt=xc+1;}
if(sa==1sb==1sc==1sd==0)
{yt=yc+1;}
if(sa==1sb==1sc==0sd==1)
{if(xc0)
xt=xc-1;}
if(sa==1sb==0sc==1sd==1)
{if(yc0)
yt=yc-1;}
if(sa==1sb==1sc==1sd==1)
{xt=xc+1;
yt=yc+1;}
if(sa==0sb==0sc==0sd==0)
{TR0=0;}
roledeal();
if(ok)
{
xc=xt;
yc=yt;
sendcom();
ok=0;
}
}
}
else//其他状态
{
if(xc==xsyc==ys)
{
if(stat==1)
{
if(bittemp==9)
{
bittemp=0;
TR0=0;
enter=1;
}
else
{bittemp++;}
ccnt=bittemp;
}
else if(stat==2)
{
if(bittemp=140)
{
bittemp=0;
TR0=0;
enter=1;
}
else
{bittemp++;}
}
else if(stat==0)
{TR0=0;
}
}
comero();
roledeal();
if(ok)
{
xc=xt;
yc=yt;
sendcom();
ok=0;
}
}
}
main()
{
delay(100);
TMOD=0x21;//开启定时器
TH1=0xFD;
TL1=0xFD;
TR1=1;
SCON=0x50;
EA=1;//打开总中断
ES=1;
ET0=1;//打开T0
TR0=0;
while(1)
{state();
if(!set)
{process();}
if(l)
lcddriver();}
}
t0count () interrupt 1 using 1//计时功能
{
TH0=0xfc;
TL0=0x70;
t0=t0+1;
if(t0==100)
{
time++;
l=1;
if(time=10000)
{
time=0;
}
t0=0;
}
}
serial () interrupt 4 using 1//接受下位机到位信号
{
if(1==RI)
{
RI=0;
if(0x60==SBUF)
{ok=1;
l=1;
}
}
2 从机程序清单
/*******************************************/
/*****从机程序***********/
/*****功能*****/
/*从主机接受两绳长数值,对绳长进行调整,使画笔到指定坐标*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit a1=P0^0;
sbit a2=P0^1;
sbit a3=P0^2;
sbit a4=P0^3;//一号电机的驱动口
sbit b1=P0^4;
sbit b2=P0^5;
sbit b3=P0^6;
sbit b4=P0^7;//二号电机驱动口
uint djmc1,djmc2;//电机运转脉冲
bit record;//数据接受标志
uchar temp[2]={0x73,0x95};//左右目标线长
uchar temp1[2]={0x73,0x95};//左右目前线长
bit cnt=0;
bit w1=1,w2=1;//左右电机正反转标志位
bit run1=0,run2=0;//左右电机运行标志
long dis1=0,dis2=0;//需要改变的线长
long t0;//定时器参数
long int cnt1,cnt2,cnt11,cnt22;//走线需要左右电机脉冲数
bit send;//
void dj1(void)//一号电机驱动
{if(w1)//正转
{
switch(djmc1)
{
case 0 : a1=1;a2=0;a3=0;a4=1;break;
case 1 : a1=1;a2=0;a3=1;a4=0;break;
case 2 : a1=0;a2=1;a3=1;a4=0;break;
case 3 : a1=0;a2=1;a3=0;a4=1;break;
default : djmc1=0;break;
}
}
else//反转
{
switch(djmc1)
{
case 0 : a1=0;a2=1;a3=0;a4=1;break;
case 1 : a1=0;a2=1;a3=1;a4=0;break;
case 2 : a1=1;a2=0;a3=1;a4=0;break;
case 3 : a1=1;a2=0;a3=0;a4=1;break;
default : djmc1=0;break;
}
}
}
void dj2(void)
{if(w2)
{
switch(djmc2)
{
case 0 : b1=0;b2=1;b3=0;b4=1;break;
case 1 : b1=1;b2=0;b3=0;b4=1;break;
case 2 : b1=1;b2=0;b3=1;b4=0;break;
case 3 : b1=0;b2=1;b3=1;b4=0;break;
default : djmc2=0;break;
}
}
else
{
switch(djmc2)
{
case 0 : b1=0;b2=1;b3=1;b4=0;break;
case 1 : b1=1;b2=0;b3=1;b4=0;break;
case 2 : b1=1;b2=0;b3=0;b4=1;break;
case 3 : b1=0;b2=1;b3=0;b4=1;break;
default : djmc2=0;break;
}
}
}
main()
{TMOD=0x21;//开启定时器
TH0=0xfc;//给初值
TL0=0x62;
TH1=0xFD;
TL1=0xFD;
TR1=1;
SCON=0x50;
PCON=0x00;
EA=1;//打开总中断
ES=1;
ET0=1;//打开T0
TR0=1;
while(1)
{
dj1();
dj2();
if(send==1run1==0run2==0)
{
temp1[1]=temp[1];
temp1[0]=temp[0];
SBUF = 0x60;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
send=0;
}
}
}
serial () interrupt 4 using 1//串口中断,接收从主机发过来的绳长值
{
if(1==RI)
{
RI=0;
if(0xFF==SBUF)//地址判断,为减少误差
{
record=1;
cnt=0;
}
else if(1==record)
{
temp[cnt]=SBUF;
if(cnt)
{run1=1;
run2=1;
send=1;
record=0;
cnt=0;
if(temp[1]temp1[1])//给右线长度
{
dis2=temp[1]-temp1[1];
w2=1;
}
else
{
dis2=temp1[1]-temp[1];
w2=0;
}
cnt22=(dis2*9730)/928;
cnt2=0;
}
else
{if(temp[0]temp1[0])//给左线长度
{
dis1=temp[0]-temp1[0];
w1=1;
}
else
{
dis1=temp1[0]-temp[0];
w1=0;
}
cnt11=(dis1*9730)/928;
cnt1=0;
cnt=1;
}} }}
t0count () interrupt 1 using 1//电机脉冲产生定时器
{
TH0=0xfc;
TL0=0x66;
t0++;
if(t0==50)
{t0=0;
if(run1)
{
if(cnt1=cnt11)
{run1=0;}
else
{cnt1++;
if(3==djmc1)
{
djmc1=0;
}
else
{
djmc1=djmc1+1;
}}}
if(run2)
{
if(cnt2=cnt22)
{run2=0;}
else
{cnt2++;
if(3==djmc2)
{
djmc2=0;
}
else
{
djmc2=djmc2+1;
}}}}}
点胶机安装视觉运动控制系统有什么好处
1、同样产能下,相比传统手工点胶,可大量节约人力成本8~10人
2、 操作简单,产品随意摆放,视觉可自动识别,生产效率和质量翻涨,点胶效率为传统点胶的8~10倍;
3、有效控制点胶量,将误差值控制在1/2点;
4、运行精度高,重复精度达0.01mm;
5、封闭空间内点胶,减少有毒物质对人体的损害。
6、视觉的优势是电脑编程,相机360度自动扫描定位,不需要模具,操作简单。
7、 精准、快速及稳定的点胶品质。
8、可实现产品的点胶全自动化,解决了当前工厂所面临的招工难、用工荒的问题;并且解决了员工的上岗培训周期长的问题。
运动控制系统有没有哪家企业做的比较好啊?
个人觉得正运动技术他们家做的运动控制系统做的不错,像点胶系统、螺丝锁付系统都OK。我们现在就用了他家的点胶系统做喇叭点胶∞
{if(cnt8){cnt=0;}else{cnt++;}string[cnt][0]=time1[0]*10+time1[1];string[cnt][1]=time1[2]*1
ne3[i-4],1);}}writelcd(0x98,0);for(i=0;i16;i++){if(i7i12){writelcd(line44[i-8],1);}else {writelcd(line4[i-4]
44[0]=0xbb;line44[1]=0xad;line44[2]=0xd4;line44[3]=0xb2;keyprocess();//画圆状态if(bitcount=4){bitcount=0;}av=0;l=1;}}else{av=0;
PLC系统集成有什么差别?深圳正运动技术的多轴脉冲、EtherCAT总线运动控制器ZMC432系列、XPLC系列,4-8轴网络zhi型运动控制卡daoECI2418和ECI2828系列支持
;}else{scl=0;sid=0;scl=1;}}delay(100);}void initiallcd(void)//液晶初始化{writelcd(0x30,0); //基本指令集writelcd(