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_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;
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
|