python通过KepServer读取plc数据

KepServer是一款能够方便地对plc等工业设备进行数据读取的工具。Python可使用win32com模块实现通过kepserver读取plc数据的功能。

win32com模块的安装命令:pip install pypiwin32

一、运行环境

1.安装Python:python3各版本均可,但必须是32位。这里使用的是 python-3.7.9,windows下32位。下载:

python-3.7.9-32位安装程序.rar-互联网文档类资源-CSDN下载

2.安装KepServer:各版本均可。这里使用的是Kepware.KEPServerEX.V6,下载:

KEPServerEXV6.4.rar_python读写kepware数据-其它文档类资源-CSDN下载

在KepServer中新建Channel1 -> Device1,建立tag1、tag2、tag3三个变量,连接plc后,在QC下查看数据是否能够正常读取。

3.注册opcdaauto

将opcdaauto.dll文件置于C:\Windows\System32目录下(使用64位环境时,置于SysWOW64目录下),cmd执行命令:regsvr32 C:\Windows\System32\opcdaauto.dll。下载:

注册opcdaauto.rar-互联网文档类资源-CSDN下载

二、python读取plc数据

import logging
import re
import time
from typing import List

import win32com.client
from win32com.client import gencache

logging.basicConfig(level='DEBUG')
logger = logging.getLogger('dll_dispatch')

#加载dll对象
OPC_DA_DLL = gencache.EnsureModule('{28E68F91-8D75-11D1-8DC3-3C302A000000}', 0, 1, 0)
opcServer = OPC_DA_DLL.OPCServer() #获取opcServer对象
group_name_map = {}  # 存放已添加的组名
item_name_map = {}
Groups = None

def connect_opc(progID: str, node: str = '127.0.0.1'):
    opcServer.Connect(progID, node)
    logger.info('已连接到opc - [{}:{}]'.format(node, progID))
    return opcServer

def disconnect_opc(opcServer):
    logger.info('opc断开连接')
    opcServer.Disconnect()

def get_servers(opcServer) -> List[str]:
    """查询可用opc服务"""
    return opcServer.GetOPCServers()

class GroupProperty:
    # DeadBand
    IsActive: bool = True
    IsSubscribed: bool = True
    UpdateRate: int = 1000
    DefaultGroupIsActive: bool = True
    DefaultGroupDeadband: int = 0

def get_groups(opcServer, groupProperty: GroupProperty):
    global Groups
    if not Groups:
        Groups = opcServer.OPCGroups
        Groups.DefaultGroupIsActive = groupProperty.IsActive
        Groups.DefaultGroupDeadband = groupProperty.DefaultGroupDeadband
        Groups.DefaultGroupUpdateRate = groupProperty.UpdateRate
    return Groups

def get_group(opcServer, opcGroupName: str, groupProperty: GroupProperty):
    opcGroups = get_groups(opcServer, GroupProperty())
    if opcGroupName not in group_name_map:
        opcGroup = opcGroups.Add(opcGroupName)
        opcGroup.IsActive = groupProperty.IsActive
        opcGroup.UpdateRate = groupProperty.UpdateRate
        opcGroup.IsSubscribed = groupProperty.IsSubscribed

        group_name_map[opcGroupName] = opcGroup
    else:
        logger.debug('重复添加 GroupName - {}'.format(opcGroupName))

    return group_name_map[opcGroupName]


def get_items(opcServer, opcGroupName: str, groupProperty: GroupProperty):
    group = get_group(opcServer, opcGroupName, groupProperty)
    return group.OPCItems


def add_item(opcServer, itemName: str):
    """添加一个点位"""
    if itemName not in item_name_map:
        try:
            groupName = re.split(r'[.$][^.$]*?$', itemName, 1)[0]
        except IndexError:
            logger.error('点位名-{}-不符合规则'.format(itemName))
            return
        items = get_items(opcServer, groupName, GroupProperty())
        try:
            item = items.AddItem(itemName, len(item_name_map) + 1)
            # 添加失败时 item 为 None
            if not items:
                raise RuntimeError('add item[{}] return None'.format(itemName))
        except Exception as e:
            logger.error('添加点位-{}-失败! [点位可能不存在]'.format(itemName), exc_info=True)
            item_name_map[itemName] = None
        else:
            item.IsActive = True
            time.sleep(0.1)
            item_name_map[itemName] = item
    else:
        logger.debug('重复添加 itemName - {}'.format(itemName))


def add_items(opcServer, item_list: List[str]):
    """批量添加点位"""
    for item in item_list:
        add_item(opcServer, item)


def _sync_read(item):
    data = item.Read(win32com.client.constants.OPCDevice, 0, 0, 0)
    if not data:
        raise ValueError('sync_read return None.')
    return data

