运动控制点胶系统源码_点胶机轨迹编程

hacker|
116

文章目录:

运动控制系统集成与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。我们现在就用了他家的点胶系统做喇叭点胶∞

5条大神的评论

  • avatar
    访客 2022-07-17 上午 08:32:13

    {if(cnt8){cnt=0;}else{cnt++;}string[cnt][0]=time1[0]*10+time1[1];string[cnt][1]=time1[2]*1

  • avatar
    访客 2022-07-17 下午 12:37:28

    ne3[i-4],1);}}writelcd(0x98,0);for(i=0;i16;i++){if(i7i12){writelcd(line44[i-8],1);}else {writelcd(line4[i-4]

  • avatar
    访客 2022-07-17 下午 12:22:33

    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;

  • avatar
    访客 2022-07-17 下午 04:06:43

    PLC系统集成有什么差别?深圳正运动技术的多轴脉冲、EtherCAT总线运动控制器ZMC432系列、XPLC系列,4-8轴网络zhi型运动控制卡daoECI2418和ECI2828系列支持

  • avatar
    访客 2022-07-17 上午 11:53:03

    ;}else{scl=0;sid=0;scl=1;}}delay(100);}void initiallcd(void)//液晶初始化{writelcd(0x30,0); //基本指令集writelcd(

发表评论