萬偉軍
(江蘇聯合職業技術學院 無錫機電分院,江蘇 無錫 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擴展庫功能強大,可簡單實現各種工業控制功能。