谁能帮我编个PLC测电机转速的程序

谁能帮我编个PLC测电机转速的程序,第1张

一、主程序MAIN

程序初始化,PLC上电运行的第一个扫描周期执行一次初始化子程序SBR_0。用于程序运行的初始设置

二、子程序SBR_0

在PLC运行的第一个扫描周期,将用于记录累加数据次数和累加数据的中间变量VB8和VD0置0

设置高速计数器HC0的控制字节SMB37,用十六进制表示(16#F8),也可以用二进制表示(2#11111000)。

设置高速计数器HC0工作模式为0,单相计数输入,没有外部控制功能。 设置高速计数器HC0初始值寄存器SMD38为0。

执行HSC指令,将控制字节SMB37、初始值/预置值寄存器(SMD38/SMD42)以及工作模式写入高速计数器HC0。

设定定时中断事件的时间为50ms

定时中断事件号10和中断处理程序INT_0建立关联。 允许中断,将定时中断事件和中断处理程序连接

三、中断处理程序INT_0

中断处理程序每隔50ms扫描刷新一次。

采用整数加法指令,将高速计数器HC0的计数当前值(32位)和累加数据相加一次。用于数据的累加。

采用整数递增指令,记录累加次数。

执行HSC指令,在这里执行的目的,是将初始值寄存器SMD38(0)再次写入高速计数器HC0,使计数当前值为0,以便下个定时采样。

当累加数据次数等于32次,子程序中网络2中程序执行。 采用除法指令,计算32次的累加数据平均值。

将平均值转换成测量单位:转/分,转换后的数据送入双字VD4。

将平均值转换成字数据,送入字VW10中。VW10中的数据就是电机速度值。之所以转换,是因为在程序中一般要求以字的概念存在。

将记录累加数据次数的字节VB6中数据置0。用于下一次开始时,从新开始累加。

将用于累叫数据的中间变量VD4置0。

我没有写过PLC的,只写过单片机的哦...你网上搜下,蛮多的,主要是理解了就好...步进嘛,就是你给它一个突变的信号,它就走一步的,不然就不叫步进撒...也就是你触发它一下,它跑一步,且只跑一步的哦...懂了吧?

内容:1、本程序用于测试4相步进电机常规驱动

2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来

3、速度不可以调节的过快,不然就没有力矩转动了

4、按s4(设置成独立按键模式)可以控制正反转

------------------------------------------------*/

#include <reg52.h>

bit Flag//定义正反转标志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}//正转表格

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}//反转表格

/******************************************************************/

/*延时函数*/

/******************************************************************/

void Delay(unsigned int i)//延时

{

while(--i)

}

/******************************************************************/

/* 主函数 */

/******************************************************************/

main()

{

unsigned char i

EX1=1//外部中断0开

IT1=1//边沿触发

EA=1 //全局中断开

while(!Flag)

{

P0=0x71//显示 F 标示正转

for(i=0i<4i++) //4相

{

P1=F_Rotation[i] //输出对应的相 可以自行换成反转表格

Delay(500) //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

while(Flag)

{

P0=0x7C//显示 b 标示反转

for(i=0i<4i++) //4相

{

P1=B_Rotation[i] //输出对应的相

Delay(500) //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

}

/******************************************************************/

/* 中断入口函数 */

/******************************************************************/

void ISR_Key(void) interrupt 2 using 1

{

Delay(300)

Flag=!Flag//s3按下触发一次,标志位取反

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11558015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存