使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序
文章目录
目录
文章目录
前言
二、程序编写
1.机械手运行部分
2.启动停止部分
3.急停复位部分
三、完整代码
总结
前言
在前面我们一起写过了许多案例控制的编写,在这一章我们一起来编写一下一个仿真机械手程序(用SCL),这是一个大的加工中心其中一部分,完整的是:两个机械手完成进料和放托盘,经过传送带后可以进行升降或者进入仓储部分来存放,这里我们先完成第1个机械手控制部分,它的主要工作是完成取料和放料。
一、控制要求
程序要求:
1.按下启动按钮,出料,传送带A启动,当S传感器检测到物体时,传送带A停止运行,1s后机械手左转,在左转到位后停1s,吸盘得电0.5s后,机械手下降,当抓取到物体1s后机械手上升,上升到位后延时1s右转,右转到位后1s,机械手下降,下降到位后延时0.5s,吸盘失电,同时机械手上升,当料到位传感器检测到物体时 得电,B传送带运行,运行3s后,同时机械臂左转回到原位,3s时间到后,B传动带停止,机械手进入下一循环,继续取料上料。
2.在程序运行时如果按下停止按钮,程序会在循环完一次后回到原位停止操作,并且可以再次启动运行。
3.在程序运行时如果按下急停按钮,程序动作立即停止,当按下复位按钮后程序才能继续运行,在急停期间其他按钮无效。
factoryio(虚拟工厂)参考图:
到这里看过控制要求和场景后,大家可以自己试着用SCL编写一下,控制要求是参考前面机械手改进的,大家也可以自己写一下控制要求来编写。
I/O分配:
I/O分配一定要在题目要求中找到并判断是输入还是输出,这里我写出来了。下面5个指示灯是代表机械手的个个动作,加不加都可以。
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
SB1 | 启动 | I0.0 | A传送带 | 传送带 | Q0.0 |
SB2 | 停止 | I0.1 | B传送带 | 传送带 | Q0.1 |
SB3 | 急停按钮 | I0.2 | 吸盘 | Q0.2 | |
SB4 | 复位按钮 | I0.3 | 机械手 | Q0.3 | |
S传感器 | 传感器 | I0.4 | 机械臂右转 | Q0.4 | |
SQ1下降上升到位 | 传感器 | I0.5 | 机械臂左转 | Q0.5 | |
SQ5左右转到位 | 传感器 | I0.6 | L1灯 | 指示灯 | Q0.6 |
SQ3抓起到位 | 传感器 | I0.7 | L2灯 | 指示灯 | Q0.7 |
SQ2料到位 | 传感器 | I1.0 | L3灯 | 指示灯 | Q1.0 |
L4灯 | 指示灯 | Q1.1 | |||
L5灯 | 指示灯 | Q1.2 |
布置场景:
场景这里自己建一下就可以了,要注意:虚拟工厂变量名和I/O分配一定要和博图中变量和名称的相同。建立好分配好后,就可以和博图仿真连接上了,注意要在主程序带上一个仿真驱动块,要不然连接不上。(如果没有的话可以在博主资源里面下载,然后导入进去就好啦!)
二、程序编写
这里程序的控制可以分3个部分:机械手运行,启动停止,急停复位。
到这里我们其实可以知道要用什么语句来编写!case !对!机械手运行要一步一步来嘛,那case语句就比较合适啦!
1.机械手运行部分
好的,我们来开始这一部分的编写:
按下启动按钮,出料,传送带A启动,当S传感器检测到物体时,传送带A停止运行,1s后机械手左转,在左转到位后停1s,吸盘得电0.5s后,机械手下降,当抓取到物体1s后机械手上升,上升到位后延时1s右转,右转到位后1s,机械手下降,下降到位后延时0.5s,吸盘失电,同时机械手上升,当料到位传感器检测到物体时 得电,B传送带运行,运行3s后,同时机械臂左转回到原位,3s时间到后,B传动带停止,机械手进入下一循环,继续取料上料。
这里我们一步一步走,按下启动后,传送带A启动,然后等待料到达传感器,到达后进行下一步,2,3,4,5,6,7,8,9就这样就将机械手部分大概完成了。到第10步时将中继复位然后进入一个循环就好了。
T[0].TON(IN := #ZJ1,
PT := T#0.5s);
#T[1].TON(IN := #ZJ2,
PT := T#0.5s);
#T[2].TON(IN := #ZJ3,
PT := T#0.5s);
#T[3].TON(IN := #ZJ4,
PT := T#1s);
#T[4].TON(IN := #ZJ5,
PT := T#1s);
#T[5].TON(IN := #ZJ6,
PT := T#1s);
#T[6].TON(IN := #ZJ7,
PT := T#0.5s);
#T[7].TON(IN := #ZJ8,
PT := T#1s);
#T[8].TON(IN := #ZJ9,
PT := T#0.5s);
CASE #M OF
0:
IF "启动" THEN
"A传送带" := 1;
#M := 1;
END_IF;
1:
IF "S传感器" THEN
"A传送带" := 0;
"B传送带" := 0;
#ZJ1 := 1;
END_IF;
IF #T[0].Q THEN
#M := 2;
END_IF;
2:
"机械臂左转" := 1;
IF "SQ5左右转到位" THEN
#ZJ2 := 1;
END_IF;
IF #T[1].Q THEN
"机械臂左转" := 0;
#M := 3;
END_IF;
3:
"吸盘" := 1;
"机械手" := 1;
IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
#ZJ3 := 1;
END_IF;
IF #T[2].Q THEN
#M := 4;
END_IF;
4:
"机械手" := 0;
#ZJ4 := 1;
IF #T[3].Q THEN
"机械臂右转" := 1;
#ZJ5 := 1;
END_IF;
IF #T[4].Q THEN
"机械臂右转" := 0;
#M := 5;
END_IF;
5:
"机械臂右转" := 1;
#ZJ6 := 1;
IF #T[5].Q THEN
#M := 6;
END_IF;
6:
"机械臂右转" := 0;
"机械手" := 1;
IF "SQ1下降上升到位" & "吸盘" THEN
#ZJ7 := 1;
END_IF;
IF #T[6].Q THEN
"吸盘" := 0;
#M := 7;
END_IF;
7:
IF "SQ1下降上升到位" THEN
"机械手" := 0;
#ZJ8 := 1;
#M := 8;
END_IF;
8:
IF #T[7].Q THEN
"机械臂左转" := 1;
#ZJ9 := 1;
#M := 9;
END_IF;
9:
IF "SQ2料到位" THEN
"B传送带" := 1;
END_IF;
IF #T[8].Q THEN
"机械臂左转" := 0;
"A传送带" := 1;
#M := 10;
END_IF;
10:
"机械臂左转" := 0;
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5:= 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#M := 1;
当然这里还有一点小问题,我们先看过程序运行效果!
这里我们可以发现在上料时,是每过一个循环后上料,速度可能会稍慢一些!
我们改进一下,将上料的部分放在case语句外面,这样只要机械手拿走料,就会自动补齐!
代码如下:按下启动按钮后接通一个标志位,用if 语句来判断S传感器当前的状态然后取反就可以实现啦!例:S传感器为0是,取反赋值给A传送带,A传送带为1,开始进料;当S传感器为1时,取反变为0然后赋值给A传送带,A传送带就停止了!
//启动按钮
IF "启动" THEN
#标志1 := 1;
#M := 1;
END_IF;
IF #标志1 THEN
"A传送带" :=NOT "S传感器";
END_IF;
传送带部分提出来后,后面的程序代码要稍微修改一下!
代码如下:
有一些地方重新修改了一下。
CASE #M OF
1:
IF "S传感器" THEN
"B传送带" := 0;
#M := 2;
END_IF;
2:
#ZJ1 := 1;
IF #T[0].Q THEN
#M := 3;
END_IF;
3:
"机械臂左转" := 1;
//"L5灯" := 1;
IF "SQ5左右转到位" THEN
#ZJ2 := 1;
END_IF;
IF #T[1].Q THEN
"机械臂左转" := 0;
// "L5灯" := 0;
#M := 4;
END_IF;
4:
"吸盘" := 1;
//"L3灯" := 1;
#ZJ3 := 1;
IF #T[2].Q THEN
// "L1灯" := 1;
"机械手" := 1;
END_IF;
IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
#ZJ4 := 1;
// "L1灯" := 0;
END_IF;
IF #T[3].Q THEN
//"L2灯" := 1;
"机械手" := 0;
#M := 5;
END_IF;
5:
IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
#ZJ5 := 1;
// "L2灯" := 0;
END_IF;
IF #T[4].Q THEN
"机械臂右转" := 1;
#ZJ6 := 1;
END_IF;
IF #T[5].Q THEN
"机械臂右转" := 0;
#M := 6;
END_IF;
6:
"机械臂右转" := 1;
#ZJ7 := 1;
IF #T[6].Q THEN
#M := 7;
END_IF;
7:
"机械臂右转" := 0;
#ZJ8 := 1;
IF "吸盘" THEN
IF #T[7].Q THEN
"机械手" := 1;
#ZJ9 := 1;
#M := 8;
END_IF;
END_IF;
8:
IF #T[8].Q THEN
"吸盘" := 0;
"机械手" := 0;
#ZJ10 := 1;
END_IF;
IF #T[9].Q THEN
#M := 9;
END_IF;
9:
IF "SQ2料到位" THEN
"B传送带" := 1;
"机械臂左转" := 1;
#ZJ11 := 1;
#M := 10;
END_IF;
10:
IF #T[10].Q THEN
"机械臂左转" := 0;
#ZJ12 := 1;
#M := 11;
END_IF;
11:
IF #T[11].Q THEN
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5 := 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#ZJ10 := 0;
#ZJ11 := 0;
#ZJ12 := 0;
#M := 1;
END_IF;
END_CASE;
好的,现在我们再来看效果是否可以!
这里我们可以看到,效果实现了!
文章来源:https://www.toymoban.com/news/detail-769923.html
2.启动停止部分
好的!主要控制我们已经完成,下面就是启动停止部分!
2.在程序运行时如果按下停止按钮,程序会在循环完一次后回到原位停止操作,并且可以再次启动运行。
这里它要求,按下后运行一次后停止!到这里大家可以想一想要如何实现这个功能(实现方法可以放在评论区,大家一起讨论)
这里我用的是一个if 判断,在运行到最后一步的时候我们判断是否按下了停止按钮,如果按下就停止,没有按下就继续循环。
按下后再判断系统是否在运行,代码如下:按下后如果成立就将w赋值为1。
//停止按钮
IF "停止" THEN
IF #标志1 & "A传送带" OR #标志1 & "B传送带" OR #标志1 & "机械臂左转" OR #标志1 & "机械臂右转" OR #标志1 & "机械手" OR #标志1 & "吸盘" OR #标志1 & "SQ1下降上升到位" OR
#标志1 & "SQ2料到位" OR #标志1 & "SQ3抓起到位" OR #标志1 & "SQ5左右转到位" OR #标志1 & "S传感器" THEN
#W := 1;
END_IF;
END_IF;
程序在运行到最后一步时,来判断w是否是1,是1就停止,等待下次启动被按下;不是1就继续循环。
//判断是否按下停止
11:
IF #T[11].Q & #W = 1 THEN
"B传送带" := 0;
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5 := 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#ZJ10 := 0;
#ZJ11 := 0;
#ZJ12 := 0;
#M := 0;
#标志1 := 0;
END_IF;
IF #T[11].Q & #W = 0 THEN
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5 := 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#ZJ10 := 0;
#ZJ11 := 0;
#ZJ12 := 0;
#M := 1;
END_IF;
这里我们也来试一下效果:
3.急停复位部分
最后的最后就是我们的急停复位部分啦!在实际生成中如果出现紧急情况,急停按钮非常非常的重要!这里我们就来编写一下!(大家如果有好的想法和思路可以在评论区讨论哦!)
3.在程序运行时如果按下急停按钮,程序动作立即停止,当按下复位按钮后程序才能继续运行,在急停期间其他按钮无效。
这里我写的是将机械手运行那部分断开(和开路差不多),按下复位后再闭合,程序还可以继续运行!代码如下:
按下后标志2得电,将机械手部分断开!
//急停按钮
IF "急停按钮" THEN
#标志2 := 1;
"A传送带" := 0;
END_IF;
IF NOT #标志2 THEN
case of
//在case外面加一个标志2的取反
end_case;
end_if;
复位的时候再闭合就可以了!(这里因为A传送带不在case里面,所以放在这里进行停止了)
//复位按钮
IF "复位按钮" THEN
#标志2 := 0;
"A传送带" := 1;
END_IF;
好的!我们看下效果如何:
可以完成急停要求!
三、完整代码
//停止按钮
IF "停止" THEN
IF #标志1 & "A传送带" OR #标志1 & "B传送带" OR #标志1 & "机械臂左转" OR #标志1 & "机械臂右转" OR #标志1 & "机械手" OR #标志1 & "吸盘" OR #标志1 & "SQ1下降上升到位" OR
#标志1 & "SQ2料到位" OR #标志1 & "SQ3抓起到位" OR #标志1 & "SQ5左右转到位" OR #标志1 & "S传感器" THEN
#W := 1;
END_IF;
END_IF;
//急停按钮
IF "急停按钮" THEN
#标志2 := 1;
"A传送带" := 0;
END_IF;
//复位按钮
IF "复位按钮" THEN
#标志2 := 0;
//"B传送带" := 1;
"A传送带" := 1;
END_IF;
//接通延时定时器部分
#RTRIG[0](CLK := "S传感器");
#T[0].TON(IN := #ZJ1,
PT := T#0.5s);
#T[1].TON(IN := #ZJ2,
PT := T#0.5s);
#T[2].TON(IN := #ZJ3,
PT := T#0.5s);
#T[3].TON(IN := #ZJ4,
PT := T#0.5s);
#T[4].TON(IN := #ZJ5,
PT := T#1s);
#T[5].TON(IN := #ZJ6,
PT := T#1s);
#T[6].TON(IN := #ZJ7,
PT := T#0.5s);
#T[7].TON(IN := #ZJ8,
PT := T#0.5s);
#T[8].TON(IN := #ZJ9,
PT := T#1s);
#T[9].TON(IN := #ZJ10,
PT := T#1s);
#T[10].TON(IN := #ZJ11,
PT := T#1s);
#T[11].TON(IN := #ZJ12,
PT := T#2s);
IF NOT #标志2 THEN
//启动按钮
IF "启动" THEN
#标志1 := 1;
#W := 0;
#M := 1;
END_IF;
IF #标志1 THEN
"A传送带" :=NOT "S传感器";
END_IF;
//指示灯部分
IF #标志1 THEN
IF "机械手" THEN
"L1灯" := 1;
"L2灯" := 0;
ELSE
"L2灯" := 1;
"L1灯" := 0;
END_IF;
END_IF;
IF "吸盘" THEN
"L3灯" := 1;
ELSE
"L3灯" := 0;
END_IF;
IF "机械臂左转" THEN
"L5灯" := 1;
ELSE
"L5灯" := 0;
END_IF;
IF "机械臂右转" THEN
"L4灯" := 1;
ELSE
"L4灯" := 0;
END_IF;
END_IF;
//机械手执行动作部分
IF NOT #标志2 THEN
CASE #M OF
1:
IF "S传感器" THEN
"B传送带" := 0;
#M := 2;
END_IF;
2:
#ZJ1 := 1;
IF #T[0].Q THEN
#M := 3;
END_IF;
3:
"机械臂左转" := 1;
//"L5灯" := 1;
IF "SQ5左右转到位" THEN
#ZJ2 := 1;
END_IF;
IF #T[1].Q THEN
"机械臂左转" := 0;
// "L5灯" := 0;
#M := 4;
END_IF;
4:
"吸盘" := 1;
//"L3灯" := 1;
#ZJ3 := 1;
IF #T[2].Q THEN
// "L1灯" := 1;
"机械手" := 1;
END_IF;
IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
#ZJ4 := 1;
// "L1灯" := 0;
END_IF;
IF #T[3].Q THEN
//"L2灯" := 1;
"机械手" := 0;
#M := 5;
END_IF;
5:
IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
#ZJ5 := 1;
// "L2灯" := 0;
END_IF;
IF #T[4].Q THEN
"机械臂右转" := 1;
#ZJ6 := 1;
END_IF;
IF #T[5].Q THEN
"机械臂右转" := 0;
#M := 6;
END_IF;
6:
"机械臂右转" := 1;
#ZJ7 := 1;
IF #T[6].Q THEN
#M := 7;
END_IF;
7:
"机械臂右转" := 0;
#ZJ8 := 1;
IF "吸盘" THEN
IF #T[7].Q THEN
"机械手" := 1;
#ZJ9 := 1;
#M := 8;
END_IF;
END_IF;
8:
IF #T[8].Q THEN
"吸盘" := 0;
"机械手" := 0;
#ZJ10 := 1;
END_IF;
IF #T[9].Q THEN
#M := 9;
END_IF;
9:
IF "SQ2料到位" THEN
"B传送带" := 1;
"机械臂左转" := 1;
#ZJ11 := 1;
#M := 10;
END_IF;
10:
IF #T[10].Q THEN
"机械臂左转" := 0;
#ZJ12 := 1;
#M := 11;
END_IF;
11:
IF #T[11].Q & #W = 1 THEN
"B传送带" := 0;
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5 := 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#ZJ10 := 0;
#ZJ11 := 0;
#ZJ12 := 0;
#M := 0;
#标志1 := 0;
END_IF;
IF #T[11].Q & #W = 0 THEN
#ZJ1 := 0;
#ZJ2 := 0;
#ZJ3 := 0;
#ZJ4 := 0;
#ZJ5 := 0;
#ZJ6 := 0;
#ZJ7 := 0;
#ZJ8 := 0;
#ZJ9 := 0;
#ZJ10 := 0;
#ZJ11 := 0;
#ZJ12 := 0;
#M := 1;
END_IF;
END_CASE;
END_IF;
总结
以上就是本篇文章的内容啦!我们一起编写了机械手的控制部分,停止部分和急停部分!感谢大家的观看,谢谢!文章来源地址https://www.toymoban.com/news/detail-769923.html
到了这里,关于【factoryio】使用SCL编写 <机械手控制> 程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!