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建立连接并读写数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask 应用的文件结构
- 下一篇: python snap7怎么用_Pyth