首页 > 其他分享 >snap7读写PLC变量

snap7读写PLC变量

时间:2024-05-08 22:47:05浏览次数:21  
标签:snap7 int 读写 plc util bool PLC data

1. 读DB

'''
#copy snap7.dll & snap7.lib files to python root path first
pip install snap7
'''
import snap7
import struct
from snap7 import util
 
 
# 创建通讯客户端实例
plc = snap7.client.Client()
 
# 连接至PLC
plc.connect('192.168.0.1', 0, 1)
 
# 读取数据
data = plc.db_read(17,0,878)
 
# 关闭连接
plc.disconnect()

d1=data[0:256]
print(str(d1))

d2=data[256:768]
print(d2.decode('utf-16be'))

selfint=int.from_bytes(data[852:854],byteorder='big')
print(selfint)

# python解析
selfInt = int.from_bytes(data[852:854], byteorder='big')
selfReal = struct.unpack('>f', data[874:878])[0]
selfString = data[0:254].decode(encoding="ascii")
selfWString = data[256:].decode(encoding="utf-16be")
print("python自身函数解析:")
print(
    f"bool:{selfBool}; int:{selfInt}; real:{selfReal}; string:{selfString}; wstring:{selfWString}"
)
 
# snap7解析
snap7Int = util.get_int(data, 852)
snap7Real = util.get_real(data, 874)
snap7String = util.get_string(data,0, 254)
snap7WString = util.get_string(data,256,766)
print("snap7函数解析:")
print(
    f"bool:{snap7Bool}; int:{selfInt}; real:{snap7Real}; string:{snap7String}; wstring:{snap7WString}"
)

2. 写DB

'''
#copy snap7.dll & snap7.lib files to python root path first
pip install snap7
'''
import snap7
from snap7 import util
 
# 创建通讯客户端实例
plc = snap7.client.Client()
 
# 连接至PLC
plc.connect('192.168.0.1', 0, 1)
 
print("开始发送!")
 
# 写入bool
bool1 = 0    ##bool1--》第0个字节段的第1个位,就是偏移量为0.0的bool量的值
bool2 = 1
bool3 = 0
bool4 = 1
bool5 = 1
bool6 = 0
bool7 = 0
bool8 = 0
 
boolData = bytearray(1)
util.set_bool(boolData, 0, 0, bool(bool1))
util.set_bool(boolData, 0, 1, bool(bool2))
util.set_bool(boolData, 0, 2, bool(bool3))
util.set_bool(boolData, 0, 3, bool(bool4))
util.set_bool(boolData, 0, 4, bool(bool5))
util.set_bool(boolData, 0, 5, bool(bool6))
util.set_bool(boolData, 0, 6, bool(bool7))
util.set_bool(boolData, 0, 7, bool(bool8))
plc.db_write(211, 0, boolData)
 
# 写入int
intData = bytearray(2)
util.set_int(intData, 0, 5)
plc.db_write(211, 2, intData)
 
# 写入real
realData = bytearray(4)
util.set_real(realData, 0, 99.9)
plc.db_write(211, 4, realData)
 
# 写入string
# sss = 'qqq'
# print(len(sss))
# stringData = bytearray(len(sss) + 2)
# util.set_string(stringData, 0, sss, 256)
# stringData[0] = 254
# plc.db_write(211, 8, stringData)
string = 'db211'
data = int.to_bytes(254, 1, 'big') + int.to_bytes(len(string), 1, 'big') + string.encode(encoding='ascii')
#utf-8可以写中文,但是解码错误
#unicode不能写
#strBYTE长度只有254,剩下两个长度是头文件
plc.write_area(snap7.client.Areas.DB, 211, 8, data)
 
plc.disconnect()
 
print("发送成功!")

#PLC中,wstring---unicode格式/string----ascii格式

3. 写中文

import snap7
import struct
 
# 创建通讯客户端实例
plc = snap7.client.Client()
 
# 连接至PLC
plc.connect('192.168.0.1', 0, 1)
 
 
# 写入DB17.DBX878.0 —— bool值
plc.write_area(snap7.client.Areas.DB,17,878,bool.to_bytes(True,1,'big'))
 
# 写入DB17.DBW852
plc.write_area(snap7.client.Areas.DB,17,852,int.to_bytes(2001,2,'big'))
# plc.write_area(snap7.client.Areas.DB, 10, 2, struct.pack(">h", 112))
 
# 写入DB17.DBD874 —— real值
plc.write_area(snap7.client.Areas.DB,17,874, struct.pack(">f", 10.1))
 
