python snap7开发手册_python-snap7开发笔记
開發筆記1.0
如何通過python與西門子1500plc進行通訊
anaconda與snap7的安裝
snap7庫使用詳解
read_area()
地址信息:
DB塊地址:
字節地址:
字節長度:
示例如下:
write_area()
讀字節:
修改位數據:
寫入修改后的數據:
擴展內容
如何通過python與西門子1500plc進行通訊
入行自動化小半年,因為有圖像處理和plc控制兩方面協調的需求,而筆者之前主用python,因此對此進行了一段時間的探索,也走了很多彎路,寫個筆記給自己也給后來者。
anaconda與snap7的安裝
在尋找可用的通訊模塊這方面,筆者陸陸續續試了很多,最后還是選擇了snap7,如果有更方便的模塊,歡迎討論。
開發環境的配置是老生常談了,相關博客非常多,不再贅述,只說幾點需要注意的事項:
首先,snap7的安裝,我不是太清楚怎么修改anaconda的庫源,反正使用pip可以安裝snap7,但是使用conda就找不到,解決方法是使用anaconda自帶的Anaconda Prompt輸入:
pip install python-snap7
注意python字段不要落下
其次,snap7安裝結束后需要把snap7-full-1.4.2\release\Windows\Win64目錄下的dll文件和lib文件放至Anaconda的安裝目錄和系統windows下的SysWOW64下。
snap7庫使用詳解
這一步踩了很多坑,我也不是想針對某些博客,但是很多人壓根就沒有實驗過代碼,把別人的復制一遍就成了一篇技術博客,斷章取義,以訛傳訛,對后來者造成了很大的麻煩。
本段只說方法,由于項目特殊性,不便截圖。
開門見山:
import snap7
my_plc = snap7.client.Client()
my_plc.connect('192.168.0.10',0,1)#IP地址,第二個數字非0即1,第三個數字是cpu的機架號,請去plc控制柜查看
三句話建立對象,之后我們就可以使用read_area與write_area對plc內存數據進行讀寫,實現通訊。
在進行以下工作之前,必須著重強調一點:基于python的snap7只能對內存里整段的字節進行讀寫,而不可以直接操作具體的位。
read_area()
示例:
i_pre = my_plc.read_area(129,0,20,1)
四個參數分別代表地址信息,DB塊地址,字節地址,字節長度
地址信息:
129 – I區,130 – Q區,131–M區,132–DB塊,目前主要用的是這四塊。
DB塊地址:
對于IQM區,該數字為0,對于db塊,該數字為db塊的地址。
字節地址:
整數字節起始地址。
字節長度:
指向后讀取的字節長度,一般針對位讀取的話,填1即可,針對整數字節int32或int64等,需要酌情增加。
示例如下:
i_pre = my_plc.read_area(129,0,20,1)#表示I20.0為起點,向后讀取1個字節
q_pre = my_plc.read_area(130,0,20,2)#表示Q20.0為起點,向后讀取2個字節
m_pre = my_plc.read_area(131,0,20,3)#表示M20.0為起點,向后讀取3個字節
db_pre = my_plc.read_area(132,20,2,1)#表示DB20為起點,地址偏移量為2,向后讀取1個字節
通過字節讀取之后的數據需要進行轉換,轉換之后會得到一個數組,拿出數組內相應的數字就是能夠被處理的8位整數:
import struct
i = struct.unpack('!B',i_pre)[0]
再通過字節位讀取得到我們想要的開關量,筆者并沒有找到字節位讀取相關的模塊,所以采用以下方法:
右移–取模
#輸入字節和地址偏移量
def read_bit(num,bit):
out = num>>bit
if out%2 == 0:
return False
else :
return True
如果有更方便的做法,歡迎討論
至此,read_area()模塊用法的坑幾乎都填上了,基于以上流程,可以完成I、Q、M、BD區所有數據的字節讀取與位讀取及其相關函數編寫。
write_area()
write_area()模塊要比read_area()模塊復雜些,由于python-snap7無法對位進行操作,因此int數據的寫相對容易,而位數據寫的操作就必須遵循以下流程:讀字節–修改位數據–寫字節
首先我們先理解write_area()函數的參數含義,示例:
my_plc.write_area(129,0,20,out_pre)
四個參數分別代表地址信息、DB地址、字節地址、寫入數據
前三個參數同read_area(),寫入數據則是打包后的字節數據。
在對write_area()模塊參數了解后,我們繼續完善開關量寫入數據的全部流程:
讀字節:
沒啥好說的,利用前文的read_area()模塊讀取字節數據并使用unpack方法獲得整數數據
修改位數據:
拿到8位整數之后,我們需要對其中的某個位進行修改而不改變其余字節的數據,筆者依舊是沒找到相應的模塊,采用的以下方法:
#輸入字節數據,需要修改的位地址,需要修改的位參數,輸出修改后的字節數據
def write_int(num,bit,boolnum):
out = num>>bit
if boolnum == False:
if out%2 ==0:
return num
else:
return num - 2**bit
else:
if out%2 ==0:
return num + 2**bit
else:
return num
如果有更加方便的做法,歡迎討論
寫入修改后的數據:
拿到修改后的數據,采用pack()方法將數據打包再發回plc:
out_pre = struct.pack('!B',byte_num)
my_plc.write_area(131,0,20,out_pre)
以上就是位數據寫入的流程,如果是整數數據的話,只需要進行第三步即可,如果是好幾個字節的數據,那就依次右移8位,依次寫入
擴展內容
主要模塊read_area()和write_area()掌握之后,就可以對plc內存區進行讀寫。
此外,筆者在開發期間,遇到了負數的傳輸,plc里負數按照補碼存儲,在傳輸之前需要對數據進行補碼計算。
筆者經驗尚淺,所有內容均為自學,若有錯漏,還請各位小伙伴們及時提醒。
總結
以上是生活随笔為你收集整理的python snap7开发手册_python-snap7开发笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族MX4的线控电路图
- 下一篇: python-snap7使用说明