在S7300-400型PLC中使用高级语言编程
更新时间:2023-11-15 00:50:01 阅读量: 教育文库 文档下载
- s7300和400的区别推荐度:
- 相关推荐
在S7300/400型PLC中使用高级语言编程
S7-SCL是一种类似于Pasical、Deliphi的高级编程语言,其符合国际标准IEC 61131-3,也就是说支持该标准的任意厂家的PLC均可以使用与之相似的语言编程。这种语言适合于处理复杂的逻辑和大量的数学运算,由于其具有高级语言的编程结构,因此和S7的STL语句表编程方式比较起来有着更加方便的控制方式,可以这样说,只要是必须使用语句表的地方,我们均可以考虑使用SCL,也许STL在执行时比SCL更加高效,但事实上也不一定,首先SCL可以编译成STL,同时SCL设计时可以优化编程,而STL若运用不当,可能还会将低效率。当然在目前的这种系列的PLC上,效率对于我们来说已是次要的,我们更关心的是编程结构。就像在PC机上,舍弃了汇编语言,而主要采用C/C++等高级语言。总体来说,SCL适合于编写标准功能块,由于在维护中,它和STL一样,不象Lad一样利于维护,因此这些标准功能块都应该有文档说明,以便用户了解其功能。 下面的内容主要是参考西门子的S7-SCL文档,对SCL进行了系统的介绍,最后给出了示例。
这里假设读者是学过S7-300/400编程,并曾经学过至少一种计算机高级编程语言。
一、 软件的使用
1、 创建一个新的S7-SCL Source 文件
打开工程项目à选择CPU站à选择S7 Programà选择Sources
在右边窗口的空白处点右键选Insert New Objectà点击SCL Source 双击创建的SCL Source文件,进入SCL编辑界面。 2、 块保护
在SCL Source文件的开头添加关键字:KNOW_HOW_PROTECT,当打开由其创建的块时,只能显示参数,而看不到内容。
3、主菜单”Insert”下的”Block Template”可用于插入如OB,FB等各种块的结构。”Control Structure”菜单可插入各种流程控制结构,这些都可以简化编程。
4、在运行程序之前,首先必须对它进行编译,可以编译整个Source文件或者某个被选择的块,通过选择菜单File > Compile Selected Blocks。也可以把几个Source文件一起进行编译,其方法是创建一个S7-SCL compilation control file.在该文件中依次输入需要编译的SCL Source文件名,然后执行编译即可。
二、语法规则
1、编写SCL Source文件的一般规则
● FB, FC, OB, DB以及用户定义的UDT,它们使用的任意数字号均可以在SCL Source中编辑。
● 每种块类型都有它自己的结构。
● 每段落或者每个变量的声明以符号”;”标志结束。 ● 不区分大小写。
● 注释仅存在于程序文档中,它不影响程序运行。 ● 当一个功能块被调用时,其背景数据块被自动创建,因此它们不需要被编辑。 ● DB0有特定用途,因此在程序中不能创建DB0. 2、 编写块的先后次序
● 被调用的块必须位于调用块之前。
● UDT的定义必须位于其被使用的位置之前。
● 共享数据块必须位于那些使用它的所有块之前。
三、 数据类型
1、数据类型预览 Ⅰ、基本数据类型
2、补充
<1>、DATE_AND_TIME Data Type
其值的范围:DT#1990-01-01-0:0:0.0---------DT#2089-12-31-23:59:59.999 该类型以BCD码形式存储。
例如20/Oct./1995 12:20:30 and 10 milliseconds显示如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10
<2>STRING e.g. 声明 VAR
Text1 : String [123]; //该字符串的最大容量为123个字符 Text2 : String; //该字符串的默认容量为254个字符 END_VAR
初始化:x : STRING[7]:='Address'; //在使用STRING前,必须对它赋值。 FUNCTION Test : STRING[45] VAR_TEMP
x : STRING[45]; END_VAR x := 'a';
x := concat (in1 := x, in2 := x); Test := x; //返回值 END_FUNCTION
<3>数组类型 e.g. VAR
CONTROLLER1 : //声明3行、4列的二位整数数组,并对其初始化 ARRAY[1..3,1..4] OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ;
CONTROLLER2 : ARRAY[1..10] OF REAL ; //声明10个数的一维实数数组 END_VAR
注:数组的最大维数为6维,数组的索引范围为-32768 --- 32767之间的任意
整数。所有的基本数据类型均可用于数组。数组可以使用变量进行索引,例如: arrname_1[ i ] := arrname_2[ j ] ;
<4>STRUCT类型
e.g. 声明一个结构MOTOR中包含另一个结构DATA。对结构声明时,可以初始化元素,也可以在使用之前再初始化。 VAR
MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR
结构以WORD的形式结尾,否则系统自动把丢失的字节补到结构中去。 <5>用户定义类型UDT (使用关键字TYPE) TYPE //定义名字为MEASVALUES的数据类型 MEASVALUES: STRUCT BIPOL_1 : INT := 5;
BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := W#16#1919 ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA :REAL ; END_STRUCT; END_STRUCT; END_TYPE
//在FB10中使用该类型 FUNCTION_BLOCK FB10 VAR
MEAS_RANGE : MEASVALUES; //创建UDT数据 END_VAR BEGIN
// 使用UDT数据
MEAS_RANGE.BIPOL_1 := -4 ;
MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; END_FUNCTION_BLOCK
<6>POINTER类型 e.g.
//定义功能块FC100
FUNCTION FC100 : VOID //VOID表明该功能不返回值 VAR_IN_OUT //定义FC100的输入输出型参数
N_out : INT;
out : POINTER; //定义POINTER型数据类型,参数均为临时变量 END_VAR
VAR_TEMP //定义临时变量 ret : INT; END_VAR
BEGIN //进入函数主体 // ...
ret := SFC79(N := N_out, SA := out); END_FUNCTION
//定义功能块FB100 FUNCTION_BLOCK FB100
VAR //定义静态变量,即离开块后仍旧保存状态的变量 ii : INT;
aa : ARRAY[1..1000] OF REAL; END_VAR BEGIN // ...
FC100(N_out := ii, out := aa); //调用FC100,使用指针的方式传递整个数组 // ...
END_FUNCTION_BLOCK
<7>ANY类型 e.g.
VAR_INPUT //输入型变量 iANY : ANY; //定义为ANY END_VAR VAR_TEMP
pANY : ANY; //定义为ANY END_VAR
CASE ii OF //CASE分支语句 1:
pANY := MW4; // 将MW4的地址赋给pANY // of MW4
3..5: //等于3,4,5的情况下
pANY:= aINT[ii]; // pANY contains the address // of the ii th
// element of the aINT field; 100:
pANY := iANY; // pANY contains the value // of the iANY input variable ELSE
pANY := NIL; // pANY contains the value
// of the NIL pointer END_CASE;
SFCxxx(IN := pANY);
四、局部变量和参数的声明
1、变量
静态变量:用于保持块的数据,该数据存在背景数据块中。 临时变量:仅在块运行过程中存在。
若多个变量的数据类型一致,可用如下方式: VALUE2, VALUE3,VALUE4,....: INT; 声明时可以初始化: VALUE :REAL := 20.25; 数组的初始化有两种方式:
CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := -54, 736, -83, 77;
当把相邻的数组元素赋相同的值时,例如,把A3[2]到A3[11]的值设为100.0: A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0; 2、块参数
输入参数: 用于接收当块被调用时的输入值,他们是只读的。
输出参数: 传输当前值到这个调用块,在被调用块中应该对该参数赋值 输入/输出参数:用于接收当块被调用时的输入值,并可以把结果返回到调用块。 3、使用多重背景
声明方式如下:
Supply1 : FB10; // Supply1为FB10的背景DB
Supply2,Supply3,Supply4 : FB100; //为FB100声明多个背景DB Motor1 : Motor ; // Motor为某个FB的符号名 4、 变量的声明
五、常量
S7-SCL常量分位常量、数字常量、字符常量、时间常量,使用CONST?END_CONST声明。 e.g. CONST
Number := 10 ; //整数常量
TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; //时间常量 NAME := 'SIEMENS' ; //字符串常量 NUMBER2 := 2 * 5 + 10 * 4 ; NUMBER3 := 3 + NUMBER2 ; END_CONST 1、 位常量
Bool#false 位的值为TRUE或者FALSE 8#177777 8进制
DW#16#0000_0000 16进制 2、 整数常量,它有多种表达方式
15 10进制值为15 2#1111 2进制值为15 16#F 16进制值为15
Value_2:=2#0101; // 2进制值为5 Value_3:=8#17; // 10进制值为14 Value_4:=16#F; // 16进制值为15
Value_5:=INT#16#3f_ff // 16进制值,类型被定义 3、 Real常量 NUM4:= -3.4 ; NUM5:= 4e2 ;
NUM6:= real#1.5; 4、 字符常量(单个字符)
Charac_1 := 'B';
Charac_2 := char#43;
Charac_3 := char#'B'; //字符’B’ CHARACTER := '$41' ; //字符'A' 5、 字符串常量 NAME:= 'SIEMENS';
6、日期常量
TIMEVARIABLE1:= DATE#1995-11-11 ; TIMEVARIABLE2:= D#1995-05-05 ; 7、 时间常量
Interval1:= TIME#10.5S ; Interval2:= T#3D_2S_3MS ; 8、 Time-of-Day常量
TIMEOFDAY1:= TIME_OF_DAY#12:12:12.2 ; TIMEOFDAY2:= TOD#11:11:11 ; 9、Date and Time常量
TIMEOFDAY1:= DATE_AND_TIME#1995-01-01-12:12:12.2 ; TIMEOFDAY2:= DT#1995-02-02-11:11:11;
六、CPU的内存区域
1、可以直接操作字节、字、位 STATUSBYTE :=IB10; STATUS_3 :=I1.1; MEASVAL :=IW20;
2、可以通过索引对位、字、字节操作,该索引可以是变量
MEASVAL_1 :=IW[COUNTER]; //若COUNTER=5,则MEASVAL_1的值为IW5 OUTLABEL :=I[BYTENO, BITNO]; // 若BYTENO=3,BITNO=1,则OUTLABEL=I3.1 注:当获取的数据类型是BYTE, WORD or DWORD,时,使用一个索引参数,当获取的数据类型为BOOL时,必须使用两个索引参数,分别指定字节号和位号。 3、对数据块的操作
STATUSBYTE :=DB101.DB10; //字节操作
STATUS_2:= DB12.DX[WNO, BITNO]; //位操作,支持索引 STATUSBYTE :=Status_data.DW[COUNTER]; //字操作,支持索引 MEASVAL :=Measdata.DW20;
STATUS_1 :=WORD_TO_BLOCK_DB(INDEX).DW10;
注:和Lad及STL语言比较起来,SCL在对数据块中的字、字节等操作时,少一个”B”字符。 七、表达式、操作符和地址
1、操作符预览
八、控制流程
1、IF选择语句 IF condition THEN ?
ELSIF condition THEN // ELSIF语句可以不使用,或者使用一个或者多个 ?
ELSE // ELSE语句可以不使用 ? END_IF ; e.g.
IF ARRAY[INDEX] = INDEX THEN CONTINUE ; END_IF ;
2、CASE选择语句 CASE intVariant OF
1 : DISPLAY:= OVEN_TEMP; 2 : DISPLAY:= MOTOR_SPEED;
3..10: DISPLAY:= INT_TO_DINT (TW); //可以指定连续的值 QW4:= 16#0004;
11,13,19: DISPLAY:= 99; //也可以把一系列值列出来 QW4:= 16#0005;
ELSE: // ELSE:可以省略 DISPLAY:= 0; TW_ERROR:= 1; END_CASE ;
3、FOR循环语句
FUNCTION_BLOCK FOR_EXA VAR
INDEX: INT ;
IDWORD: ARRAY [1..50] OF STRING; END_VAR BEGIN
FOR INDEX := 1 TO 50 BY 2 DO //从1到50,增量为2 IF IDWORD [INDEX] = 'KEY' THEN EXIT; //退出循环 END_IF; END_FOR;
END_FUNCTION_BLOCK 注:一些关键字
EXIT 退出其所在的循环。
CONTINUE 终止当前循环的执行,控制程序进入下一循环。 RETURN 退出当前正在被执行的块。 4、WHILE循环
WHILE INDEX <= 50 AND IDWORD[INDEX] <> 'KEY' DO //两个条件均满足才执行循环
INDEX := INDEX + 2; END_WHILE ;
5、REPEAT循环 REPEAT
INDEX := INDEX + 2 ; //该语句与WHILE的区别是UNTIL之前的语句总是先执
行一次
UNTIL INDEX > 50 OR IDWORD[INDEX] = 'KEY' //这两条件之一若满足,则退出循环
END_REPEAT ;
6、GOTO跳转语句 IF A > B THEN
GOTO LAB1 ; //若条件满足,则跳到LAB1处 ELSIF A > C THEN GOTO LAB2 ; END_IF ; // . . .
LAB1: INDEX := 1 ; GOTO LAB3 ;
LAB2: INDEX := 2 ; ?
7、调用块
绝对地址调用,例如:
FB10.DB20(X1:=5,X2:=78,......); //参数可以任意排列 FC31 (X1:=5, Q1:=Checksum) ; 符号地址调用,例如:
DRIVE.ON (X1:=5,X2:=78,......); DISTANCE (X1:=5, Q1=:Checksum) ;
每一个功能块有一个输入隐藏参数EN,和一个输出隐藏参数ENO,这两个参数是系统设定的,均为BOOL型,不需要声明,但在编程中可以使用,例如: //若MY_ENABLE为FALSE,则FC85不会被执行,只有为TRUE,才会执行 Result := FC85(EN:= MY_ENABLE, PAR_1:= 27); FB30.DB30 ([Parameter supply]);
IF ENO THEN //若FB30的调用没有问题,则? // . . . ELSE
// . . . END_IF;
九、定时器和计数器
1、计数器 S_CU 增计数器 S_CD 减计数器 S_CUD 增/减计数器 e.g.
S_CUD (C_N=C12, //绝对调用定时器,指定计数器号 CD:=I0.0, CU:=I0.1,
S:=I0.2 & I0.3, //置位条件
PV:=120, //设定计数器值 R:=FALSE, //复位条件
CV:=binVal, //输出参数,二进制计数值 Q:=actFlag); //输出参数,计数器的状态 FUNCTION_BLOCK COUNT VAR_INPUT
Count: ARRAY [1..4] of STRUCT C_N INT; PV : WORD; END_STRUCT; ?
END_VAR ?
FOR I:= 1 TO 4 DO //动态调用计数器
S_CD(C_N=Count[I].C_NO, S:=true, PV:= Count[I].PV); END_FOR;
FUNCTION_BLOCK COUNTER VAR_INPUT
MYCounter:COUNTER; END_VAR ?
CurrVal:=S_CD(C_N=MyCounter,.....); //动态调用计数器
2、定时器
定时器有5种,依次为:S_PULSE S_PEXT S_ODT S_ODTS S_OFFDT VAR
CurrTime : S5time; BiVal : word; ActFlag : bool; END_VAR
//在调用定时器时,部分参数可以省略,但左边的赋值变量一定不能省略。 CurrTime:=S_ODT(T_N=T10, //绝对调用,制定定时器号 S:=TRUE, //置位条件
TV:=T#1s, //设定定时器值 R:=FALSE, //复位条件 BI:=biVal, Q:=actFlag);
FUNCTION_BLOCK TIME VAR_INPUT
MY_TIMER: ARRAY [1..4] of STRUCT T_N INT; TV : WORD; END_STRUCT; ?
END_VAR ?
FOR I:= 1 TO 4 DO
CurrTime:= S_ODT(T_N=MY_TIMER[I].T_NO, S:=true, MY_TIMER[I].TV); END_FOR;
FUNCTION_BLOCK TIMER VAR_INPUT
mytimer:TIMER; END_VAR ?
CurrTime:=S_ODT(T_N=mytimer,.....);
十、S7-SCL中的标准功能
1、数据类型转换函数
隐式转换,其依照的顺序为: BOOL > BYTE > WORD > DWORD INT > DINT > REAL
e.g. VAR
PID_CTRLLER_1 : BYTE ; PID_CTRLLER_2 : WORD ; END_VAR
IF (PID_CTRLLER_1 <> PID_CTRLLER_2) THEN ... //此时PID_CTRLLER_1被转换成WORD
当然,也可以使用以下功能显示的转换:
BOOL_TO_BYTE 、 BOOL_TO_DWORD 、BOOL_TO_WORD 、BYTE_TO_DWORD 、BYTE_TO_WORD 、 CHAR_TO_STRING 、DINT_TO_REAL 、INT_TO_DINT 、INT_TO_REAL、WORD_TO_DWORD
BYTE_TO_BOOL :Copies the least significant bit DINT_TO_TOD :Copies the bit string Y
DINT_TO_BOOL :DWORD_TO_BOOL(DINT_TO_DWORD(x)) Y DINT_TO_BYTE :DWORD_TO_BYTE(DINT_TO_DWORD(x)) Y DINT_TO_STRING :DI_STRNG Y DINT_TO_BCD(x)
DINT_TO_BCD_DWORD(x) ?
2、ROUND和TRUNC
ROUND():将REAL数四舍五入取整返回DINT
TRUNC():舍弃REAL数的小数部分取整返回DINT
3、一般数学函数
例子:
RESULT := ABS (-5) ; //5 RESULT := SQRT (81.0); //9 RESULT := SQR (23); //529
RESULT := EXP (4.1); //60.340 ... RESULT := EXPD (3); //1_000 PI := 3. 141 592 ;
RESULT := SIN (PI / 6) ; //0.5 6、移位函数
ROL、ROR、SHL、SHR 例子:
RESULT := ROL (IN:=BYTE#2#1101_0011, N:=5); //2#0111_1010 ,左移5位 ,移出的填充到右边空位
RESULT := ROR (IN:=BYTE#2#1101_0011, N:=2); //2#1111_0100 ,右移2位 ,移出的填充到左边空位
RESULT := SHL (IN:=BYTE#2#1101_0011, N:=3); //2#1001_1000 ,左移3位,空余部分用0填充
RESULT := SHR (IN:=BYTE#2#1101_0011, N:=2); //2#0011_0100 ,右移2位,空余部分用0填充
7、字符串函数
由于PLC编程中字符、字符串的使用比较少,这里不详叙,感兴趣的可以参考西门子文档中的 14.4 Functions for Processing Strings (P293-P303) 8、 选值函数 <1>最大值函数
//用于获取这些参数中的最大值,参数最多可以有32个,其参数类型除了S5TIME以外,任意其他数//子类型均可以,但所有的参数数据类型必须一致。 A:=MAX(IN1:=a, IN2:=b, IN3:=c, IN4:=d...); <2>最小值函数
//用于获取这些参数中的最小值,参数最多可以有32个,其参数类型除了S5TIME以外,任意其他数//子类型均可以,但所有的参数数据类型必须一致。 A:=MIN(IN1:=a, IN1:=b, IN1:=c, IN1:=d); <3>极限值函数
A:=LIMIT(MN:=5, IN:= Execution steps, MX:= 10); <4>MUX函数
A:=MUX(K:=SELECT, IN0:= Steps, IN1:=Number, IN2:=Total); 9、系统功能/功能块、标准库
SCL像其他语言一样,可以调用各种功能块,包括系统功能、功能块SFC/SFB
十一、示例 (均在PLC-SIM上测试通过)
1、编写位偏移程序
传递M变量的起始字节和位、偏移量,然后根据偏移量,算出当前M变量的字节和地址。例如针对M5.4,若给定偏移量1,则当前还是M5.4,若给定2,则为M5.5,依次类推,若给定偏移量6,则为M6.1 //根据偏移量来设定字节和位 FUNCTION FC200: void VAR_INPUT //输入变量 byteNINT; //指定M起始字节号 bitNINT; //指定起始位号 bitNum:INT; //指定位数 END_VAR
VAR_OUTPUT //输出变量 currBit:INT; //当前位 currByte:INT; //当前字节 END_VAR VAR_TEMP tmp:INT; END_VAR BEGIN
tmp:=(bitNo+bitNum-1)DIV 8; currByte:=byteNo+tmp;
currBit:=bitNo+bitNum-(8*tmp+1); END_FUNCTION 2、功能选择程序
假设某个机床有若干过手动功能,使用两个按钮”+”和”-“,按一次”+”,功能号加一,然后相应的功能选择指示灯被点亮,譬如,当前功能3被选中,与之对应的指示灯亮,这时按一次按钮”+”,则功能4被选中,与之对应的指示灯亮,而与功能3对应的指示灯灭,同时,当功能号到达最大值时,若再按一次按钮”+”,则功能号转到1,重新开始循环,按钮”-“与”+”正好相反,用于控制功能号递减。同时要求,当按住某个按钮超过1s时,则功能号每过200ms钟加一或者减一。
/////////////////////////////////////////////主要控制功能FC10//////////////////////////////////////// FUNCTION FC10: VOID VAR_INPUT //输入变量
fnAdd:BOOL; //接收\按钮 fnSub:BOOL; //接收\按钮
byteNINT; //指定M起始字节号,这些M位与相应得某个功能对应。 bitNINT; //指定起始位号 bitNum:INT; //指定总的位数 END_VAR
VAR //静态变量
pus1:BOOL; //记录按钮\的脉冲 pus2:BOOL; //记录按钮\的脉冲
button:BOOL; //确定按钮\或者按钮\被按下 currNINT; //记录当前的功能号 currBit:INT; //当前位 currByte:INT; //当前字节 //定时器输出 p1:BOOL; p2:BOOL;
p11:BOOL; //记录按钮\的时钟 p111:BOOL;
p22:BOOL; //记录按钮\的时钟 p222:BOOL;
CurrTime:S5TIME; END_VAR VAR_TEMP i:INT; END_VAR BEGIN
////若都接通,则推出块 IF fnAdd&fnSub THEN RETURN; END_IF;
/////////////////////////////////////////获取按钮\的脉冲/////////////////////////////////////////// IF fnAdd &(button=false) THEN
pus1:=true; ELSE
pus1:=false; END_IF;
//////////////////////////////////////////按钮\的脉冲///////////////////////////////// IF fnSub &(button=false) THEN pus2:=true; ELSE
pus2:=false; END_IF;
IF (fnSub&(fnAdd=false))OR (fnAdd&(fnSub=false)) THEN button:=true; ELSE
button:=false; END_IF;
//////////////////////////添加定时器监测
////////////////////////////////////////////////////
CurrTime:=S_ODT(T_N=T10, S:=fnAdd, TV:=T#800ms,Q:=p1); //按钮按下的时间
CurrTime:=S_ODT(T_N=T11, S:=p1&p111, TV:=T#200ms,Q:=p11); IF p11=true THEN
p111:=false; //当定时器有输出后,断开信号,使其在下一扫瞄周期中无输出 ELSE
p111:=true; //在按钮按下的情况下重启定时器计时 END_IF;
CurrTime:=S_ODT(T_N=T20, S:=fnSub, TV:=T#1s,Q:=p2);
CurrTime:=S_ODT(T_N=T21, S:=fnSub&p222, TV:=T#200ms,Q:=p22); IF p22=true THEN
p222:=false; //当定时器有输出后,断开信号,使其在下一扫瞄周期中无输出 ELSE
p222:=true; //在按钮按下的情况下重启定时器计时 END_IF;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//功能号从1开始,最后一个的号等于bitNum IF pus1=true OR p11 THEN //按钮\的脉冲 IF currNo currN=currNo+1; ELSE
currN=1; END_IF;
ELSIF pus2=true OR p22 THEN // 按钮\的脉冲 IF currNo>1 THEN currN=currNo-1;
ELSE
currN=bitNum; END_IF; END_IF;
//把它的上一个功能置0
m[currByte,currBit]:=false;
fc200(byteN=byteNo,bitN=bitNo,bitNum:=currNo,currBit:=currBit, currByte:=currByte); //把当前功能置1
m[currByte,currBit]:=true; END_FUNCTION
注:上程序有些繁琐,主要是在编写按钮脉冲时有些费事,好像SCL不提供脉冲沿检测函数。
正在阅读:
跟我学蒙语 - 图文03-20
关于评选表彰2011年曲靖师范学院“平安和谐家庭”的通知03-30
律协党建工作述职报告09-26
《文学概论》在线测试06-10
中国文化概论 历年真题05-09
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 语言编程
- 高级
- 使用
- 7300
- 400
- PLC
- 幸福心理学课后作业与答案(20190522012250)
- 西南交通大学交通运输与物流学院2018年全日制硕士研究生招生复试及拟录取工作实施细则(全日制)
- (最新版)汽车启动系统的故障分析与诊断毕业设计
- 统计学 实验五作业
- 道路旅客运输驾驶员从业资格考试题库 - 图文
- 2012生产运营管理离线作业答案
- 社会调查研究与方法期末考试试题
- 商务谈判礼仪
- CALIS联合目录MARC字段一览表
- 济宁市2018年中考化学试题(解析版)
- 哲学与人生试卷
- 课题成果鉴定申请书
- RIS 地质雷达 - 图文
- 公司办公室环境卫生管理制度
- 2017-2022年中国保险中介行业发展预测与投资战略规划分析报告(目录) - 图文
- 创新人才申请表
- 政治学原理课程教学大纲
- 口号标语之口号喊得震天响下一句
- 车位销售公告(仅供参考)
- 《琵琶记》鉴赏