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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/9 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开发笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。