# 写入P#DB17.DBX0.0 BYTE 256 —— string值
str = 'hello python'
#字符串第一个字节存的是最大字节数,第二个字节存的是当前占有的字节数,后面才是使用的字节数
data = int.to_bytes(254, 1, 'big') + int.to_bytes(len(str), 1, 'big') + str.encode(encoding='ascii')
plc.write_area(snap7.client.Areas.DB,17,0,data)
 
# 写入P#DB17.DBX256.0 BYTE 512 —— wstring值
str = '不吃火锅 就吃烤匠'
data = int.to_bytes(508,2,'big') + int.to_bytes(len(str), 2, 'big') + str.encode(encoding='utf-16be')
plc.write_area(snap7.client.Areas.DB,17,256,data)
 
# 关闭连接
plcObj.disconnect()

#Big,大小端模式中的大端模式
#python中不存在字符类型,字符也当作字符串处理

标签:snap7,int,读写,plc,util,bool,PLC,data
From: https://www.cnblogs.com/xiacuncun/p/18181072

相关文章

  • C#与PLC变量在数据交互上的一些探索
    1.基于C#的数据交互A.S7,usingS7.Net,后文读写数据时二次封装过S7协议,这里暂且不表,只列举S7协议最原始的应用。new一个PLC对象//idenfybasiclinkparamsprivatestringplc_ip;privateCpuTypeplc_type;privateshortplc_rack,plc......
  • 基于1500/1200 PLC的webserver---用户自定义页面
    1.创建html页面页面需要包含字符集信息:<metahttp-equiv="content-type"content="text/html;charset=utf-8">包含AWP命令的html文件,大小限制为64KB最简单的页面自动刷新:<metahttp-equiv="Refresh"content="10">2.AWP指令AWP命令公式中""之......
  • 232自由口转Profinet网关接AB扫码枪与PLC通讯案例
     232自由口转Profinet网关(XD-PNR100/300),是一种用于将自由协议转换为Profinet协议的设备,可以实现不同网络之间的通信和数据交换。232自由口转Profinet网关高度的灵活性和可靠性使其成为工业自动化领域的重要工具,并将其与Profinet网络无缝集成,实现数据的快速传输和交换。另外23......
  • C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)
    前言本文介绍了如何使用三菱提供的MXComponent插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考。 用到的软件:1.PLC开发编程环境GXWorks2,GXWorks2下载链接 https://www.mitsubishielectric-......
  • 232Modbus转Profinet网关接扫码枪与PLC通讯
    Modbus转Profinet网关(XD-PNR100/300)的主要作用是实现Modbus协议和Profinet协议之间的转换和通信。本案例是用Modbus转Profinet网关接扫码枪与PLC通讯,扫码枪通常通过特定的接口与计算机或其他设备传输数据,而PLC(可编程逻辑控制器)则通常使用Profinet等工业通信协议。要将扫码枪通过......
  • 长江存储PC411 512GB SSD实测:旗舰读写性能 温度表现逆天
    一、前言:搭载长江存储PC411512GBSSD的机械革命蛟龙16S不久前我们测试过某品牌的笔记本,其搭载的PCIe4.0SSD在高负载运行时温度轻松突破70度,导致性能下降了20%左右。对于笔记本而言,由于无法像台式电脑那样给SSD安装厚重的散热装甲,在搭载高性能PCIe4.0SSD时,很容易出现温度失......
  • PLC程序中的配方应用
    建立ARRAYDB集合配方需要的所有元素结构,组成一个UDT(包含范围最全)新建一组ARRAYDB,元素的个数就是配方需要的副本的个数数组DB勾选仅存储在装载内存中,以便数据量大的配方不占用数据工作存储器空间,节省资源在ARRAYDB的起始值处填写配方的具体值1200不支持ARRAYDB,所以用普......
  • 利用PLC扫描周期实现一些小技巧
    上升沿//pulsegenerateIF#my_singalANDNOT#pulse_boolTHEN;END_IF;#pulse_bool:=#my_singal;数值记忆,记录当数值变化时事件//memory,my_order由外部主动触发IF#my_order<>#memory_orderTHEN;END_IF;#memory_order:=#my_order;清数据之......
  • Qt Excel读写 QXlsx的安装配置以及测试
    引言Qt无自带的库处理Excel文件,但可通过QAxObject借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库:QXlsx,一个基于Qt库开发的用于读写MicrosoftExcel文件的C++库。它提供了一组简单易用的API,可以方便地创建、修改和操作Excel文件。一、安装配置1.下载源码,如下图所......
  • Qt Excel的读写
    在Qt中,可以使用第三方库来处理Excel文件,常用的库包括:QXlsx:一个基于Qt的Excel文件处理库,支持读写Excel文件。LibXL:一个商业的Excel文件处理库,支持多种编程语言,包括C++。OpenXLSX:一个开源的Excel文件处理库,支持读写Excel文件,支持多种操作系统。下......