Snap7是一個用於處理S7以太網協議,與西門子S7系列PLC通訊的開源通訊組件。支持與S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太網通信。
網絡上有一個基於Snap7開發的Python開源庫python-snap7,下面就具體介紹利用Python實現與S7-1200的通信。
1.安裝開源庫 python-snap
2. PLC端準備
IP地址設置,與PC同一網段;
注:本例使用TIA V13
3. Python程序開發
主要通過read_area和write_area兩個函數實現對PLC數據的讀寫
讀取M位存儲區數據:
read_area(area,dbnumber,start,size)
area:
area參數用於區分I、Q、M、DB存儲區:
areas = ADict({
'PE': 0x81, #input 輸入區
'PA': 0x82, #output 輸出區
'MK': 0x83, #bit memory 中間存儲區(M區)
'DB': 0x84, #DB區
'CT': 0x1C, #counters
'TM': 0x1D, #Timers
})
dnumber:0
start:起始地址
size:讀取長度
下圖舉例讀取S7-1200 %MW2的數據;
寫M位存儲區數據:
write_area(self, area, dbnumber, start, data)
area:0x83;
dnumber:0
start:起始地址
data:數據
import snap7
from snap7.util import * #對位操作的函數要導入該庫
import time
client = snap7.client.Client()
# IP地址,機架,槽位
client.connect('192.168.0.1',0,1)
#測試是否通訊成功
if client.get_connected():
print('連接成功')
else:
print('連接失敗')
a = bytearray(2) # 定義一個包含兩個字節類型的數組
a[0]=0x08
a[1]=0x02
#往M區起始爲2的地址寫入數據a
client.write_area(0x83,0,2,a)
還有一種方法,先讀取需要修改的數據,然後通過set方法修改其值,最後通過write_area寫入,這樣就不必按字節寫入了。
res = client.read_area(0x83,0,0,2)
set_int(res,0,128) # 128是寫入的值
client.write_area(0x83,0,0,res)
最後分享一個跑馬燈視頻: