工控算法
Ⅰ 机器人控制算法如何编写
基于DSP运动控制器的5R工业机器人系统设计 摘要:以所设计的开放式5R关节型工业机器人为研究对象,分析了该机器人的结构设计。该机器人采 用基于工控PC及DSP运动控制器的分布式控制结构,具有开放性强、运算速度快等特点,对其工作原理 进行了详细的说明。机器人的控制软件采用基于Windows平台下的VC++实现,具有良好的人机交互 功能,对各组成模块的作用进行了说明。所设计的开放式5R工业机器人系统,具有较好的实用性。 关键词:开放式;关节型;工业机器人;控制软件 0引言 工业机器人技术在现代工业生产自动化领域得到 了广泛的应用,也对工程技术人员提出更高的要求,作 为机械工程及自动化专业的技术人才迫切需要掌握这 一 先进技术。为了能更好地加强技术人员对工业机器 人的技能实践与技术掌握,需要开放性强的设备来满 足要求。本文阐述了我们所开发设计的一种5R关节 型工业机器人系统,可以作为通用的工业机器人应用 于现场,也可作为教学培训设备。 1 5R工业机器人操作机结构设计 关节型工业机器人由2个肩关节和1个肘关节进 行定位,由2个或3个腕关节进行定向,其中一个肩关节 绕铅直轴旋转,另一个肩关节实现俯仰,这两个肩关节 轴线正交。肘关节平行于第二个肩关节轴线。这种构 型的机器人动作灵活、工作空间大,在作业空间内手臂 的干涉最小,结构紧凑,占地面积小,关节上相对运动部 位容易密封防尘,但运动学复杂、运动学反解困难,控制 时计算量大。在工业用应用是一种通用型机器人¨。 1.1 5R工业机器人操作机结构 所设计的5R关节型机器人具有5个自由度,结构 简图如图1所示。5个自由度分别是:肩部旋转关节 J1、大臂旋转关节J2、小臂旋转关节J3、手腕仰俯运动 关节J4和在旋转运动关节J5。总体设计思想为:选用 伺服电机(带制动器)驱动,通过同步带、轮系等机械机 构进行间接传动。腕关节上设计有装配手爪用法兰, 通过不断地更换手爪来实现不同的作业任务。 1.2 5R工业机器人参数 表1为设计的5R工业机器人参数。 2 5R工业机器人开放式控制系统 机器人控制技术对其性能的优良起着重大的作用。随着机器人控制技术的发展,针对结构封闭的机 器人控制器的缺陷,开发“具有开发性结构的模块化、 标准化机器人控制器”是当前机器人控制器发展的趋 势]。为提高稳定性、可靠性和抗干扰性,采用“工业 PC+DSP运动控制器”的结构来实现机器人的控制:伺 服系统中伺服级计算机采用以信号处理器(DSP)为核 心的多轴运动控制器,借助DSP高速信号处理能力与 运算能力,可同时控制多轴运动,实现复杂的控制算法 并获得优良的伺服性能。 2.1基于DSP的运动控制器MCT8000F8简介 深圳摩信科技公司MCT8000F8运动控制器是基 于网络技术的开放式结构高性能DSP8轴运动控制器, 包括主控制板、接口板以及控制软件等,具有开放式、 高速、高精度、网际在线控制、多轴同步控制、可重构 性、高集成度、高可靠性和安全性等特点,是新一代开 放式结构高性能可编程运动控制器。 图2为DSP多轴运动控制器硬件原理图。图中增 量编码器的A0(/A0)、B0(/B0)、c0(/CO)信号作为 位置反馈,运动控制器通过四倍频、加减计数器得到实 际的位置,实际位置信息存在位置寄存器中,计算机可 以通过控制寄存器进行读取。运动控制卡的目标位置 由计算机通过机器人运动轨迹规划求得,通过内部计 算得到位置误差值,再经过加减速控制和数字滤波后, 送到D/A转换(DAC)、运算放大器、脉宽调制器 (PWM)硬件处理电路,转化后输出伺服电机的控制信 号或PWM信号。各个关节可以完成独立伺服控制,能 够实现线性插补控制、二轴圆弧插补控制。 2.2机器人控制系统结构及工作原理 基于PC的Windows操作系统,因其友好的人机界 面和广泛的用户基础,而成为基于PC控制器的首选。 采用PC作为机器人控制器的主机系统的优点是:①成 本低;②具有开放性;③完备的软件开发环境和丰富的 软件资源;④良好的通讯功能。机器人控制结构上采 用了上、下两级计算机系统完成对机器人的控制:上级 主控计算机负责整个系统管理,下级则实现对各个关 节的插补运算和伺服控制。这里通过采用一台工业 PC+DSP运动控制卡的结构来实现机器人控制。实验 结果证明了采用Pc+DSP的计算结构可以充分利用 DSP运算的高速性,满足机器人控制的实时需求,实现 较高的运动控制性能。 机器人伺服系统框图如图3所示。伺服系统由基 于DSP的运动控制器、伺服驱动器、伺服电动机及光电 编码器组成。伺服系统包含三个反馈子系统:位置环、 速度环、电流环,其工作原理如下:执行元件为交流伺 服电动机,伺服驱动器为速度、电流闭环的功率驱动元 件,光电编码器担负着检测伺服电机速度和位置的任 务。伺服级计算机的主要功能是接受控制级发出的各 种运动控制命令,根据位置给定信号及光电编码器的 位置反馈信号,分时完成各关节的误差计算、控制算法 及D/A转换、将速度给定信号加至伺服组件的控制端 子,完成对各关节的位置伺服控制。管理级计算机采用 586工控机(或便携笔记本),主要完成离线编程、仿真、 与控制级通讯、作业管理等功能;控制级计算机采用586 工控机,主要完成用户程序编辑、用户程序解释,向下位 机运动控制器发机器人运动指令、实时监控、输入输出 控制(如打印)等。示教盒通过控制级计算机可以获得 机器人伺服系统中的数据(脉冲、转角),并用于控制级 计算机控制软件中实现对机器人的示教及控制。 3 5R工业机器人运动控制软件设计 5R工业机器人控制软件采用C++Builder编程, 最终软件运行在Windows环境下。C++Builder对在 Windows平台下开发应用程序时所涉及到的图形用户 界面(GUI)编程具有很强的支持能力,提供了可视化 的开发环境,可以方便调用硬件厂商提供的底层函数, 直接对硬件进行操作,而且生成目标代码效率高。 所设计的控制软件为分级式模块化结构。 管理级主模块具有离线编程、图形仿真、资料查询 及故障诊断等功能,其结构如图4所示。 (1)离线编程模块利用计算机图形学的成果,建立 机器人及其工作环境的模型,利用规划算法,通过对图 形和对象的操作,编制各种运动控制,在离线情况下生 成工作程序。 (2)图形仿真模块可预先模拟结果,便于检查及优 化。 (3)资料查询模块可以查阅当日工作及近期工作 记录、相关资料(生产数量、班次等),并可以打印输出 存档。 (4)故障诊断模块可以实时故障诊断,以代码形式显 示出故障类型,并为技术人员排除故障提供帮助信息。 控制级主模块软件结构如图5所示。 (1)复位模块使得机器人停机时或动作异常时,通 过特定的操作或自动的方式,使机器人回到作业原点。 机器人在作业原点,机构的各运动副所受力矩最小,它 确定了机器人待机的安全位姿。 (2)系统提供两种示教方法。第一种示教方法即 “下位机+示教盒”的示教方法:示教盒和下位机操作 界面上的手动操作开关分别对应着装配机器人的各种 动作和功能。通过高、中、低速、点动等速度档次的选 择,对机器人进行大致的定位和精确的位置微调。并 存储期望的运动轨迹上机器人的位置、姿态参数。第 二种方法即离线仿真的示教方法。这种示教方法是在 计算机上建立起机器人作业环境的模型,再在这个模 型的基础上生成示教数据的一种应用人工智能的示教 方法。进行示教时使用计算机图示的方法分析机器人与作业模型的位置关系,也可以通过特定指令指定机 器人的运动位置…。 4结束语 所开发的开放式工业机器人系统具有以下特点: (1)采用分布式二级控制结构,运动控制由基于 DSP的运动控制器M'CT8000F8完成,增加了系统的开 放性,以及运行处理的快速性及可靠性。 (2)考虑到具有良好的通用性,可以作为通用机器 人使用,具有较好的产业化、商品化前景。 (3)计算机辅助软件采用基于Windows平台的 c++编程,通过调用底层函数可以对硬件进行直接操 作,可视化环境可提供良好的人机交互操作界面。 通过本机器人系统的研究开发,可极大地满足工 业现场对机器人的开放性要求,进一步提高我国工矿 企业自动化水平。同时,也可作为机器人技术训练平 台,加强工程人员能力锻炼。 [参考文献] [1]马香峰,等.工业机器人的操作机设计[M].北京:冶金工 业出版社,1996. [2]吴振彪.工业机器人[M].武汉:华中理工大学出版社, 2006. [3]蔡自兴.机器人学[M].北京:清华大学出版社,2003. [4]王天然,曲道奎.工业机器人控制系统的开放体系结构 [J].机器人,2002,24(3):256—261. [5]深圳摩信科技有限公司.MCT8000系列控制器使用手册 [z].深圳:深圳摩信科技有限公司,2001. [6]张兴国.环保压缩机装配机器人的运动学分析[J].南通 工学院学报,2004(1):32—34,38. [7]张兴国.计算机辅助环保压缩机装配机器人运动学分析 [J].机械设计与制造,2005(3):98—100, [8]本书编写委员会编着.程序设计VisualC++6[M].北京: 电子工业出版社,2000. [9]吴斌,等.OpenGL编程实例与技巧[M].北京:人民邮电出 版社,1999. [10]江早.OpenGLVC/VB图形编程[M】.北京:中国科学技 术出版社,2001. [11]韩军,等.6R机器人运动学控制实验系统的研制[J].实 验室研究与探索,2003(5):103—104.
Ⅱ 8位单片机PID控制PWM的算法如何实现,C语言计算
PID控制在8位单片机中仍然有广泛的应用,比如温度控制,利用比例、积分、微分补偿来做恒温补偿控制,当然由于有这些数学处理,用C语言相对方便一些,以下是一个具体的实例。
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#include<string.h>
struct PID {
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};
struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)
sbit data1=P1^0;
sbit clk=P1^1;
sbit plus=P2^0;
sbit subs=P2^1;
sbit stop=P2^2;
sbit output=P3^4;
sbit DQ=P3^3;
unsigned char flag,flag_1=0;
unsigned char high_time,low_time,count=0;//占空比调节参数
unsigned char set_temper=35;
unsigned char temper;
unsigned char i;
unsigned char j=0;
unsigned int s;
/***********************************************************
延时子程序,延时时间以12M晶振为准,延时时间为30us×time
***********************************************************/
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************
写一位数据子程序
***********************************************************/
void write_bit(unsigned char bitval)
{
EA=0;
DQ=0; /*拉低DQ以开始一个写时序*/
if(bitval==1)
{
_nop_();
DQ=1; /*如要写1,则将总线置高*/
}
delay(5); /*延时90us供DA18B20采样*/
DQ=1; /*释放DQ总线*/
_nop_();
_nop_();
EA=1;
}
/***********************************************************
写一字节数据子程序
***********************************************************/
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char temp;
EA=0;
TR0=0;
for(i=0;i<8;i++) /*写一字节数据,一次写一位*/
{
temp=val>>i; /*移位操作,将本次要写的位移到最低位*/
temp=temp&1;
write_bit(temp); /*向总线写该位*/
}
delay(7); /*延时120us后*/
// TR0=1;
EA=1;
}
/***********************************************************
读一位数据子程序
***********************************************************/
unsigned char read_bit()
{
unsigned char i,value_bit;
EA=0;
DQ=0; /*拉低DQ,开始读时序*/
_nop_();
_nop_();
DQ=1; /*释放总线*/
for(i=0;i<2;i++){}
value_bit=DQ;
EA=1;
return(value_bit);
}
/***********************************************************
读一字节数据子程序
***********************************************************/
unsigned char read_byte()
{
unsigned char i,value=0;
EA=0;
for(i=0;i<8;i++)
{
if(read_bit()) /*读一字节数据,一个时序中读一次,并作移位处理*/
value|=0x01<<i;
delay(4); /*延时80us以完成此次都时序,之后再读下一数据*/
}
EA=1;
return(value);
}
/***********************************************************
复位子程序
***********************************************************/
unsigned char reset()
{
unsigned char presence;
EA=0;
DQ=0; /*拉低DQ总线开始复位*/
delay(30); /*保持低电平480us*/
DQ=1; /*释放总线*/
delay(3);
presence=DQ; /*获取应答信号*/
delay(28); /*延时以完成整个时序*/
EA=1;
return(presence); /*返回应答信号,有芯片应答返回0,无芯片则返回1*/
}
/***********************************************************
获取温度子程序
***********************************************************/
void get_temper()
{
unsigned char i,j;
do
{
i=reset(); /*复位*/
} while(i!=0); /*1为无反馈信号*/
i=0xcc; /*发送设备定位命令*/
write_byte(i);
i=0x44; /*发送开始转换命令*/
write_byte(i);
delay(180); /*延时*/
do
{
i=reset(); /*复位*/
} while(i!=0);
i=0xcc; /*设备定位*/
write_byte(i);
i=0xbe; /*读出缓冲区内容*/
write_byte(i);
j=read_byte();
i=read_byte();
i=(i<<4)&0x7f;
s=(unsigned int)(j&0x0f); //得到小数部分
s=(s*100)/16;
j=j>>4;
temper=i|j; /*获取的温度放在temper中*/
}
/*====================================================================================================
Initialize PID Structure
=====================================================================================================*/
void PIDInit (struct PID *pp)
{
memset ( pp,0,sizeof(struct PID)); //全部初始化为0
}
/*====================================================================================================
PID计算部分
=====================================================================================================*/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
unsigned int dError,Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError); // 微分项
}
/***********************************************************
温度比较处理子程序
***********************************************************/
void compare_temper()
{
unsigned char i;
if(set_temper>temper) //是否设置的温度大于实际温度
{
if(set_temper-temper>1) //设置的温度比实际的温度是否是大于1度
{
high_time=100; //如果是,则全速加热
low_time=0;
}
else //如果是在1度范围内,则运行PID计算
{
for(i=0;i<10;i++)
{
get_temper(); //获取温度
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<=100)
high_time=(unsigned char)(rout/800);
else
high_time=100;
low_time= (100-high_time);
}
}
else if(set_temper<=temper)
{
if(temper-set_temper>0)
{
high_time=0;
low_time=100;
}
else
{
for(i=0;i<10;i++)
{
get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<100)
high_time=(unsigned char)(rout/10000);
else
high_time=0;
low_time= (100-high_time);
}
}
// else
// {}
}
/*****************************************************
T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
******************************************************/
void serve_T0() interrupt 1 using 1
{
if(++count<=(high_time))
output=1;
else if(count<=100)
{
output=0;
}
else
count=0;
TH0=0x2f;
TL0=0xe0;
}
/*****************************************************
串行口中断服务程序,用于上位机通讯
******************************************************/
void serve_sio() interrupt 4 using 2
{
/* EA=0;
RI=0;
i=SBUF;
if(i==2)
{
while(RI==0){}
RI=0;
set_temper=SBUF;
SBUF=0x02;
while(TI==0){}
TI=0;
}
else if(i==3)
{
TI=0;
SBUF=temper;
while(TI==0){}
TI=0;
}
EA=1; */
}
void disp_1(unsigned char disp_num1[6])
{
unsigned char n,a,m;
for(n=0;n<6;n++)
{
// k=disp_num1[n];
for(a=0;a<8;a++)
{
clk=0;
m=(disp_num1[n]&1);
disp_num1[n]=disp_num1[n]>>1;
if(m==1)
data1=1;
else
data1=0;
_nop_();
clk=1;
_nop_();
}
}
}
/*****************************************************
显示子程序
功能:将占空比温度转化为单个字符,显示占空比和测得到的温度
******************************************************/
void display()
{
unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsigned char disp_num[6];
unsigned int k,k1;
k=high_time;
k=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
else
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
k=temper;
k=k%100;
disp_num[3]=number[k/10];
disp_num[4]=number[k%10]+1;
disp_num[5]=number[s/10];
disp_1(disp_num);
}
/***********************************************************
主程序
***********************************************************/
void main()
{
unsigned char z;
unsigned char a,b,flag_2=1,count1=0;
unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2};
TMOD=0x21;
TH0=0x2f;
TL0=0x40;
SCON=0x50;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
PS=1;
EA=1;
EX1=0;
ET0=1;
ES=1;
TR0=1;
TR1=1;
high_time=50;
low_time=50;
PIDInit ( &spid ); // Initialize Structure
spid.Proportion = 10; // Set PID Coefficients 比例常数 Proportional Const
spid.Integral = 8; //积分常数 Integral Const
spid.Derivative =6; //微分常数 Derivative Const
spid.SetPoint = 100; // Set PID Setpoint 设定目标 Desired Value
while(1)
{
if(plus==0)
{
EA=0;
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(plus==0)
{
set_temper++;
flag=0;
}
}
else if(subs==0)
{
for(a=0;a<5;a++)
for(b=0;a<102;b++){}
if(subs==0)
{
set_temper--;
flag=0;
}
}
else if(stop==0)
{
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(stop==0)
{
flag=0;
break;
}
EA=1;
}
get_temper();
b=temper;
if(flag_2==1)
a=b;
if((abs(a-b))>5)
temper=a;
else
temper=b;
a=temper;
flag_2=0;
if(++count1>30)
{
display();
count1=0;
}
compare_temper();
}
TR0=0;
z=1;
while(1)
{
EA=0;
if(stop==0)
{
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(stop==0)
disp_1(phil);
// break;
}
EA=1;
}
}
Ⅲ 控制算法与电机控制的关系
照你这么说算法和控制应该是一样的吧,都是指:运行在计算处理器中的软件程序。这些程序一般由定时器定时触发,每跑一次程序就生成一个新的指令,由处理器输送给电机驱动。比较普遍的处理器周期都是1-10kHz (0.1-1豪秒),并且和电机驱动中的功率电力电子器件的开关频率吻合。
电机驱动是功率器件,把处理器的控制信号(信号级别,通常是占空比或者PWM信号)输入到电力电子器件的门极上。电力电子器件在控制信号的作用下,可以对大电流、高电压的功率级别进行动作。功率电信号用功率电线送到电机里。
算法模型和所有公式都是在单片机、PLC里面运行的。时域算法(PI、PID之类的)可以进行离散化(Z变换)得到离散的控制关系,然后编相应的程序。这个离散化的采样频率就是程序的处理周期(0.1-1毫秒)。总之这些软硬件的东西都是关联的。
至于时域算法如何得到,那需要知道电机的模型和你要控制的是什么。电机驱动一般是电压型输出。所以你最终结果是得到一个电机控制电压。电压信号输出到电机驱动,一般需要一个PWM控制,例如正弦调制SPWM,或者矢量控制SVPWM。在电压基础上,如果想控制电流,那么一个PI就可以(电流控制器),输入是电流反馈,输出是电压。如果想控制转矩,转矩和电流是对应的。所以另外一个模块要加在电流控制器之前,这个模块输入是转矩,输出电流,模块本身不是反馈控制,是比例放大。如果想控制速度,那需要在转矩模块之前再加一个速度模块,输入是速度,输出是转矩,这个模块可以是PI。这些具体的东西不是一两天可以弄懂的,我只是给你大概说一下。
至于硬件电路,一般是我上面说的电机驱动以及它内部的电压、电流、温度检测、电力电子器件、保护措施。
电机上一般也有一个位置传感器,用于反馈控制信号给单片机,这个位置信号在交流电机里是用来做dq变换的,或者叫park变换。这个是交流转化为直流控制的重要步骤。
Ⅳ 谁做过用工控机控制电机,用VC编程的PID算法的例子啊,不胜感激
//数据结构
typedef struct PID
{
int SetPoint; //设定目标 Desired Value
long SumError; //误差累计
double Proportion; //比例常数 Proportional Const
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;
//PID参数初始化
void IncPIDInit(void)
{
sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = 0; //比例常数 Proportional Const
sptr->Integral = 0; //积分常数Integral Const
sptr->Derivative = 0; //微分常数 Derivative Const
sptr->SetPoint = 0;
}
//增量式PID控制设计
int IncPIDCalc(int NextPoint)
{
register int iError, iIncpid;
//当前误差
iError = sptr->SetPoint - NextPoint;
//增量计算
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}
//位置式PID控制设计
unsigned int LocPIDCalc(int NextPoint)
{
register int iError,dError;
iError = sptr->SetPoint - NextPoint; //偏差
sptr->SumError += iError; //积分
dError = iError - sptr->LastError; //微分
sptr->LastError = iError;
return(sptr->Proportion * iError //比例项
+ sptr->Integral * sptr->SumError //积分项
+ sptr->Derivative * dError); //微分项
}
记得给分哦
Ⅳ 工控机中使用VC编程,采用PID控制算法求助
你看你要存储的数据量大不大,很大很多的话可以用sqlserver或oracle,小点的话用access,存一点数据的话可以用XML就可以了
Ⅵ 工控的智能化
众所周知,从20世纪60年代开始,西方国家就依靠技术进步(即新设备、新工艺以及计算机应用)开始对传统工业进行改造,使工业得到飞速发展。20世纪末世界上最大的变化就是全球市场的形成。全球市场导致竞争空前激烈,促使企业必须加快新产品投放市场时间(TimetoMarket)、改善质量(Quality)、降低成本(Cost)以及完善服务体系(Service),这就是企业的T.Q.C.S.。
虽然计算机集成制造系统(CIMS)结合信息集成和系统集成,追求更完善的T.Q.C.S.,使企业实现“在正确的时间,将正确的信息以正确的方式传给正确的人,以便作出正确的决策”,即“五个正确”。然而这种自动化需要投入大量的资金,是一种高投资、高效益同时是高风险的发展模式,很难为大多数中小企业所采用。在我国,中小型企业以及准大型企业走的还是低成本工业控制自动化的道路。 工业控制自动化主要包含三个层次,从下往上依次是基础自动化、过程自动化和管理自动化,其核心是基础自动化和过程自动化。
传统的自动化系统,基础自动化部分基本被PLC和DCS所垄断,过程自动化和管理自动化部分主要是由各种进口的过程计算机或小型机组成,其硬件、系统软件和应用软件的价格之高令众多企业望而却步。
20世纪90年代以来,由于PC-based的工业计算机(简称工业PC)的发展,以工业PC、I/O装置、监控装置、控制网络组成的PC-based的自动化系统得到了迅速普及,成为实现低成本工业自动化的重要途径。我国重庆钢铁公司这样的大企业的几乎全部大型加热炉,也拆除了原来DCS或单回路数字式调节器,而改用工业PC来组成控制系统,并采用模糊控制算法,获得了良好效果。 由于基于PC的控制器被证明可以像PLC一样可*,并且被操作和维护人员接受,所以,一个接一个的制造商至少在部分生产中正在采用PC控制方案。基于PC的控制系统易于安装和使用,有高级的诊断功能,为系统集成商提供了更灵活的选择,从长远角度看,PC控制系统维护成本低。
由于可编程控制器(PLC)受PC控制的威胁最大,所以PLC供应商对PC的应用感到很不安。事实上,可编程控制器(PLC)也加入到了PC控制“浪潮”中。
工业PC在我国得到了异常迅速的发展。从世界范围来看,工业PC主要包含两种类型:IPC工控机和CompactPCI工控机以及它们的变形机,如AT96总线工控机等。由于基础自动化和过程自动化对工业PC的运行稳定性、热插拔和冗余配置要求很高,现有的IPC已经不能完全满足要求,将逐渐退出该领域,取而代之的将是CompactPCI-based工控机,而IPC将占据管理自动化层。国家于2001年设立了“以工业控制计算机为基础的开放式控制系统产业化”工业自动化重大专项,目标就是发展具有自主知识产权的PC-based控制系统,在3(5年内,占领30%(50%的国内市场,并实现产业化。
几年前,当“软PLC”出现时,业界曾认为工业PC将会取代PLC。然而,时至今日工业PC并没有代替PLC,主要有两个原因:一个是系统集成原因;另一个是软件操作系统WindowsNT的原因。一个成功的PC-based控制系统要具备两点:一是所有工作要由一个平台上的软件完成;二是向客户提供所需要的所有东西。可以预见,工业PC与PLC的竞争将主要在高端应用上,其数据复杂且设备集成度高。工业PC不可能与低价的微型PLC竞争,这也是PLC市场增长最快的一部分。从发展趋势看,控制系统的将来很可能存在于工业PC和PLC之间,这些融合的迹象已经出现。
和PLC一样,工业PC市场在过去的两年里保持平稳。与PLC相比,工业PC软件很便宜。据Frost&Sullivan公司估计,全世界每年7亿美元工业PC市场里,大约8500万美元为控制软件,一亿美元为操作系统。到2007年会翻一番,工业PC市场变得非常可观。
Ⅶ cpu利用率怎么计算
方法1:
使用cpu的处理能力基准计算实时cpu占用率
具体描述:
(1)
在rtos系统启动前,
使用tick中断测试cpu的处理能力基准
cpuperformancebase;
(2)
在系统进入运行后,
使用空闲任务执行与测试cpu处理能力基准完全相同的算法,
得到rtcpuperformance.
(3)
周期地计算cpu占用率,
并清除rtcpuperformance的值,
一般每秒钟计算一次:
realtime
cpu
load
=
1
-
(rtcpuperformance/cpuperformancebase)
*
100%
评价:
这个算法只适用于工控,
电信等对不需要使cpu进入掉电保护模式的领域.
方法2:
在tick中断中对rtos中的任务进行采样
具体描述:
(1)
系统进入运行后,
每次tick中断发生时,
采样一下当前正在执行的任务,
如果cpu处于halt态,
累加halttimes
(2)
周期性地计算cpu占用率,
一般每秒钟计算一次,
并清除halttimes:(tickintfrequance表示tick中断的发生频率)
realtime
cpu
load
=
halttimes
/
tickintfrequance
某个任务对cpu占用率的贡献
=
一个周期内该任务被采样到的次数
/
tickintfrequance
*
100%
评价:
这个算法适用于对cpu占用率精度要求不高的消息电子产品.
方法3:
精确计算每个任务对cpu占用率的贡献
具体描述:
(1)
除tick中断外,另开一个比tick中断频率快若干倍的周期中断(就叫auxtimer中断吧),
这个中断只对一个计数器执行一次累加.
(2)
在os每次执行任务切换时读取该计数器的值(auxtimer),
并保存到tcb中,
比如,
从任务task1切换到任务task2,
算法如下:
task1,
换出动作:
task1的结束运行时间
=
auxtimer的当前值
task1的总运行时间
=
task1的总运行时间
+
task1的结束运行时间
-
task1的开始运行时间
task2,
换入动作:
task2的开始运行时间
=
auxtimer的当前值
(以上算法中没有考虑数字回绕,
在工程实现时应当考虑,
发生回绕后任务的结束运行时间小于任务的开始运行时间.
(3)
周期性地计算cpu占用率,
一般每秒钟计算一次,
并清除每个任务的总运行时间,
下面的公式中,
一个周期内的总时间等于auxtimer周期除以tick周期得到的倍数:
某个任务对cpu占用率的贡献
=
一个周期内该任务的总运行时间
/
一个周期内的总时间
realtime
cpu
load
=
所有任务的cpu占用率之和
Ⅷ 控制器设计和控制算法设计有什么区别
基于DSP运动控制器的5R工业机器人系统设计 摘要:以所设计的开放式5R关节型工业机器人为研究对象,分析了该机器人的结构设计。该机器人采 用基于工控PC及DSP运动控制器的分布式控制结构,具有开放性强、运算速度快等特点,对其工作原理 进行了详细的说明。机器人的控制软件采用基于Windows平台下的VC++实现,具有良好的人机交互 功能,对各组成模块的作用进行了说明。所设计的开放式5R工业机器人系统,具有较好的实用性。 关键词:开放式;关节型;工业机器人;控制软件 0引言 工业机器人技术在现代工业生产自动化领域得到 了广泛的应用,也对工程技术人员提出更高的要求,作 为机械工程及自动化专业的技术人才迫切需要掌握这 一 先进技术。为了能更好地加强技术人员对工业机器 人的技能实践与技术掌握,需要开放性强的设备来满 足要求。本文阐述了我们所开发设计的一种5R关节 型工业机器人系统,可以作为通用的工业机器人应用 于现场,也可作为教学培训设备。 1 5R工业机器人操作机结构设计 关节型工业机器人由2个肩关节和1个肘关节进 行定位,由2个或3个腕关节进行定向,其中一个肩关节 绕铅直轴旋转,另一个肩关节实现俯仰,这两个肩关节 轴线正交。肘关节平行于第二个肩关...
Ⅸ PID控制算法的含义是什么数字PID算法和连续PID算法的区别是什么(工业控制,制冷系统,计算机技术)
PID 是闭环控制系统的比例-积分-微分控制算法。
PID 控制器根据设定值(给定)与被控对象的实际值(反馈)的差值,按照 PID 算法
计算出控制器的输出量,控制执行机构去影响被控对象的变化。
PID 控制是负反馈闭环控制,能够抑制系统闭环内的各种因素所引起的扰动,使反馈
跟随给定变化。
根据具体项目的控制要求,在实际应用中有可能用到其中的一部分,比如常用的是 PI
(比例-积分)控制,这时没有微分控制部分。
Ⅹ 工业控制技术包括哪些方面的控制
这个问题主要分两种情况来回答。
1 工业控制技术所应用的领域。
这应该是你最关心的。就是学了这个可以干什么。实际上工业控制应用非常广泛。包括电厂锅炉自动化、汽机自动化、化工厂工艺自动化、铝厂工艺自动化、许多工厂的生产线如果要达到自动效果、提高效率也都是需要工业控制技术。所以我认为在将来工业控制技术的应用会更加广泛。
2 工业控制技术的实现方法
目前主要分为两大类,一类是经典控制技术、 另一类是现代控制技术。
经典控制技术主要指PID控制技术、它的优点是 实现简单、反应快速。有一定的鲁棒性。目前在工业控制应用领域占有垄断性地位。
现代控制技术包含很多种类,包括神经网络控制、模糊控制、自适应控制、等控制算法。但是他们在工业上应用还不够成熟,还需要更深入的研究才可以达到更优更广泛的效果。