def sync_read_item(opcServer, itemName: str):
    """
    同步读取一个 opc 点位
    :param opcServer:
    :param itemName:
    :return:  (数据, 数据质量, 时间)
    """
    if itemName not in item_name_map:
        add_item(opcServer, itemName)
    logger.debug('读取 - {}'.format(itemName))
    item = item_name_map[itemName]
    try:
        if not item:
            raise ValueError('点位不存')
        return _sync_read(item)
    except Exception as e:
        logger.error('采集失败: {} - {}'.format(itemName, e), exc_info=True)
        return None, 0, 0


def sync_read_items(opcServer, itemNameList: List[str]):
    result = []
    for itemName in itemNameList:
        if itemName not in item_name_map:
            add_item(opcServer, itemName)

        result.append(sync_read_item(opcServer, itemName))
    return result

if __name__ == '__main__':
    opcServer = connect_opc('Kepware.KEPServerEX.V6', '127.0.0.1')
    print(get_servers(opcServer))
    # 定义点位列表
    tag_list = ['Channel1.Device1.tag1', 'Channel1.Device1.tag2', 'Channel1.Device1.tag3']
    try:
        while True:
            data = sync_read_items(opcServer, tag_list)
            for i in data:
                print(i[0])
            time.sleep(2)
    except Exception:
        logger.error('异常退出', exc_info=True)
    finally:
        opcServer.Disconnect()

主要参考

  1. https://blog.csdn.net/wanzheng_96/article/details/108431097?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.control&dist_request_id=1332042.24142.16193357577789097&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.control

 

  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
### 回答1: Kepserver是一款用于数据采集和传输的软件,其支持从各种数据源中获取数据。当其需要读取数据数据时,可以通过以下步骤来完成。 首先,需要配置Kepserver与相应的数据库进行通信。这一过程通常包括配置数据库连接信息,如IP地址、端口号、用户名和密码等。此外,还需要选择相应的数据库类型、版本和数据库对象,如表或视图等。 其次,需要根据需要配置相应的数据项或标签。这些数据项或标签可以在Kepserver中定义和配置,用于读取和传输数据库中的数据。通常,需要指定数据项的名称、数据类型、订阅方式和更新速率等信息。 最后,需要启动Kepserver并打开相应的通道和设备。在这个过程中,Kepserver会与数据库进行通信,并读取需要的数据。一旦数据读取到,它可以被传输到其他系统或应用程序中进行处理和分析。 总体而言,Kepserver是一款功能强大的数据采集和传输工具,可以方便地从数据库中获取数据并在不同系统之间进行传输和共享。通过合理的配置和使用,Kepserver可以帮助用户更好地利用数据库中的数据,提高数据的利用率和价值。 ### 回答2: Kepserver是一款通用的OPC服务器软件,可以将各种设备、仪器等加入到统一的、可编程的控制系统中,实现各种自动化控制。其中,Kepserver还可以与数据库进行交互,将数据库中的数据同步到控制系统中。 具体而言,Kepserver可以通过内置的驱动程序连接到多种常用的数据库(如MySQL、Oracle、SQL Server等),并读取数据库中的表格数据。用户可以在Kepserver的配置页面上设置数据源、用户名、密码等参数,以便Kepserver能够连接到目标数据库。此外,用户还可以在配置页面上设置读取方式、读取数据类型等其他参数。 一旦Kepserver连接到数据库并读取数据成功,就可以将这些数据映射到OPC变量中。这些变量可以在控制系统中使用,例如可以用于计算、控制等用途。此外,Kepserver还支持在读取数据数据的同时进行数据筛选、数据转换等操作,以满足用户的不同需求。 总的来说,Kepserver读取数据数据是一个方便快捷的方法,可以帮助用户将数据数据与控制系统集成,实现更高效、更智能的自动化控制。 ### 回答3: Kepserver是一款常用的工业自动化软件,它可以用来连接设备和控制系统,并实现数据的采集和管理。在应用过程中,Kepserver可以通过不同的驱动程序和插件,从各种设备和系统中读取数据,并进行处理和存储。其中,读取数据数据Kepserver的一项重要功能。 Kepserver可以通过ODBC(Open Database Connectivity)驱动来读取数据库中的数据。ODBC是一种通用的数据库访问协议,可以允许不同的应用程序访问多个不同类型的数据库。因此,只要数据库支持ODBC,Kepserver就可以直接读取其中的数据。 在使用ODBC驱动前,需要先进行相关配置。首先,在Kepserver的配置界面中,选择“数据源”,然后点击“添加”按钮,在弹出的窗口中选择ODBC驱动对应的数据库类型,并输入对应的连接信息,如数据库名称、用户名和密码等。配置完成后,Kepserver就可以通过ODBC驱动访问数据库中的数据。 此外,Kepserver还支持多种其他的数据库驱动程序,如SQL Server、Oracle、MySQL等。用户可以根据自己的需求和实际情况,选择相应的驱动程序来读取数据数据。 总之,Kepserver可以通过ODBC驱动及其他多种驱动程序读取不同类型的数据数据,为工业自动化应用提供了重要的数据支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禺垣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值