PLC程序上载时以下错误的解析程序如下:
自动化研究结果内容编程内容:
一、编程时没有结合实际接线初学PLC时,大家都有一种惯性思维,会把接在PLC输入点的开关全部当作常开输入,这样写出来的程序非常接近电气原理图的控制电路。例如把自锁电路的控制部分交由PLC控制,我相信绝大多数初学者写出来的程序应该是这样的。很显然,这个程序下载至PLC将不能正常运行。PLC上电后,X1和X2都处于通电状态,对应到程序里的X1和X2常闭触点都将断开不导通,因此不管X0输入什么信号,Y0都不会有输出。解决办法就是,要么把外部电路的输入改为常开,要么程序中X1和X2改为常开触点。不过还是建议改程序,毕竟程序要依托在外围电路的正确连接之上。例如,设备中最常见的急停按钮就是接常闭触点的,写程序时要格外注意。
二、多线圈输出
这个问题在初学者身上最为常见,可以说90%的人都踩过这个雷。无非就两个原因,一个是不能很好掌握PLC的工作原理,一个是程序不规范导致。
虽然同一软元件的线圈可以在程序中出现两次或多次,但是双线圈输出时一般情况下是不允许的。注意,我说的是一般情况,比如X0点动控制Y0输出,我可以写成下面这种双线圈的形式,只是这种程序毫无意义而已。
三、子程序中不使用子程序专用定时器
三菱Fx3U中,配有8个可用于子程序使用的定时器:T192~T199(也可以当作普通的定时器使用)。子程序专用定时器在工程项目应用中并不多,它的作用就是在子程序停止调用时,还能在子程序中运行。
四、子程序中使用复位指令,假如在主程序中使用了计数器计数, 通过调用子程序的方式复位计数器,你会发现这个计算器再也计不了数了。其实这个问题在我教子程序时会特意去强调过,不要在子程序里面使用复位和边沿指令(除非你能很好的处理它们的逻辑关系),但是在后面讲电机测转速程序时,依然还是会有学员把复位高速计数器写在子程序里,导致程序不能调试。要分析为什么会出现这种情况,首先我们还是要熟悉PLC的工作原理——扫描周期(也叫运算周期)。以上图为例,系统进入子程序后,会执行[RST C0],之后返回调用处。此时系统已经将C0计数器复位了,但是系统并未扫描到执行[RST C0]的条件断开,因此在系统的判断里,将认为[RST C0]这条命令处于一直执行的状态,也就导致了C0一直处于被复位的状态,从而无法再次计数。
五、使用MOV指令复位计数器传送指令可以将计数器的当前值清零,但是无法复位计数器的触点,至于原因嘛~学过ST结构文本编程的就明白,这里就不讨论了。
六、在FB块中使用。
七、数据类型与指令不符
我们人类可以轻松地对比15和5这两个数,只要智力正常,都知道15<5。但是对于计算机(PLC也算是计算器,毕竟也符合冯诺依曼体系)来说,没那么简单。对于PLC来说,它只能对比同类型的数据,50和5在任何计算机设备都是天差地别的存在,这里就涉及到PLC的另一个基础知识——数据类型(之后有时间我会细讲这个内容)。整型数据和浮点型数据的存储方式不一样,以不同的数据读取方式读同一个寄存器里的数据,读出来的结果也是不一样的。而使用大多数指令时,都是默认为同一种数据类型调取寄存器的值,因此不同数据类型的数据不能混用。上图犯的错误就是用双整型比较指令比较浮点数和双整数,结果肯定是不对的。不过,三菱的FX3U也不存在浮点数比较指令,后续的FX5U填补了这一空缺。
八、浮点数有时不能直接用比较相等指令我们已经计算出011×26=0286,并把0286赋值于D0寄存器,再利用[LDE= D0 0286]触点比较指令输出Y0线圈,可结果呢?D0明明等于0286,按理这个触点应该是导通并输出Y0才对的,为什么会出现这种不输出的情况呢?上述“违反常理”问题的原因与浮点数的计算机表示方式有关。在小型的PLC(例如FX3U)中,只有单精度浮点数,使用的标准是IEEE-754标准(后期有时间,我会专门介绍),存在一种精度丢失,而且这种情况在任何计算机和任何编程语言都是无法避免的,主要在于十进制数转二进制数的进制转换不完全性引起的。例如,将065转换为二进制数得到(065)10=(010100110011001……)2,再往下换算将无限重复的算出“0011”,因此只能得到一个近似值,这就是浮点数的误差。上述的例子,我用另一种编程语言LabVIEW给大家看看计算机计算011×26会算出什么结果,看一下就明白为什么Y0不能输出了。
是的,计算机计算出来的结果是028600000000
九、寄存器编号重叠
这个问题也是经常出现,上图是某学员写的回原点程序,很明显是D0和D1已经组成了一个双整数类型的寄存器,再使用D1就属于寄存器重用的情况,只能跳过D1使用D2来存放下一个数据。犯过这个错误的,这里不过多赘述,先扇自己一巴掌。十、使用标签编程时不注意自动分配的软元件被占用,其实很多老师都不太乐意去教学生用标签编程,因为真的有人用不好这个东西,老师会教的比较累。但是我教,我比较喜欢有挑战的事情。言归正传,其实很好解决这个事情,要么用标签(包括数组)不要直接用软元件+编号的编程方式,要么修改自动分配软元件设置,两种办法全部奉上。啥~看不懂?还是那句话,以后有时间细讲,十一、编写定位相关程序时,同一轴的脉冲输出紧密衔接Emmm,直接看聊天记录,还是有不少学员问这个问题。我给大家简单描述一下,很多人在做同一个轴的多点定位控制时,刚执行完一条定位控制指令就立刻以这条指令的完成标志当做下一条定位指令的启动标志,这时候会发现第二条定位指令压根不起作用,原因还是和PLC的工作原理有关。比如这段控制Y0做两次相对定位的程序,就是一种“无缝衔接”的编程写法(这是个反面教材,别学这个)。当第一条DRVI指令结束时,置位了M11,复位了M10,此时PLC还未扫描到END,在系统看来,并没有把M10驱动的那条定位指令结束掉,而且又立刻启动了下一条DRVI指令,这时候系统就会认为我们同时执行了两条定位控制指令,因此无法执行。正确的处理方式,应该是在两条指令中间加入一定的停滞时间,祝您生活愉快,谢谢提问
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)