日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python snap7开发手册_python-snap7开发笔记

發(fā)布時(shí)間:2023/12/9 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python snap7开发手册_python-snap7开发笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。