APP下载

基于Python的龙骨成型机通信方案设计

2019-06-17周任杰张子立朱志松

计算机应用与软件 2019年6期
关键词:工控机龙骨线程

周任杰 刘 宇 张子立 朱志松

(南通大学机械工程学院 江苏 南通 226019)

0 引 言

轻钢别墅作为一种钢结构住宅,具有“无支撑、钢柱变断面、结构布局灵活、抗震性能好、屋面轻型化”五大优点,在国内外应用日益广泛,形成了较为成熟的生产链及产业体系[1-2]。轻钢别墅骨架的加工设备是龙骨成型机,由工控机、下位机及机构组成。工控机实现龙骨加工数据解析、设备参数设置、加工过程的检测和反馈等功能,通过建立通信实现数据传输;下位机采用松下PLC执行机构动作;机械设备由模具、机身、输料装置、液压系统等组成。三部分相互配合加工龙骨。

为实现机器稳定加工,工控机与下位机间的通信必须稳定可靠。同时为保证工控机的便携性和布局的便利,厂家提出基于Wi-Fi通信的要求。Wi-Fi通信的优点为无线电波覆盖范围广,传输速率高,提高工控机的便携性,无需布线,避免复杂线的连接,实现一定距离上工控数据的交换[3]。在带来便利的同时,网络安全成为隐患,当传输距离加大时,外加电磁等的干扰,通信质量大幅下降[4]。

1 龙骨成型机通信方案设计

龙骨成型机通信系统构架如图1所示[5]。工控机、Wi-Fi通信模块、下位机分别构成龙骨成型机通信系统的客户应用层、数据通信层、与硬件层。在数据通信层,基于Python语言,选择Socket作为通信的端点,从Socket发送和接收数据,比其他通信协议更安全可靠[6]。Socket分为基于TCP的流式套接字和基于DUP的数据报式套接字,经过三次握手建立连接。本通信方案采用基于TCP的流式套接字,实现工控机与下位机间的本地通信[7],工控机作为客户端(Master),PLC作为服务端(Slave)。龙骨成型机的加工速度为40 m/min,连续高速运行过程中不能出现卡顿现象。由于上下位机数据传输密集,为避免通信成为整机运行的速度瓶颈,基于生产者消费者模式,分别设计三种方案:采用单进程、多线程以及多线程与多进程相结合的通信方案。

图1 龙骨成型机通信系统构架

1.1 Mewtocol通信协议

松下PLC与工控机间进行数据交换采用Mewtocol通信协议。Mewtocol协议要求通信报文为对应格式的指令,指令格式如图2所示。每一帧指令包含:起始位、站号高低位、指令代码、文本代码、校验码、结束位。起始位为字符“%”;站号高低位在工控机与多个PLC通信时设置,代表PLC序号;指令代码为读写不同状态、不同内容寄存器的指令;高低两位校验码,用来校验数据传输过程中是否出现乱码或者数据丢失;使用回车符作为结束位[8]。

工控机与松下PLC的传输数据包括龙骨加工数据的下发与工控状态寄存器的读取,其中下发数据包括模具号、孔距、加工序号等,PLC上传数据包括模具工况、传感器状态、加工结束标记等。按照图2所示指令格式,以分别向下位机松下PLC中DT1至DT3的连续3个寄存器中分别写入数据0500、0715、0009为例,编写指令为:“%01# WDD000100030500071500095DCR”,指令字符串经过Socket封装发送至下位机,PLC接收指令后数据写入相应寄存器,控制油缸动作并发送应答信息。若工控机收到的应答指令为“%0 $WD13CR”,则写入正确;若收到的应答指令为“%01!WD13CR”,则写入不正确,数据丢失或其他异常[8]。

图2 指令格式

1.2 通信系统硬件构成

龙骨成型机通信系统硬件由5G Wi-Fi路由器、工控机、松下PLC组成,工控机与松下PLC接入路由器完成硬件系统连接。松下PLC提供AFPX-COM5模块与RS232模块。RS232串口通信距离较短,通信质量不稳定,易受外部环境干扰,为保证通信质量与效率,提高通信距离,采用RS232转以太网模块接入基于Wi-Fi的以太网总线。松下PLC通过AFPX-COM5模块在以太网中与工控机完成加工指令的接收与执行;通过RS232转以太网模块将传感器数据与现场工况传回工控机。相应硬件组成示意图如图3所示[8]。

图3 通信系统硬件组成示意图

2 通信方案的比较与分析

2.1 单进程的通信方案

以龙骨成型机加工过程为例,工控机解析工艺数据,生成加工指令后发送到下位机,下位机指令执行结束后将执行状况反馈给工控机,确保上一条指令执行完毕后,工控机继续生成下一条加工指令并传输[9]。加工过程中单条指令创建与执行过程如图4所示。

(a) 工控机发送指令 (b) 下位机发送指令 (c) 工控机接收指令图4 加工指令过程

若多次发送与接收指令,Socket只需创建一次,创建Socket过程如下:

tcpCliSocket=socket(AF_INET,SOCK_STREAM)

tcpCliSocket.settimeout(10)

tcpCliSocket.connect(ADDR)

BUFSIZ=512

try:

tcpCliSocket.send(data_send)

data_recv=tcpCliSocket.recv(BUFSIZ)

except:

tcpCliSocket.close()

break

创建名为tcpCliSocket的Socket套接字,AF_INET指定使用IPv4,SOCK_STREAM为流式套接字。使用Connect方法建立Socket,连接到本地地址,使用settimeout设置连接超时时间。Socket通过Send()方法发送数据data_send;通过Recv()方法从缓冲区接收数据data_recv;使用close()函数断开Socket连接。其中,ADDR为地址,HOST为服务器的主机名,PORT是端口号,BUFSIZ为设置的缓冲区大小。

