
LD SM0.5
EU
TODR VB0 //读取时间
LDB>= VB0, 16#09//读取的时间是BCD码,这样用省去格式转换
AB>= VB1, 16#06
AB>= VB2, 16#03
AB>= VB3, 16#20
AB>= VB4, 16#31
AB>= VB5, 16#20
STOP
2 如果定时开启关闭外部设备,那PLC可以轻松完成。
例如每天早上6点到晚上8点开机
LD SM0.5
EU
TODR VB0
LDB>= VB3, 16#06
AB= Q0.0
3 PLC运行一段时间停止
LD SM0.4
EU
INCD MD0 //每分钟累加一次,
LDD= MD0, 4320 //3天后CPU停止,4320=3天*24小时*60分钟
STOP //在系统块里将MD0设置为断电保持,那么计时不受停电影响,停电自动保存计时时间。
关键是如何读系统时钟:
S7-200的硬件实时时钟可以提供年、月、时、分、秒的日期/时间数据。
CPU221、CPU222没有内置的实时时钟,需要外插“时钟/电池卡”才能获得此功能。CPU224、CPU226和CPU226 XM都有内置的实时时钟。
为了提高运算效率,应当避免每个程序周期都读取实时时钟。实际上可读取的最小时间单位是1秒,可每秒读取一次(使用SM0.5上升沿触发读取指令)。
使用程序读取的实时时钟数据为BCD格式,可在状态图中使用十六进制格式查看。
CPU靠内置超级电容(+外插电池卡)在失去供电后为实时时钟提供电源缓冲;缓冲电源放电完毕后,再次上电后时钟将停止在缺省值,并不开始走动。
要设置日期、时间值,使之开始走动,可以:
用编程软件(Micro/WIN)的菜单命令PLC >Time of Day Clock...,通过与CPU的在线连接设置,完成后时钟开始走动
编用户程序使用Set_RTC(设置时钟)指令设置
Micro/WIN可以通过任何编程连接实现实时时钟的设置。
使用 S7-200 的 READ_RTC(读取实时时钟)和 SET_RTC(设置实时时钟)指令时, 读取和设置的数据格式都是 BCD 码的。如果觉得不便计算、处理,可使用 Clock Integer 指令库。
void RCC_Configuration(void){
ErrorStatus HSEStartUpStatus
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON)
//等待外部晶振稳定
HSEStartUpStatus = RCC_WaitForHSEStartUp()
//如果外部晶振启动成功,则进行下一步 *** 作
if(HSEStartUpStatus==SUCCESS)
{
//开启FLASH预取指功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable)
//FLASH时序控制
//推荐值:SYSCLK = 0~24MHz Latency=0
//SYSCLK = 24~48MHz Latency=1
//SYSCLK = 48~72MHz Latency=2
FLASH_SetLatency(FLASH_Latency_2)
//设置HCLK(AHB时钟)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1)
//PCLK2(APB2) = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1)
//PCLK1(APB1) = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2)
//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9)
//启动PLL
RCC_PLLCmd(ENABLE)
//等待PLL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
//系统时钟SYSCLK来自PLL输出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)
//切换时钟后等待系统时钟稳定
while(RCC_GetSYSCLKSource()!=0x08)
{
}
}
else
{
/* If HSE fails to start-up, the application will have wrong clock configuration.
User can add here some code to deal with this error */
/* Go to infinite loop */
while (1)
{
}
}
//下面是给各模块开启时钟
//启动GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD,
ENABLE)
//启动AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)
}
void RTC_Configuration(void)
{
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE)
//后备域解锁
PWR_BackupAccessCmd(ENABLE)
//备份寄存器模块复位
BKP_DeInit()
//外部32.768K
RCC_LSEConfig(RCC_LSE_ON)
//等待稳定
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)
//RTC时钟源配置成LSE(外部32.768K)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE)
//RTC开启
RCC_RTCCLKCmd(ENABLE)
//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
RTC_WaitForSynchro()
//读写寄存器前,要确定上一个 *** 作已经结束
RTC_WaitForLastTask()
//设置RTC分频器,使RTC时钟为1Hz
//RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
RTC_SetPrescaler(32763)
//加快一点,设置为32767一天慢20秒 设置为32764一天慢1秒
//等待寄存器写入完成
RTC_WaitForLastTask()
//使能秒中断
RTC_ITConfig(RTC_IT_SEC,ENABLE)
//等待写入完成
RTC_WaitForLastTask()
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)