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.实现一个简单的状态机,控制一个设备的运行流程:
当输入为TRUE时,从状态0进入状态1,循环执行1→2→0。为TRUE时复位到状态0。
7.实现一个简化的PID控制算法,输入为设定温度和实际值PV,输出控制量范围0-100。使用比例控制(P),比例增益Kp为2.0。
8.当输入为TRUE时,生成一条报警信息“Error: Over Temperature”并存储到报警信息STRING类型)。当输入信号为FALSE时,清空字符串。
每个循环包括:工位1运行3秒(工位一输出为TRUE),工位2运行2秒(工位二输出为TRUE),暂停1秒。
循环执行10次后停止,置运行完成信号为TRUE表示完成。
第十个程序预定给大家做SCL的报警信息记录功能,因为没给大家介绍过系统时间用法,所以明天和大家统一讲一下。
REGION 项目一 //开关逻辑控制 '数据块_1' .项目一.输出 := '数据块_1' .项目一.启动信号1 AND '数据块_1' .项目一.启动信号2 ; END_REGION REGION 项目二 //延时定时器 'IEC_Timer_0_DB' .TON(IN := '数据块_1' .项目二.启动信号, PT := T#5 S, Q => '数据块_1' .项目二.输出, ET => '数据块_1' .项目二.计时); END_REGION REGION 项目三 //计数器 'R_TRIG_DB' (CLK := '数据块_1' .项目三.启动信号, Q => '数据块_1' .项目三.计数加一); 'IEC_Counter_0_DB' .CTU(CU := '数据块_1' .项目三.计数加一, R := '数据块_1' .项目三.复位, PV := 10 , Q => '数据块_1' .项目三.输出, CV => '数据块_1' .项目三.当前计数); END_REGION REGION 项目四 //模拟量转换,以温度为例 '数据块_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_REGION REGION 项目五 //数据处理 '数据块_1' .项目五.总和 := 0 ; FOR #i := 1 TO 10 DO '数据块_1' .项目五.总和 := '数据块_1' .项目五.总和 + '数据块_1' .项目五.数组[#i]; END_FOR; '数据块_1' .项目五.平均值 := INT_TO_REAL('数据块_1' .项目五.总和) / 10.0 ; END_REGION REGION 项目六 //状态机 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#10 S, ET => '数据块_1' .项目六.运行计时); 'IEC_Timer_0_DB_2' .TON(IN := '数据块_1' .项目六.运行状态 = 2 , PT := T#5 S, ET => '数据块_1' .项目六.冷却计时); END_REGION REGION 项目七 //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_REGION REGION 项目八 //字符串报警 IF '数据块_1' .项目八.启动按钮 THEN '数据块_1' .项目八.报警信息 := 'error Over Temperature' ; ELSE '数据块_1' .项目八.报警信息 := '' ; END_IF; END_REGION REGION 项目九 //生产线节拍 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#3 S, ET => '数据块_1' .项目十.工位一运行时间); 'IEC_Timer_0_DB_4' .TON(IN := '数据块_1' .项目十.运行状态 = 2 , PT := T#2 S, ET => '数据块_1' .项目十.工位二运行时间); 'IEC_Timer_0_DB_5' .TON(IN := '数据块_1' .项目十.运行状态 = 3 , PT := T#1 S, ET => '数据块_1' .项目十.暂停计时); END_REGION