本方案为同步通信方式,主界面与通信主界面与通信进程在一个进程中,采用try/except语句处理程序正常执行过程中出现的一些异常情况,减少Socket阻塞状态的出现。龙骨成型机为顺序加工,加工进程需要等待通信数据,加工中会出现卡顿现象,效率较低。

2.2 使用多线程的通信方案

由前述通信方式可知,工控机同时完成对加工指令的下发与下位机各参数的实时反馈,应采用异步方式提高效率。利用不同线程间的自动切换,在后台交替运行处理数据,多线程的使用无疑能够充分有效地提高程序执行[10],使龙骨成型机的通信、跟踪、检测等功能同时进行。本通信方案流程图如图5所示[11]。

图5 使用多线程的通信方案

多线程通信方案设计思路:创建线程池,设置线程池允许运行的线程函数个数,建立Socket连接。将读写的功能函数分别包装为线程函数,使用实例化队列Queue作为线程函数的参数,将界面进程的数据通过队列Queue的put()函数传入线程函数,在线程函数中通过队列Queue的get()函数取出数据,完成数据的传入。

采用信号与槽,传出线程函数中数据,将数据从通信线程中传到工控机界面进程。首先声明信号变量,设置其参数类型为str字符串类型,创建信号与槽函数的连接。传出数据时,emit信号,触发信号与槽机制,执行槽函数,data作为参数输出到界面进程中,工控机主界面根据data数据判断工况并实现加工过程跟踪。其中,self.slot为槽函数名称,data为线程中需传出的数据。实现方法如下:

signal=pyqtSignal(str)

signal.connect(self.slot)

signal.emit(data)

本方案中龙骨成型机在加工时无需等待通信数据,龙骨加工与工控状态监测并行处理,通信数据读写与界面更新同时进行,提高加工速度,缺点是线程函数较多时,影响CPU的处理效率,实际生产中数据传输频率较高时,偶尔有卡顿现象,而且由于Python存在GIL,需要防止线程死锁情况的发生[11]。

2.3 多线程与多进程相结合的通信方案

考虑到前述多线程方案的不足,单独设置不影响主界面进程的通信进程能大大提高系统的扩展性和稳定性[12-13]。本方案采用多线程与多进程相结合,借助Python的future模块,绕开GIL,利用主进程之外的CPU核心。基于生产者消费者模型,多进程负责生产数据,由于进程间无法通过信号槽机制通信,借助线程安全的队列Queue共享数据,引入多线程负责查询和读取Queue,并通过信号槽机制传递给主界面,实现生产者与消费者的解耦合,提高程序的整体处理数据的速度与效率[14-15],数据传输路线图如图6所示。

图6 数据传输路线图

将读写的功能包装为进程函数,队列Queue作为参数,读写指令通过Queue的入队出队,完成与PLC间数据的交换。使用如下方法创建进程,其中w=work(),实例化通信进程类,w.communication调用实例化类中通信函数,并完成龙骨加工状态信息的指令编码解码,q_Processwrite,q_Processread为实例化队列Queue,分别作为参数传入进程。q_Processwrite作为写入队列,存放龙骨成型机加工指令;q_Processread作为为获取队列,存放获取加工状态指令。

p=Process(target=w.communication,args=(q_Processwrite,q_Processread))

p.start()

进程间使用多线程中转程序完成数据的传输与交换。多线程中转程序创建线程池,借助信号和槽机制,在加工中每有一个数据出队时,线程发送包含数据的信号给槽函数,将加工状态和信息反馈到主界面进程,完成龙骨成型机UI界面对加工过程的实时跟踪[16]。主界面将需加工数据入队,通过线程函数生成加工指令,将加工指令存入进程函数参数,完成数据的传入。线程池创建方法如下:

pool=ThreadPoolExecutor(2)

t_write=pool.submit(fun_write,q_write)

t_read=pool.submit(fun_read,q_read)

其中,t_write为获取数据的线程函数,t_read为发送数据的线程函数,fun_read、fun_write分别为读写函数。fun_write根据q_write传入的龙骨加工数据(孔距、加工序列等)放入q_Processwrite。fun_read利用信号与槽机制将q_read中的工况数据emit到主界面进程中,实现加工监测。

本方案中主界面进程与通信进程相互独立,充分利用CPU多核优势,避免通信延迟。结合多线程中转,龙骨加工进程无需等待数据。数据获取快速高效,主界面不卡顿。

根据上述三种方案在实际生产中的效果分析,龙骨加工时,使用多线程与多进程相结合的通信方式,加工过程无卡顿,工况最稳定,符合预期要求。在通信环境较为恶劣的情况下,前两种方案卡顿明显,方案三无明显卡顿,能够满足生产需要。因此最终采用多线程与多进程相结合的通信方案。

3 结 语

本文介绍了龙骨成型机的系统结构与加工过程,基于Wi-Fi通信,提出了三种通信方案,并使用Python语言实现。经过实验测试与分析,最终采用了基于Mewtocol协议的多线程与多进程相结合的通信方案。实验结果标明,该通信方案结合多线程与多进程优点,规避缺点,能够按照“生产者与消费者模式”实现既定的通信与加工同时进行,稳定可靠,数据传输迅速,实际生产出的龙骨完全可装配为轻钢别墅,生产过程简单可靠便捷。

猜你喜欢

工控机龙骨线程
5G终端模拟系统随机接入过程的设计与实现
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
架龙骨
龙骨治百病?言过其实
一种建筑钢结构龙骨连接结构
龙骨中的秘密
普通台机替代工控机成功应用
印刷网络化解决方案中工控机系统的设计与实现
控制舱测试系统及其BIT设计