官方解读:模拟量电机定位技术

2018-06-24 19:01:52 研蓝自动化021-61507699 11

研蓝提供的控制器,具有模拟量输入接口,并能通过模拟量进行电机定位或者电机调速。高达16位的模拟量精度,为精准定位提供了良好的基础。国内常见的驱动器通常只能模拟量调速,而且调速通常还不精确。对于国内厂家而言,目前模拟量电机定位控制技术还是存在一定的技术门槛。而研蓝提供的NANOTEC产品,可以非常好的实现模拟量的定位控制。也正因为如此,与瑞士VAT阀门制造商达成了战略合作。

我们下边通过程序代码的解析来简单介绍如何利用包括CL3E在内的控制器做模拟量的定位控制。

//***********************映射常见对象******************//

map U32 Inputs as input 0x60FD:00

map U16 ControlWord as output 0x6040:00

map U16 StatusWord as input 0x6041:00

map S16 Voltage as input 0x3220:01

map U32 Closeloop as inout 0x3202:00

map U32 Outputs as output 0x60FE:01

//***********************头文件******************//

#include "wrapper.h"

//***********************主程序******************//

void user()

{

 //***********************上电之后读取当前位置数据******************//

sleep(2000);

int a=0,b=0,x=0;

Out.Outputs=0x0;

yield();

sleep(1000);

b=od_read(0x2700, 0x02);

yield();

od_write(0x3202, 0x00, 1);

yield();

        od_write(0x6060, 0x00, 1); //********电机运行定位模式**********//

yield();

od_write(0x6081, 0x00, 100); //********电机运行速度**********//

yield();

Out.ControlWord = 0x6;

do {

yield();

}

while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21);   

Out.ControlWord = 0x7;

do {

yield();

}

while ( (od_read(0x6041, 0x00) & 0xEF) != 0x23);


 //***********************模拟量定位并掉电保存位置数据******************//

while(1)

{

yield();

int v=In.Voltage;

b=od_read(0x2700, 0x02);

   yield();

if(((a-v)>10)||((v-a)>10))

{

a=v;

v=(v*4000)/100;   //*********模拟量对应的电机最大位置***********//

   yield();

   x=v-b;

   od_write(0x607A, 0x00, x);

   yield();

if(x!=0)

{

       Out.ControlWord = 79;

yield(); 

                Out.ControlWord = 95;

           do {

   yield();

           

           }

           while( ( In.StatusWord & 0x400)!=0x400);

   Out.ControlWord = 7;

   yield();

   od_write(0x2700, 0x02, v);

   yield();

   od_write(0x2700, 0x01, 1);

yield();

}

}

    //***********************INPUT1用于堵转找零*****************//

if((In.Inputs & 0x10000)!=0)

{

od_write(0x6060, 0x00, 6);

       yield();

       od_write(0x6098, 0x00, 33);     

       yield();

       od_write(0x6099, 0x02, 50);

yield();

       Out.ControlWord = 0x6;

       do {

yield();

       }

       while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21);   

   Out.ControlWord = 0x7;

       do {

           yield();

       }

       while ( (od_read(0x6041, 0x00) & 0xEF) != 0x23);  

   Out.ControlWord = 0xF;

       do {

           yield();

       }

while ( (od_read(0x6041, 0x00) & 0xEF) != 0x27);  

   Out.ControlWord = 0x1F;

       do {

           yield();

       }

      while( ( In.StatusWord & 0x400)!=0x400);

od_write(0x2700, 0x02, 0);

yield();

od_write(0x2700, 0x01, 1);

yield();

b=0;

od_write(0x6060, 0x00, 1);

       yield();

od_write(0x6081, 0x00, 100);

       yield();

       Out.ControlWord = 0x6;

       do {

       yield();

       }

       while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21);   

       Out.ControlWord = 0x7;

       do {

       yield();

       }

       while ( (od_read(0x6041, 0x00) & 0xEF) != 0x23);

}

while((od_read(0x3020, 0x00))!=0)

{

yield();

Out.Outputs=0x10000;

            yield();

if((In.Inputs & 0x20000)!=0)

{

Out.ControlWord=0x80;

yield();

Out.Outputs=0x0;

yield();

sleep(1000);

od_write(0x6060, 0x00, 1);

yield();

od_write(0x607E, 0x00, 0);

yield();

Out.ControlWord = 0x6;

do {

yield();

   }

while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21);   

Out.ControlWord = 0x7;

do {

yield();

}

while ( (od_read(0x6041, 0x00) & 0xEF) != 0x23); 

               

 

}

}


}

}


编程语法上与C语言类似


标签: 模拟量定位