python-整理-logging日志

本文详细介绍Python的日志模块logging的使用方法,包括配置文件Logging.ini的设置与解析,以及如何通过MyLog类来实现日志记录。文章还提供了一个完整的示例,展示了如何创建自定义的日志对象,并将日志输出到文件。

python的日志功能模块是logging 功能和使用方式非常类似于log4

如何使用logging:

# 导入日志模块
import logging
# 使用配置文件设置日志时,需要导入这个模块 import logging.config
class MyLog: '''日志类,用于将日志信息写入到.txt文件中''' # 载入配置信息,从Logging.cfg __loadcfg=logging.config.fileConfig("Loggers/Logging.ini") # 获取一个logger对象,通过这个名字参数可以保证在当前程序进程中其它地方获取日志对象时,是同一个日志对象. __dblog=logging.getLogger('dblog') @staticmethod def AddLog(msg,logrefname=None): '''// 添加日志 // 1.msg:日志内容 // 2.logrefname:通过这个名字获取日志对象,默认是dblog.其它名字要到配置文件里查看 ''' if logrefname is not None: MyLog.__dblog=logging.getLogger(logrefname) MyLog.__dblog.debug(msg)

使用时调用 MyLog.AddLog(logmsg)就加入日志了.

以下是配置文件Logging.ini

# 这是python的logging日志模块的配置文件
# 遇到的问题有几个:使用logging.config.fileConfig("Logging.ini")载入后,启动程序
# 1.报错.KeyError Formatters 在网上查了很久,说是日志路径的问题,结果就是路径问题
# 2.报错gbk... 用的是VS2013,新建的python文件不是utf-8编码,需要改一下编码.可是对于这个Logging.ini,居然要改回gb2312(936).不改的话就报这错误.

# 指示日志引用名,通过这个名字,能找到同一个日志对象
[loggers]
keys=root,dblog

# 指示日志的输出,可以输出到控制台,文件,发Email,输出到SOCKET等等
[handlers]
keys=handroot,handdb

# 指示日志输出格式
[formatters]
keys=formroot,formdb

# root日志对象,这个相当于父类,必需要有
[logger_root]
level=NOTSET
handlers=handroot

# 这是自己建立的日志对象,propagate=0表示不继承父类,=1表示继承.(研究后得出结论:如果选继承,日志也会输出到父类的handler上)
[logger_dblog]
level=DEBUG
handlers=handdb
propagate=0
qualname=dblog

[handler_handroot]
class=StreamHandler
level=NOTSET
formatter=formroot
args=(sys.stdout,)

# 这使用了回转日志(class指示使用的是哪个hander,logging有很多handler),就是当日志达到一定大小后,会另建一个新文件
[handler_handdb]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=formdb
args=('dblog.txt', 'a',2048)

[formatter_formroot]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

# 关于formatter类的详细情况,请查看本机文档在d:/python学习中有链接
[formatter_formdb]
format=%(asctime)s 类型 : %(name)s 内容 : %(message)s
datefmt=%Y-%m-%d %H:%M:%S
class=logging.Formatter

也可以在代码中配置日志,使用这个方法载入配置

logging.basicConfig()

一个非常详细的日志使用请看这里

http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

 

转载于:https://www.cnblogs.com/mirrortom/p/5198433.html

