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

歡迎訪問 生活随笔!

生活随笔

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

python

Python基于Snap7与PLC建立连接并读写数据

發布時間:2023/12/9 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基于Snap7与PLC建立连接并读写数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?最近偶爾在網上看到可以用Python通過snap7與PLC建立連接并讀寫數據,好多小伙伴沒有現成的PLC,這里介紹一個電腦模擬PLC與python通訊。效果與實際情況一樣的。這里是以SIEMENS的PLC為例,通過Pycharm與TIA V17建立連接,對其DB塊、M區、Q區、I區讀寫數據。后面還添加了200系列V區的讀寫數據。請注意在程序中個別只對200專用!200系列的PLC不能模擬,也就不能用那個通訊工具了,直接與PLC通訊就好了。

一、安裝Snap7安裝包

1、在下載的1.4.2文件夾中找到文件

2、將這兩個文件拷貝到python的安裝目錄include中

3、cmd中輸入 pip?install python-snap7,打開pycharm查看snap7是否安裝成功,然后導入snap7包

二、安裝SIEMEN的編程軟件TIA V17

按照參考鏈接打開TIA V17仿真,建立好變量連接在線:

三、西門子PLC連接工具NetToPLCsim,修改IP地址和端口

4、以管理員身份打開NetToPLCsim軟件,如果102端口被占用,會提示重新獲取102端口,在彈窗里點擊【是】。

等待端口修改成功。

點擊【Add】,填寫電腦和PLC設備的IP地址,電腦和PLC設備的IP地址最好一樣。

填寫完畢后點擊【Start Server】。

四、測試程序

運行程序就可以測試是否可以讀取PLC中數據和寫入PLC數據,以下是測試代碼,在參考文章中讀寫都是用區域代碼,但是實際測試無法匹配到區域代碼。還有讀寫DB塊和M區、Q區、I區的方法稍有不同需要注意。

import snap7 from snap7.util import *plc = snap7.client.Client() plc.set_connection_type (3) #(200專用)# 定義Plc連接 def plc_connect(ip, rack, slot):plc.connect(ip, rack, slot)if plc.get_connected():print("連接成功")# PLC斷開連接 def plc_disconnect():plc.disconnect()# DB塊的讀操作 def dbRead(dbnum, dblength):data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)print(get_int(data, 0))print(get_bool(data, 2, 0))print(get_dword(data, 4))print(get_real(data, 8))print(get_bool(data, 0, 0))print(get_byte(data, 2))# DB塊的寫操作 def dbWrite(dbnum, dblength):data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)# set_int(data, 0, 20)# set_bool(data, 2, 0, False)# set_dword(data, 4, 1000)# set_real(data, 8, 11.3)# set_int(data, 12, 99)set_bool(data, 0, 0, False)# set_byte(data, 2, 2)# set_int(data, 4, 100)plc.write_area(snap7.types.Areas.DB, dbnum, 0, data)print('寫入成功!!!')# M區的讀操作--------bool def mRead(byte, bit):data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)print(get_bool(data, 0, bit))# M區的讀操作--------int/word/dint/dword def mRead(byte):data = plc.read_area(snap7.types.Areas.MK, 0, byte, 2)print(get_int(data, 0))# M塊的寫操作---------bool def mWrite(byte, bit, value):data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)set_bool(data, 0, bit, value)plc.write_area(snap7.types.Areas.MK, 0, byte, data)# M塊的寫操作---------int/word/dint/dword def mWrite(byte, value):data = plc.read_area(snap7.types.Areas.MK, 0, byte, 4)# set_int(data, 0, value)set_dint(data, 0, value)plc.write_area(snap7.types.Areas.MK, 0, byte, data)# Q區的讀操作-------------bool def qRead(byte, bit):data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)print(get_bool(data, 0, bit))# Q區的讀操作-------------int/word/dint/dword def qRead(byte):data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)print(get_int(data, 0))# Q區的寫操作----------bool def qWrite(byte, bit, value):data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1) # read_area的SIZE參數,這里默認位一個字節set_bool(data, 0, bit, value)plc.write_area(snap7.types.Areas.PA, 0, byte, data)# Q區的寫操作----------int/word/dint/dword def qWrite(byte, value):data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2) # read_area的SIZE參數,這里默認位一個字節set_int(data, 0, value)plc.write_area(snap7.types.Areas.PA, 0, byte, data)# 輸入映象區的讀操作-------bool def iRead(byte, bit):data = plc.read_area(snap7.types.Areas.PE, 0, byte, 1) # Size參數,這里我們定義為1個字節的長度print(get_bool(data, 0, bit))# 輸入映象區的讀操作-------int/word/dint/dword def iRead(byte):data = plc.read_area(snap7.types.Areas.PE, 0, byte, 2) # Size參數,這里我們定義為1個字節的長度print(get_int(data, 0))# V區的讀操作 ------bool/int/word/dint/dword(200專用) def read_Vblock(num, length):"""@param num: 字節地址@param length: 字節長度@return:"""vb_data = plc.db_read(1, num, length)print(vb_data[length-1])# V區的讀操作 ------bool/int/word/dint/dword(200專用) def write_Vblock(num, value):"""@param num: 字節地址@param value: 寫入值@return: """data = int(value)if data < 0 or data >255:print('請輸入正確的數值!')elif 0 < data < 16:temp = 7*'0' + hex(int(data))[2:]else:temp = 6 * '0' + hex ( int ( data ) )[2:]datanum = bytes.fromhex(temp)plc.db_write ( 1, num, datanum )if __name__ == '__main__':plc_connect('192.168.1.10', 0, 1)dbRead(1, 4)dbWrite(1, 4)mRead(20, 2)mRead(100)mWrite(20, 6, True)mWrite(22, 100)qRead(100, 5)qRead(200)qWrite(100, 5)iRead(99, 7)iRead(122)read_Vblock(4, 4)write_Vblock(100, 132)plc_disconnect()

TIA V17 鏈接:https://pan.baidu.com/s/1vfzzDhqKLy49pl9V0AINsA? ? 提取碼:hmn8

西門子PLC連接工具 ,NetToPLCsim;NetToPLCSim download | SourceForge.net

Snap7 鏈接:?https://pan.baidu.com/s/1--Zhwj1gs417rpLrpV1QKQ? ? ?提取碼: qtnm

參考:通訊測試工具和博圖仿真機的連接教程

? ? ? ? ? ?Python讀寫PLC

總結

以上是生活随笔為你收集整理的Python基于Snap7与PLC建立连接并读写数据的全部內容,希望文章能夠幫你解決所遇到的問題。

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