当前位置:首页 期刊杂志

Python在智能IO模块上的应用

时间:2024-07-28

万伟军

(江苏联合职业技术学院 无锡机电分院,江苏 无锡 214000)

0 引 言

目前,工业网络通信程序多采用C#编写,以实现上位机与智能模块建立的通信。Python语言具备简单易懂的编写模式和功能齐全的扩展库,易于实现工业网络通信程序的编写。

1 智能IO模块的介绍

智能IO模块采用意法半导体公司的STM32F407为控制核心,可实现16位输入信号采集和7位输出控制。输入/输出电路采用EL357NC进行信号隔离,以保证模块工作稳定。同时,智能IO模块采用MAX1487芯片实现串口通信,通过ARM程序实现主从设备间的RS485通信。该智能模块可代替PLC的基本功能,通过内部ARM较灵活的程序开发功能实现设备的智能化,并降低设备制造成本。

2 Python控制程序的编写

Python语言具有功能强大的第三方开发的库文件,可实现网络通信、界面显示等功能。Python功能库中可实现的Modbus通信协议有Modbus_tk、Pymodbus及Minimalmodbus。本文使用Modbus_tk库实现上位机与智能模块间的数据交换[1]。

2.1 Modbus_tk库中的函数分析

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]。

2.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定时任务框架。

2.3 输出控制程序举例

为实现交互界面,输出控制程序可采用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]。

3 结 论

本文采用Python的Modbus_tk库实现智能IO模块与上位机之间的数据通信,语言简洁易懂,且Python扩展库功能强大,可简单实现各种工业控制功能。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!