python 读写西门子PLC例子
```python
!/usr/bin/env python
coding: utf8
Project: pi4b_aliyuniot
File : snap_client.py
Author : Long.Xu
http://gnolux.blog.csdn.net
Time : 2021/4/7 2:14 下午
Copyright 2021 Long.Xu All rights reserved.
from snap7 import util, client
from snap7.types import S7AreaMK, S7AreaDB
client_object = client.Client()
client_object.connect('127.0.0.1', rack=0, slot=1, tcpport=502)
访问机架、槽位和数据间隔
那里存储 PLC 架、槽位值表:
架 槽
s7200smart 0 1
s7300 0 2
s7400 见硬件组态
s71200/1500 0 0/1
访问机架和槽位的数据
byte_arrays = client_object.read_area(area=S7AreaMK, dbnumber=0, start=0, size=2)
print('赋值前:', util.get_bool(byte_arrays, 0, 0)) 获取二进制值
util.set_bool(byte_arrays, 0, 0, False) 设置二进制值
client_object.write_area(S7AreaMK, 0, 0, byte_arrays)
print('赋值后:', util.get_bool(byte_arrays, 0, 0)) 输出写后的二进制值
访问 DB 区域和 200smart 的起始位点的数据
util.set_bool(byte_arrays, 1, 1, False) 设置 DB 区的值
client_object.write_area(S7AreaMK, 2, 0, byte_arrays)
访问数据块和 DB 区
byte_arrays = client_object.read_area(S7AreaDB, 1, 3222, 2)
print('赋值前:', util.get_word(byte_arrays, 0)) 获取有符号短整数值
util.set_word(byte_arrays, 0, 199) 设置有符号短整数值
client_object.write_area(S7AreaDB, 1, 3222, byte_arrays)
print('赋值后:', util.get_word(byte_arrays, 0)) 输出改动后的值
断开连接并销毁客户端对象
client_object.disconnect()
client_object.destroy()
```
服务器脚本部分的改写保持了原文的逻辑:
```python
!/usr/bin/env python
coding: utf8
Project: pi4b_aliyuniot
File : snap_server.py
Author : Long.Xu
http://gnolux.blog.csdn.net
Time : 2021/4/7 2:14 下午
Copyright 2021 Long.Xu All rights reserved.
import time
import logging
import snap7
logger = logging.getLogger(__name__)
def mainloop(tcpport: int = 1102):
server = snap7.server.Server()
buffer_size = 999999
db_data = (snap7.types.wordlen_to_ctypes[snap7.types.S7WLByte] buffer_size)()
pa_data = (snap7.types.wordlen_to_ctypes[snap7.types.S7WLByte] buffer_size)()
tm_data = (snap7.types.wordlen_to_ctypes[snap7.types.S7WLByte] buffer_size)()
ct_data = (snap7.types.wordlen_to_ctypes[snap7.types.S7WLByte] buffer_size)()
mk_data = (snap7.types.wordlen_to_ctypes[snap7.types.S7WLByte] buffer_size)()
注册数据区域
server.register_area(snap7.types.srvAreaDB, 1, db_data)
server.register_area(snap7.types.srvAreaPA, 1, pa_data)
server.register_area(snap7.types.srvAreaTM, 1, tm_data)
server.register_area(snap7.types.srvAreaCT, 1, ct_data)
server.register_area(snap7.types.srvAreaMK, 1, mk_data)
启动服务器
server.start(tcpport=tcpport)
for _ in range(60):
try:
检查并处理来自客户端的事件
event = server.pick_event()
if event:
logger.info(server.event_text(event))
except snap7.snap7types.S7Exception as error:
处理异常
logger.error(f"Server failed to send: \n {error}")
time.sleep(1)
开始服务器循环
mainloop(502)
```
请注意,对于 COVID19 相关内容的部分,在提交代码时需要慎审查清理个人健康数据和敏感信息的法律和道德考虑。在将来的应用中,应确保遵循所有适用的数据保护法律和法规。