时间:2024-07-28
万伟军
(江苏联合职业技术学院 无锡机电分院,江苏 无锡 214000)
目前,工业网络通信程序多采用C#编写,以实现上位机与智能模块建立的通信。Python语言具备简单易懂的编写模式和功能齐全的扩展库,易于实现工业网络通信程序的编写。
智能IO模块采用意法半导体公司的STM32F407为控制核心,可实现16位输入信号采集和7位输出控制。输入/输出电路采用EL357NC进行信号隔离,以保证模块工作稳定。同时,智能IO模块采用MAX1487芯片实现串口通信,通过ARM程序实现主从设备间的RS485通信。该智能模块可代替PLC的基本功能,通过内部ARM较灵活的程序开发功能实现设备的智能化,并降低设备制造成本。
Python语言具有功能强大的第三方开发的库文件,可实现网络通信、界面显示等功能。Python功能库中可实现的Modbus通信协议有Modbus_tk、Pymodbus及Minimalmodbus。本文使用Modbus_tk库实现上位机与智能模块间的数据交换[1]。
Modbus_tk库是一个全功能Modbus的Python扩展库,通过调用内部函数实现Modbus通信。Python的Modbus_tk库函数与Modbus协议部分功能码之间的对应关系,如表1所示。
通信本质上,Modbus是一种串口通信,主从设备间进行通信前必须建立链接。使用Modbus_tk库文件建立通信关系的程序,如下:
def connect():
logger=modbus_tk.utils.create_logger( "console ")
master=modbus_rtu.RtuMaster(serial.Serial(port= "C OM3 ",baudrate=19200,bytesize=8,parity= "N ",stopbits=1,xo nxoff=0))
master.set_timeout(5.0)
表1 Modbus功能码与Python的Modbus_tk库函数对照表
master.set_verbose(True)
logger.info( "connected ")
此程序中,通过modbus_rtu.RtuMaster()函数设定了串口、波特率及字节长度等。执行此程序,主从设备之间建立了通信关系,后续程序只需调用功能函数就能实现对应功能[2]。
为实现输入信号的显示与输出控制,可使用Python的tkinter进行GUI开发。为实现输入信号显示与标签,可使用Label控件。程序如下:
photo_r=PhotoImage(f i le= "r.gif ")
photo_y=PhotoImage(f i le= "y.gif ") #加载显示图片
lab0=Label(root,text= "X0 ")
lab0.place(x=10,y=10) #创建X0标签文字
label_x0=Label(root,image=photo_y)
label_x0.place(x=10,y=30) #X0无输入时,显示黄色指示灯
def input_x(): #输入检测与显示程序函数input_x()
connect() #使用connect()函数建立主从设备通信链接
logger.info(master.execute(1,cst.READ_DISCRETE_INPUTS,0,16))
in_x=master.execute(1,cst.READ_DISCRETE_INPUTS,0,16)
If in_x[0]==1: #判断X0是否有输入,有输入显示红灯,没输入显示黄灯
label_x0.conf i g(imag=photo_r) #显示红灯
else:
label_x0.conf i g(imag=photo_y) #显示黄灯
在master.execute(1,cst.READ_DISCRETE_INPUTS,0,16)语句中,master.execute()函数内部参数的具体含义,如图1所示。
图1 master.execute()函数内部参数的具体含义
模块地址由每个智能IO模块的内部ARM设定。本功能指令是读取Modbus离散输入量,读取地址从0开始,共读取16位数据。为保证实时读取输入数据,程序必须间隔一定时间执行input_x()函数。函数调用可采用多线程定时方式,也可使用Python的APScheduler定时任务框架。
为实现交互界面,输出控制程序可采用tkinter的Checkbutton控件。控制程序如下:
global y0
y0=IntVar() #创建变量y0
def y_out(): #输处控制程序函数y_out()
connect() #使用connect()函数建立主从设备通信链接
logger.info(master.execute(1,cst.WRITE_SINGLE_COIL,0, output_value=y0.get())
#创建复选按钮ck,并设定其属性,y0变量存储复选按钮设定值,同时调用y_out函数
ck=Checkbutton(text= "y0 ",variable=y0,command=y_out)
ck.place(x=10,y=120)
在logger.info(master.execute(1,cst.WRITE_SINGLE_COIL,0,output_value=y0.get()))语 句 中,master.execute()函数内部参数的具体含义,如图2所示。
图2 master.execute()函数内部参数的具体含义图
模块地址由每个智能IO模块的内部ARM设定。本功能指令是执行Modbus内部单线圈状态设定功能。单线圈地址确定了智能IO模块的输出口位置,即y0口。单线圈状态值由复选按钮设定值决定。复选按钮被选中,设定值为1;复选按钮未被选中,设定值为0。执行此程序,当Python编写的GUI界面中的复选按钮被选中时,智能IO模块的y0口导通[3]。
本文采用Python的Modbus_tk库实现智能IO模块与上位机之间的数据通信,语言简洁易懂,且Python扩展库功能强大,可简单实现各种工业控制功能。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!