学习了很久的西门子的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