SCL编程:自己DIY定时器,供大家交流

已锁定

溜溜圆

  • 帖子

    106
  • 精华

    2
  • 被关注

    6

论坛等级:游士

注册时间:2010-11-02

普通 普通 如何晋级?

SCL编程:自己DIY定时器,供大家交流

5716

15

2010-11-09 13:28:28

学习了很久的西门子的SCL。其它还好但是他们的时钟确实非常之难用!1要定义时间格式,2要自己还有无数多的问题困扰着我于是乎我自己奋发图强终于在今天中午自己搞定了一个定时器程序。不敢藏着掖着,发出来给大家分享一下确实今天的我太兴奋了!

第一步:时钟肯定需要一个脉冲信号最好 最优质的就是1秒,我如何来找喃!告诉你不难西门子300CPU有个叫做时钟存储器的东东。完美解决了这个问题,设置方法如下:
打开硬件组态,双击CPU打开CPU属性,选择“周期/时钟存储器”选项卡,打勾"周期/时钟存储器"标签,设置存储器字节,默认为0。该字节MB100,从M100.0到M100.7为周期性改变值的存储位(脉冲占空比:1:1)。
时钟存储字节(Memory Byte)的各位对应周期/频率如下:
字节位 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
频率(Hz) 0.5 0.62 1 1.25 2 2.5 5 10
周期(秒) 2 1.6 1 0.8 0.5 0.4 0.2 0.1
这里请大家注意:各个PLC 频率有可能不一样比如我现在使用的314-1AE04-0A0B BIT7就是1秒的脉冲。
于是乎我们的脉冲发生器就有了:
SCL程序描述如下:
x:=CHAR_TO_INT(BYTE_TO_CHAR(M100.7));
这样我们的X就是一个1秒钟跳动的变量了。
第二步:就是算法问题了,文字给大家解释下(主要我发不来图)就是利用X变量的变化例如:
1:当X=0 时 看y 是否等于X 如果等于X 那么说明一秒的频率还没有到
2: 当x=1 时 看y 是否等于X 如果不等 那么说明道了一秒那么就给Y=1。
如此轮换下去;
SCL程序描述如下:

if y<>x then
y:=x;
(后面就可以写出秒钟内该做的说明事情如果是用一个内存区域来记录时间就成为时钟了)
end_if;
在这两部完成后 只要加入复位功能和输出自己写的定时器就完成了!
SCL程序如下 测试完全通过:有兴趣的同志们可以继续完善或者提出意见和建议大家多沟通和切磋!
DATA_BLOCK DB1//
STRUCT
Tim:INT;
test:REAL;
T:BOOL;
testt:REAL;
Tt:BOOL;
testtt:REAL;
Ttt:BOOL;

a:int;
b:int;
c:int;


END_STRUCT
begin
END_DATA_BLOCK
//**********************************************************************************************F块
FUNCTION FC1:VOID
vAR_INPUT
Rest:BOOL; //系统复位标准
Target:REAL;//目标时间
END_VAR


VAR_IN_OUT
tim:REAL; //当前时间
Tem_Sec:INT;//临时时间脉冲
END_VAR

VAR_OUTPUT
// tim:REAL; //当前时间
Result:BOOL;
END_VAR

VAR
tt:REAL;
END_VAR

tt:=tim;

IF tt>=Target THEN
Result:=true;
ELSE
Result:=false;
END_IF;
IF Rest=true THEN
tt:=0;
END_IF;
IF Tem_Sec<>CHAR_TO_INT(BYTE_TO_CHAR(m100.7)) THEN //m100.7 是设置后的脉冲 0位
Tem_Sec:=CHAR_TO_INT(BYTE_TO_CHAR(m100.7));
DB1.TIM:= DB1.TIM+1;
tt:=tt+1;
END_IF;
IF DB1.TIM=60 THEN
DB1.TIM:=0;
END_IF;
IF tt>10000 THEN
tt:=0;
END_IF;
tim:=tt;
END_FUNCTION
//**********************************************************************************************F块


ORGANIZATION_BLOCK OB1//主程序如下
VAR_TEMP
info : ARRAY[0..19] OF BYTE;
gg:REAL;
tst:BOOL;
TEST:REAL;
T:BOOL;
END_VAR
BEGIN

IF DB1.T then
fc1(Target:=44,Rest:=true,Tem_Sec:=DB1.a,tim:=DB1.test,RESULT:=DB1.T);
ELSE
fc1(Target:=44,Rest:=FALSE,Tem_Sec:=DB1.a,tim:=DB1.test,RESULT:=DB1.T);
END_IF;

IF DB1.Tt then
fc1(Target:=23,Rest:=true,Tem_Sec:=DB1.b,tim:=DB1.testt,RESULT:=DB1.Tt);
ELSE
fc1(Target:=23,Rest:=FALSE,Tem_Sec:=DB1.b,tim:=DB1.testt,RESULT:=DB1.Tt);
END_IF;
IF DB1.Ttt then
fc1(Target:=12,Rest:=true,Tem_Sec:=DB1.c,tim:=DB1.testtt,RESULT:=DB1.Ttt);
ELSE
fc1(Target:=12,Rest:=FALSE,Tem_Sec:=DB1.c,tim:=DB1.testtt,RESULT:=DB1.Ttt);
END_IF;
END_ORGANIZATION_BLOCK
SCL编程:自己DIY定时器,供大家交流 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54759条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。