canso123 发表于 2024-3-30 19:38

python读取S7-400plc的数据,推送至钉钉群

本帖最后由 苏紫方璇 于 2024-4-1 11:30 编辑

import time
import datetime
import snap7
import requests
import json

from snap7 import util

# 初始化变量
value7 = None
start_time = None
end_time = None

while True:
    try:
      time.sleep(10)
      # 创建一个客户端对象
      client = snap7.client.Client()
      #设置链接类型
      client.set_connection_type(1)
      # 连接到PLC
      client.connect('10.112.14.111', 0, 4,102)
      # 读取PLC数据
      # 读DB182.DBD30生产数量
      data = client.read_area(snap7.types.Areas.DB, 182, 0, 34)
      value2 = util.get_dword(data, 30)
      # print(f"当前生产数量为: {value2}")

      # 读DB182.DBW0,模具号
      data = client.read_area(snap7.types.Areas.DB, 182, 0, 2)
      value1 = util.get_word(data, 0)
      # print(f"模具号的值为: {value1}")

      # 读DB201.DBX2.1
      data = client.read_area(snap7.types.Areas.DB,201,2,1)
      new_value7 = util.get_bool(data,0,1)
      print(f"整线运行状态: {new_value7},时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

      # 检查value7从False变为True的情况
      if new_value7 is False and value7 is True:
            start_time = datetime.datetime.now()

      # 检查value7从True变为False的情况
      elif new_value7 is True and value7 is False and start_time is not None:
            end_time = datetime.datetime.now()
            time_difference = end_time - start_time
            total_seconds = time_difference.total_seconds()
            minutes, seconds = divmod(total_seconds, 60)
            hours, minutes = divmod(minutes, 60)
            print(f"时间差为 {hours} 小时 {minutes} 分钟 {str(seconds)[0:4} 秒")
            webhook_url = '自己的钉钉机器人API'
            markdown_text =(
                ### Hello
                f'**当前模具号**:{value1}\n\n'
                f'**生产数量为**:{value2}\n\n'
                f'**当前时间为**:{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}\n\n'
                f'**停台时间**:{hours}小时{minutes}分钟{str(seconds)[0:4}秒')
            # 构建POST数据
            data = {
                "msgtype": "markdown",
                "markdown": {
                  "title": "Hello",# 可选,消息标题
                  "text": markdown_text,
                },
            }
            response = requests.post(webhook_url, headers={'Content-Type': 'application/json'}, data=json.dumps(data))

      # 更新当前的value7值
      value7 = new_value7
    except Exception as e:
      print(f"发生错误: {e}. 尝试重新开始...")
      continue# 遇到任何异常时,跳过本次循环,直接进行下一次循环重新开始

    finally:
      # 确保每次循环结束后都尝试断开连接,防止资源泄露
      try:
            client = snap7.client.Client()
            client.disconnect()
            client.destroy()
      except (AttributeError):
            pass

苏紫方璇 发表于 2024-4-1 11:28

可以参照这个帖子粘贴代码
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)

canso123 发表于 2024-4-12 14:56

hurs 发表于 2024-3-30 21:40
数据是实时推送的吗?

是当那个数据变化时候,采集之间的时间,然后推送钉钉由钉钉机器人推送到钉钉群里面,实时的。好用,自己就是做出来了一直用来监控生产的停台时间

hurs 发表于 2024-3-30 21:40

数据是实时推送的吗?

losingstars 发表于 2024-3-30 21:47

有人试过吗?

markhoo911 发表于 2024-3-31 00:23

我擦,这个可以啊,但是我之前玩的时候好像是西门子S7-200的,但是没研究过结合Python玩。

137897772 发表于 2024-4-1 13:06

有试过的大佬吗

canso123 发表于 2024-4-12 14:59

losingstars 发表于 2024-3-30 21:47
有人试过吗?

我自己编写出来的,都在运行,肯定好使啊

canso123 发表于 2024-4-12 15:00

markhoo911 发表于 2024-3-31 00:23
我擦,这个可以啊,但是我之前玩的时候好像是西门子S7-200的,但是没研究过结合Python玩。

s7-200的不知道,但是这个是S7-400的

canso123 发表于 2024-4-12 15:07

苏紫方璇 发表于 2024-4-1 11:28
可以参照这个帖子粘贴代码
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thr ...

好的,第一次发没注意
页: [1] 2
查看完整版本: python读取S7-400plc的数据,推送至钉钉群