1、开关量逻辑控制:实现一个简单的开关量逻辑控制程序:当输入信号1和输入信号2同时为TRUE时,输出为TRUE;否则,输出为FALSE。
2.定时器:当输入信号为TRUE时,启动一个5秒的延时定时器,定时器到时后,输出为TRUE。如果变为FALSE,定时器复位,输出为FALSE。

3.计数器:每次输入信号从FALSE变为TRUE时,计数器加1。当计数达到10时,输出为TRUE,并保持直到复位信号为TRUE时清零计数器并关闭输出。

4.读取一个温度传感器模拟量输入(温度范围0-100°C),当温度在20°C到80°C之间时,输出为TRUE,否则为FALSE。

5.有一个包含10个整数的数组,计算数组中所有元素的平均值,并存储到进平均值变量。(REAL类型)。

6.实现一个简单的状态机,控制一个设备的运行流程:
  • 状态0:停止(输出为FALSE)。
  • 状态1:运行(输出为TRUE,持续10秒)。
  • 状态2:冷却(输出为FALSE,持续5秒)。
  • 当输入为TRUE时,从状态0进入状态1,循环执行1→2→0。为TRUE时复位到状态0。

7.实现一个简化的PID控制算法,输入为设定温度和实际值PV,输出控制量范围0-100。使用比例控制(P),比例增益Kp为2.0。

8.当输入为TRUE时,生成一条报警信息“Error: Over Temperature”并存储到报警信息STRING类型)。当输入信号为FALSE时,清空字符串。

9.实现一个生产节拍控制程序:
  • 当为TRUE时,启动生产循环。
  • 每个循环包括:工位1运行3秒(工位一输出为TRUE),工位2运行2秒(工位二输出为TRUE),暂停1秒。
  • 循环执行10次后停止,置运行完成信号为TRUE表示完成。
  • 复位信号为TRUE时复位程序。
    第十个程序预定给大家做SCL的报警信息记录功能,因为没给大家介绍过系统时间用法,所以明天和大家统一讲一下。
    SCL接口:

    源码:
REGION 项目一    //开关逻辑控制    '数据块_1'.项目一.输出 := '数据块_1'.项目一.启动信号1 AND '数据块_1'.项目一.启动信号2;

END_REGIONREGION 项目二    //延时定时器    'IEC_Timer_0_DB'.TON(IN := '数据块_1'.项目二.启动信号,                         PT := T#5S,                         Q => '数据块_1'.项目二.输出,                         ET => '数据块_1'.项目二.计时);
END_REGIONREGION 项目三    //计数器    'R_TRIG_DB'(CLK := '数据块_1'.项目三.启动信号,                Q => '数据块_1'.项目三.计数加一);

    'IEC_Counter_0_DB'.CTU(CU := '数据块_1'.项目三.计数加一,                           R := '数据块_1'.项目三.复位,                           PV := 10,                           Q => '数据块_1'.项目三.输出,                           CV => '数据块_1'.项目三.当前计数);
END_REGIONREGION 项目四    //模拟量转换,以温度为例    '数据块_1'.项目四.模拟量 := INT_TO_REAL('数据块_1'.项目四.模拟量输入);  //将读取的模拟量信号转化成real存在实际模拟量中
    '数据块_1'.项目四.实际温度 := ('数据块_1'.项目四.模拟量) / 27648.0 * ('数据块_1'.项目四.温度计上限 - '数据块_1'.项目四.温度计下限) + '数据块_1'.项目四.温度计下限;    IF '数据块_1'.项目四.实际温度 < 80.0 AND '数据块_1'.项目四.实际温度 > 20.0 THEN        '数据块_1'.项目四.温度合适 := 1;    END_IF;
END_REGIONREGION 项目五
    //数据处理    '数据块_1'.项目五.总和 := 0;    FOR #i := 1 TO 10 DO        '数据块_1'.项目五.总和 := '数据块_1'.项目五.总和 + '数据块_1'.项目五.数组[#i];    END_FOR;    '数据块_1'.项目五.平均值 := INT_TO_REAL('数据块_1'.项目五.总和) / 10.0;
