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