PLC串行通信,相信各位编程者都经常遇到,简单的通信任务应该不成问题。但如果是复杂频繁的通信,那么处理起来就不大容易了。
本帖以一个实例为基础简单讲解通信调度实现的原理,希望能对大家处理类似通信问题时有所帮助。实例中的主控设备是三菱PLC-FX3U,从设备是8台HSEN通用型4轴定位模块共32轴,PLC通过RS485和定位模块联系,通信协议是MODBUS-RTU。
这类通信虽说遵循某种通信协议,貌似只是普通的数据读写,但实质并非如此。普通的数据读写或控制,例如变频器的控制,除了运行参数的读写外,还包括运行、停止、改变运行速度等指令发送,只要通信正常完成,控制过程也就结束了。而定位运动的控制不只是运动指令的发送,还包括定位单元运动状态的监测,比如最为常见的定位控制过程——“当前的定位运动是否已完成,如果完成,则进行下一个动作”。‘定位运动是否已完成’‘温控系统的温度是否已到设定值’‘气压是否已达到工艺要求’等等这类信息如果是通过串行通信获得的,那主控系统就必须不断地向从设备查询。如果从设备数量不多,解决这样的问题可能难度不是很大,但如果如上面所述的这类实例,大量的运动指令发送,再加上轴运行状态的获取,如果只是以通常的编程方式来解决这样的问题,可能是思绪万千、困难重重。为此有必要考虑用一种新的思路来解决这类问题。这就是本帖提出的通信调度这概念。
百度百科对调度算法的解释是:操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源,这就是调度。本帖的通信调度有点类同于定义中的操作系统,它管理着PLC的串行通信设备这一有限资源,按照一定的原则选择通信请求来占用资源。因此,本实例的通信调度要实现的首个功能是合理有序地安排通信任务。在有限的资源下,如何避免通信冲突是通信调度一个非常重要的功能。此外,其他要实现的功能有把通信数据处理成符合通信协议的数据格式;组织发送;响应信息的接收;通信过程中异常情况的处理(例如对象设备没有响应,接收超时,从设备报告收到的数据有误,校验错误等等);把收到的数据处理成一定格式存放在指定地址。最后还有一个重要的功能就是如上文所说的获取用户关心的信息,这个获取过程并不需要用户提出请求,而是通信调度根据设置,在闲暇时自动发起通信,收集指定的信息(例如各轴的当前位置、当前的运动状态,硬件信息等等),供用户随时调用。
看下图一个使用通信调度的简单例程。例程的第一部分是一个相对直线插补的运动指令,这一指令的发送,只要设置好相关的运动参数,并置位“执行直线插补”即可,余下的事就交予通信调度处理了。例程的第二部分是在指令信息发送完成后,对指令的执行情况“完成直线插补”进行监测,“完成直线插补”这信息就是通信调度自动采集的。例程的第三部分就是在程序中调用通信调度这功能块。从这例程我们可以看到,在使用通信调度后,我们的编程基本上就不用考虑通信的问题了,程序简洁明了,思路清晰。