十个SCL编程,全学会也能独当一面(附源码)
END_REGIONREGION 项目六
    //状态机
    CASE '数据块_1'.项目六.运行状态 OF        0:  //停止状态            '数据块_1'.项目六.输出 := 0;            IF '数据块_1'.项目六.启动按钮 THEN                '数据块_1'.项目六.运行状态 := 1;            END_IF;        1:            '数据块_1'.项目六.输出 := 1;            IF 'IEC_Timer_0_DB_1'.Q THEN                '数据块_1'.项目六.运行状态 := 2;            END_IF;        2:            '数据块_1'.项目六.输出 := 0;            IF 'IEC_Timer_0_DB_2'.Q THEN                '数据块_1'.项目六.运行状态 := 0;            END_IF;
    END_CASE;    'R_TRIG_DB_2'(CLK := '数据块_1'.项目六.停止按钮,                  Q => '数据块_1'.项目六.停止信号);
    IF '数据块_1'.项目六.停止信号 THEN        '数据块_1'.项目六.运行状态 := 0;        '数据块_1'.项目六.启动按钮 := 0;        '数据块_1'.项目六.输出 := 0;    END_IF;
    'IEC_Timer_0_DB_1'.TON(IN := '数据块_1'.项目六.输出,                           PT := T#10S,                           ET => '数据块_1'.项目六.运行计时);
    'IEC_Timer_0_DB_2'.TON(IN := '数据块_1'.项目六.运行状态 = 2,                           PT := T#5S,                           ET => '数据块_1'.项目六.冷却计时);
END_REGIONREGION 项目七    //PID  比例控制    '数据块_1'.项目七.模拟量 := INT_TO_REAL('数据块_1'.项目七.模拟量输入);  //将读取的模拟量信号转化成real存在实际模拟量中
    '数据块_1'.项目七.实际温度 := ('数据块_1'.项目七.模拟量) / 27648.0 * ('数据块_1'.项目七.温度计上限 - '数据块_1'.项目七.温度计下限) + '数据块_1'.项目七.温度计下限;    '数据块_1'.项目七.误差 := '数据块_1'.项目七.实际温度 - '数据块_1'.项目七.设定温度;    '数据块_1'.项目七.输出值 := '数据块_1'.项目七.KP * '数据块_1'.项目七.误差;    IF '数据块_1'.项目七.输出值 > 100.0 THEN        '数据块_1'.项目七.输出值 := 100;    END_IF;    IF '数据块_1'.项目七.输出值 < 0.0 THEN        '数据块_1'.项目七.输出值 := 0;    END_IF;
END_REGIONREGION 项目八    //字符串报警    IF '数据块_1'.项目八.启动按钮 THEN        '数据块_1'.项目八.报警信息 := 'error Over Temperature';    ELSE        '数据块_1'.项目八.报警信息 := '';    END_IF;
END_REGIONREGION 项目九    //生产线节拍    CASE '数据块_1'.项目十.运行状态 OF        0:            '数据块_1'.项目十.工位一 := 0;            '数据块_1'.项目十.工位二 := 0;            '数据块_1'.项目十.复位信号 := 0;            '数据块_1'.项目十.循环次数 := 0;            IF '数据块_1'.项目十.启动按钮 THEN                '数据块_1'.项目十.运行状态 := 1;            END_IF;
        1:            '数据块_1'.项目十.工位一 := 1;            IF 'IEC_Timer_0_DB_3'.Q THEN                '数据块_1'.项目十.运行状态 := 2;                '数据块_1'.项目十.工位一 := 0;            END_IF;        2:            '数据块_1'.项目十.工位二 := 1;            IF 'IEC_Timer_0_DB_4'.Q THEN                '数据块_1'.项目十.运行状态 := 3;                '数据块_1'.项目十.工位二 := 0;            END_IF;        3:            IF 'IEC_Timer_0_DB_5'.Q THEN                '数据块_1'.项目十.运行状态 := 1;                '数据块_1'.项目十.循环次数 := '数据块_1'.项目十.循环次数 + 1;                IF '数据块_1'.项目十.循环次数 = 10 THEN                    '数据块_1'.项目十.运行状态 := 4;                END_IF;
            END_IF;        4:            '数据块_1'.项目十.完成信号 := 1;
            ;    END_CASE;    IF '数据块_1'.项目十.复位信号 THEN        '数据块_1'.项目十.工位一 := 0;        '数据块_1'.项目十.工位二 := 0;        '数据块_1'.项目十.循环次数 := 0;        '数据块_1'.项目十.运行状态 := 0;        '数据块_1'.项目十.启动按钮 := 0;    END_IF;

    'IEC_Timer_0_DB_3'.TON(IN := '数据块_1'.项目十.运行状态 = 1,                           PT := T#3S,                           ET => '数据块_1'.项目十.工位一运行时间);    'IEC_Timer_0_DB_4'.TON(IN := '数据块_1'.项目十.运行状态 = 2,                           PT := T#2S,                           ET => '数据块_1'.项目十.工位二运行时间);    'IEC_Timer_0_DB_5'.TON(IN := '数据块_1'.项目十.运行状态 = 3,                           PT := T#1S,                           ET => '数据块_1'.项目十.暂停计时);
END_REGION