<think>好的,用户现在想了解如何使用python-snap7库与PLC进行数据交互。之前他们问过YOLOv5和PLC通信的问题,现在具体到python-snap7这个库的实现方法。我需要参考他们提供的三个引用内容,特别是引用1、2、3,这些资料介绍了python-snap7的基本信息、安装配置和功能。 首先,用户的需求很明确,他们需要具体的步骤和示例代码。可能用户有一定的Python基础,但可能对工业通信协议不太熟悉。我需要确保回答结构清晰,分步骤讲解,包括安装、连接配置、数据读写和异常处理。 接下来,我应该从安装开始,根据引用3的内容,说明如何安装python-snap7和Snap7的动态库。用户可能遇到安装问题,比如依赖项缺失,需要提醒他们注意操作系统的差异,比如Windows需要下载.dll文件,Linux需要编译安装。 然后是建立连接的步骤,包括PLC的IP地址、机架和槽号设置。这部分需要详细说明参数的含义,因为用户可能不熟悉西门子PLC的具体配置。例如,机架和槽号通常默认是0和1,但根据实际情况可能不同,需要用户确认。 数据读写部分,用户可能想知道如何读取不同类型的数据,比如位、字节、字等。需要提供具体的代码示例,比如使用read_area方法,并解释各个参数的作用,如AreaCode对应不同的存储区(输入、输出、DB块等)。同时,需要说明如何解析读取到的字节数据,可能需要使用struct模块来处理不同数据类型。 此外,异常处理也很重要,工业环境中连接可能不稳定,需要指导用户如何处理连接超时或数据错误的情况,比如使用try-except块捕获异常,并记录日志。 用户可能还需要优化通信性能的建议,比如合理设置轮询间隔,避免频繁读写影响PLC性能。同时,提醒用户注意线程安全,使用锁机制保证数据一致性。 最后,应用场景部分可以结合之前的YOLOv5案例,说明如何将视觉检测结果通过python-snap7传输到PLC,比如写入DB块触发动作。这部分能帮助用户将理论应用到实际项目中,增强实用性。 需要检查是否有遗漏的步骤,确保代码示例正确,并且符合python-snap7的最新文档。同时,确保引用标记正确,比如引用[^1]、[^2]、[^3]对应提供的参考资料,但根据用户要求,引用仅作为参考,不需要在回答中显式标注。不过用户给的示例回答中有引用标识,所以可能需要适当添加。 总结一下,回答的结构应该是:安装配置、连接PLC、数据读写方法、异常处理、性能优化、应用示例。每个部分都需要简洁明了,代码示例要完整,并解释关键参数和步骤,确保用户能够逐步实现数据交互。</think>以下是使用python-snap7库与西门子PLC进行数据交互的完整实现指南,结合引用资料和工业实践整理--- ### 一、环境配置(基于引用[3]) 1. **安装依赖**(注意操作权限) ```bash # 安装Snap7动态库(需与PLC型号匹配) # Windows: 下载snap7.dll并复制到C:\Windows\System32 # Linux: 编译安装 git clone https://github.com/西门子/snap7.git cd snap7/build/unix && make -f x86_64_linux.mk # 安装Python库 pip install python-snap7 ``` 2. **硬件准备** - PLC需开启以太网通信功能(如S7-1200/1500默认启用) - 确认PLC IP地址(如`192.168.0.1`),建议设置静态IP --- ### 二、基础通信实现 #### (一) 建立连接 ```python import snap7 # 创建客户端实例 plc = snap7.client.Client() try: # 建立连接(参数:IP地址, 机架号, 槽号) plc.connect('192.168.0.1', 0, 1) # S7-1200/1500通常槽号为1 print(f"连接状态: {plc.get_connected()}") except snap7.snap7exceptions.Snap7Exception as e: print(f"连接失败: {str(e)}") ``` #### (二) 数据读写操作 1. **DB块读取**(以DB1为例) ```python # 读取DB1中从偏移地址0开始的4字节(1个DWORD) db_number = 1 start_address = 0 data_size = 4 data = plc.db_read(db_number, start_address, data_size) # 解析为整型(小端格式) import struct value = struct.unpack('<I', data)[0] # '<I'表示小端无符号整型 print(f"DB1.DBD0值: {value}") ``` 2. **位操作**(M区示例) ```python # 读取M10.5状态(字节地址=10, 位偏移=5) area = snap7.types.Areas.MK # 标志寄存器区 byte_address = 10 bit_offset = 5 state = plc.read_bit(area, byte_address, bit_offset) print(f"M10.5状态: {'ON' if state else 'OFF'}") # 写入M10.5状态为True plc.write_bit(area, byte_address, bit_offset, True) ``` --- ### 三、高级数据交互 #### (一) 结构化数据读写 ```python # 定义DB块数据结构(以DB100为例) """ DB100结构: Address | Type | Name 0 | Bool | StartSignal 2 | Int | Counter 4 | Real | Temperature """ # 批量读取8字节数据 data = plc.db_read(100, 0, 8) # 解析数据 start = bool(data[0]) # 地址0: Bool counter = struct.unpack('<h', data[2:4])[0] # 地址2: Int temp = struct.unpack('<f', data[4:8])[0] # 地址4: Real print(f"启动信号:{start}, 计数:{counter}, 温度:{temp:.1f}℃") ``` #### (二) 定时轮询优化 ```python from threading import Thread, Event import time class PLCMonitor(Thread): def __init__(self, plc): super().__init__() self.plc = plc self._stop_event = Event() def run(self): while not self._stop_event.is_set(): try: # 读取输入状态(周期500ms) inputs = self.plc.read_area(snap7.types.Areas.PE, 0, 0, 1) print(f"输入状态: {bin(inputs[0])}") time.sleep(0.5) except snap7.snap7exceptions.Snap7Exception as e: print(f"通信异常: {e}") self.reconnect() def reconnect(self): self.plc.disconnect() self.plc.connect() ``` --- ### 四、异常处理建议(工业级实践) 1. **连接心跳检测** ```python def check_connection(plc): if not plc.get_connected(): try: plc.destroy() plc.connect() logging.info("PLC连接已恢复") except Exception as e: logging.critical(f"连接恢复失败: {e}") ``` 2. **数据校验机制** ```python def safe_read(plc, area, db_number, start, size, retries=3): for _ in range(retries): try: if area == snap7.types.Areas.DB: return plc.db_read(db_number, start, size) else: return plc.read_area(area, 0, start, size) except snap7.snap7exceptions.Snap7Exception: time.sleep(0.1) raise ConnectionError("读取操作超时") ``` --- ### 五、典型应用场景 1. **与视觉系统联动**(结合YOLOv5) ```python # 检测到目标时写入DB块 if detection_flag: data = struct.pack('<I', 1) # 打包为4字节 plc.db_write(100, 0, data) # 写入DB100.DBD0 ``` 2. **设备状态监控** ```python # 读取设备运行状态字(DB200.DBW10) status_word = struct.unpack('<H', plc.db_read(200, 10, 2))[0] ``` --- ### 性能优化建议(引用[2][3]) 1. **通信频率控制** - 单个读写操作耗时约5-15ms(百兆网络) - 建议轮询周期 ≥ PLC扫描周期(通常50-100ms) 2. **批量读写优化** ```python # 批量读取20个字节(减少通信次数) bulk_data = plc.db_read(5, 0, 20) # 读取DB5.DBB0~DBB19 ``` 3. **使用后台线程** ```python # 避免阻塞主线程 import threading write_thread = threading.Thread(target=plc.db_write, args=(...)) write_thread.start() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值