踩坑记,使用codesys梯形图编程实现方波输出

#程序员,使用梯形图踩坑记#

最近在做一个AGV铲车的工控和上位机程序,简单的说就是上位机下发指令,AGV按指定任务去搬运东西。

做的过程中,需要使用LD,就是梯形图实现在两个输出点,分别输出两个方波信号,两个信号互斥,不同时输出。

经过分析,感觉挺简单的一件事,用编程(ST)的思路:

IF 输出信号1 = true then

        如果是 高电平

                启用定时器1

                定时器1到时间,电平设置为低电平。

        如果是 低电平

                启用定时器2

                定时器2时间到 ,电平设置为高电平       

end_if

具体ST代码如下,实际上是没有问题的。(CSDN没有ST代码格式,所有显示不太正常)


IF s1 = TRUE THEN  //s1方波信号输出
	
	t1(in:=flag=FALSE,pt:=T#1S,Q=>);//高电平定时
	t2(in:=flag,pt:=T#1S,q=>);//低电平定时
	IF flag = FALSE THEN //	输出高电平
		s1out:=TRUE;//输出1s高电平
		IF t1.Q THEN
			flag := TRUE;//临时变量设置为tuue
		END_IF
	ELSE	//输出底电平
		s1out:=FALSE;//输出1s底电平
		IF t2.Q THEN
			flag:=FALSE;
		END_IF
	END_IF
END_IF


IF s2 = TRUE THEN  //s2方波信号输出
	
	t1(in:=flag=FALSE,pt:=T#1S,Q=>);//高电平定时
	t2(in:=flag,pt:=T#1S,q=>);//低电平定时
	IF flag = FALSE THEN //	输出高电平
		s2out:=TRUE;//输出1s高电平
		IF t1.Q THEN
			flag := TRUE;//临时变量设置为tuue
		END_IF
	ELSE	//输出底电平
		s2out:=FALSE;//输出1s底电平
		IF t2.Q THEN
			flag:=FALSE;
		END_IF
	END_IF
END_IF

但是由于项目需要用LD,就是梯形图去实现。所以按照这个思路,用LD给功能重新画一次。感觉应该问题不大。

所以第一版LD图:

运行以后,发现一s1out一直是高电平。t1定时器可以触发,到时间后,flag瞬间变成高电平,然后马上就复位成低电平,这样t1,就一直反复被激活,s1out,就一直高电平。看到这个结果一脸懵逼。经过简单的排除,以及调整(实际上整了一天),终于发现问题原因了。

原因就是:梯形图和编程的思路不太一样。

比如,实现信号1触发,信号二也触发。在程序逻辑就是:如果 信号1 = true then 信号2=true。如果信号1=false,那么 IF 条件不成立,也就是信号2=true,这条就不执行,但是如果信号2已经为true,就保持true不变。

但是用梯形图,逻辑就完全不一样了,如下图。s2out状态永远和s2同步。这点和上面红色字体不一样。

再回到刚才方波梯形图,问题出在t1定时器。当flag为false的情况下,定时器他被激活,1s以后,t1到时间,给flag设置为true。

flag变成true以后,t1定时器失效,但并不是ST代码里面,不执行这个语句。这个时候会给flag设置为false。也就是说瞬间又恢复成false。问题的根源在于flag设置为true以后,没法保持。

发现问题以后,就好解决,本质上是flag变成true以后,没法保持。所以下面t2定时器就没法触发。只要想办法保持flag=true就行。经过短暂思考(大约1小时),发现TOF可以解决这个问题。TON是定时开,使能以后,输出 点Q是由低到高。TOF是定时关。使能以后,输出点Q是先高后低。根据这个特性,重新写梯形图如下两个:

其实就是,当t1给flag设置为true的时候。t2定时器瞬间启用,然后给flag设置为true,相当于使用tof给flag保持1s时间,到1s以后,再给flag设置为flase。这个时候,又回到t1启用。

到这里,看似问题解决了。接着给另外一个方波梯形图如法炮制一下就行了。想想还挺简单的。于是,见下图。问题来了,为啥一个信号没有问题,两个就不行了。顿时十万个为什么就来了。

省略掉几秒钟的思考,发现了问题:上下两个图行,用的同一组定时器,t1和t2。上面s1给t1启用了,但是下面s2=false,又给t1禁用了。本质上还是,s2虽然没有导通,并不代表后面的不执行这是梯形图跟ST的区别。

知道问题的原因,那么解决问题就不难了,于是改进一下,见下图。改完以后,还是不行。经过思考,原来还有flag变量,上下也会影响。

于是,最终版的图:见下图。方波功能终于实现了。不过这每次都这样弄,似乎是有点傻,本着代码复用的原则,必须给这个功能封装一下,封装成一个函数块FB,简称装逼一下。

封装就很简单了,新建一个pou,类型是FB。给方波的梯形图画好。输入是使能,以及两个时间,输出是一个信号。封装见下图:

封装好,调用见下图。是不是感觉简单很多。

对于一个资深程序员来说,程序运行逻辑已经深入骨髓。LD梯形图的逻辑,确实需要时间去适应。经过这一天的折腾,对梯形图编程也理解差不多了。AGV小车也调试差不多了,在电工这条路上越走越远了。

最后发的时候,发现csdn居然没有自动化相关标签。希望管理员能增加上。先随便选一个机器人吧,因为这AGV,也能算一个机器人。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CoDeSys 是一种功能强大的PLC软件编程工具,它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。 CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSys是Controlled Developement System的缩写),在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(如Visual C++)。 现在国内PLC用户使用的版本多为CoDeSys V2.3, 最新的版本是CoDeSys V3。V3 在软件架构上有了很大的改善,朝安全软件的方向发展,目前正在申请TUV关于EN 61508的SIL认证。 CoDeSys软件还可以编辑显示器界面(Visualization),具有很多的控制模块(Motion),可以放置图片等强大的功能,典型的用户有ifm等。 CoDeSys功能总览:如何构建一个工程、怎么样构建一个工程、怎么样测试工程、调试、附加联机功能。CoDeSys的附加功能、工具等。 ABB Bachmann,IFM易福门,EPEC派芬,HOLLYSYS和利时,intercontrol的PROSYD1131,赫思曼公司iFlex 系列、力士乐的RC系列,TT control 公司TTC系列[1] 控制器等PLC厂家都是使用Codesys平台开发自己的编程软件的。 国内首家采用codesys平台的国产PLC 和声 HSC C3系列控制器也已大批量产业应用。 同时,也有运动控制厂家如:Scheider Electric, Banchman, GoogolTech在在使用Codesys平台开发自己的编程软件。 CoDeSys 软件商是德国Smart software solution GmbH,该公司位于德国巴伐利亚州肯普腾市。 这个是CoDeSys编程手册,中文版的。希望大家享用。
CODESYS(Cooperative Development System)是一种用于编写、组织和管理PLC(可编程逻辑控制器)应用程序的软件开发环境。CODESYS梯形图CODESYS中常用的编程语言之一。 梯形图是一种图形化的编程语言,用于描述PLC程序中不同的逻辑和功能关系。它类似于电气工程中的传统继电器线路图,通过连接控制元件和逻辑元件来实现不同的功能。梯形图的主要元素包括线圈(Coil)、触点(Contact)、常开(Normally Open)、常闭(Normally Closed)、AND门和OR门等。 梯形图的编写方式类似于绘制流程图,采用垂直排列的方式,从上到下逐步描述程序的逻辑流程。线圈表示输出元件,触点表示输入元件,常开和常闭表示逻辑元件,AND门和OR门用于组合不同的逻辑关系。 通过组合不同的梯形图元素,可以实现各种不同的功能,例如开关控制、传感器输入、定时器和计数器的应用。程序可以通过连接触点和线圈来控制不同的电气设备,实现自动化生产线、机械设备和工业控制系统的控制和监控。 使用CODESYS梯形图编程,可以简化PLC程序的开发和维护。CODESYS提供了丰富的梯形图元素库,开发人员可以根据需求选择适当的元素进行组合,快速实现复杂的控制逻辑。同时,CODESYS还提供了调试和在线监视功能,方便开发人员对程序进行调试和运行时监控。 总而言之,CODESYS梯形图是一种用于编写PLC程序的图形化编程语言,通过连接不同的元件实现各种功能。它简化了PLC程序的开发过程,并提供了丰富的调试和监控功能,是工业控制系统中常用的编程方式之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值