【Python】OPC UA模拟服务器实现

这篇具有很好参考价值的文章主要介绍了【Python】OPC UA模拟服务器实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 在工业自动化和物联网(IoT)领域,OPC UA(开放平台通信统一架构)已经成为一种广泛采用的数据交换标准。它提供了一种安全、可靠且独立于平台的方式来访问实时数据。在本文中,我们将探讨如何使用Python和OPC UA库来创建一个高效的数据服务器,该服务器能够从CSV文件读取数据,并允许OPC UA客户端访问这些数据。

服务器模拟

1. 环境准备

确保您的Python环境中已安装opcua库。如果未安装,请使用以下命令进行安装:

pip install opcua

导入python库

import argparse
import csv
import time
from typing import List
from opcua import Server, Node, ua
2. 服务器设置

首先,我们定义命令行参数来配置服务器地址、端口和数据源路径。

parser = argparse.ArgumentParser(description="OPCUA模拟服务器")

# 添加参数
parser.add_argument("--ip", "-i", default="0.0.0.0", help="服务器地址")
parser.add_argument("--port", "-p", default=4840, type=int, help="服务器端口")
parser.add_argument("--source", "-s", default="opcua_data.csv", help="数据源路径")
parser.add_argument("--type", "-t", default="fanuc", help="模拟类型")
# 解析命令行参数
args = parser.parse_args()

CSV_FILE = args.source
SERVER_URL = "opc.tcp://" + str(args.ip) + ":" + str(args.port)
SERVER_TYPE: str = args.type

参数:
【Python】OPC UA模拟服务器实现,Python,IoT,python,服务器

3. 服务器初始化

接着,我们初始化OPC UA服务器,并设置命名空间。

# 创建服务器实例
server = Server()
# 设置服务器端口
server.set_endpoint(SERVER_URL)
# 创建一个命名空间
uri = "http://opcua.simulator.com"
idx = server.register_namespace(uri)
4. 节点操作

定义函数来处理节点信息,并添加或更新节点。

# 获取对象节点,它通常是根节点的第一个孩子
objects = server.get_objects_node()
node_cache_dict = {}


def get_node_dict(node_info: str):
    pairs = node_info.split(";")
    if len(pairs) <= 1:
        return {"ns": idx, "s": node_info}
    data = {}
    for pair in pairs:
        key, value = pair.split("=")
        data[key] = value
    return data


def add_node(parent: Node, node_name, value, node_dict: dict, node_type="obj"):
    node_path = node_dict.get("s")
    node_ns = node_dict.get("ns")
    node_id = node_dict.get("i")
    # 检查节点是否已经存在
    children: List[Node] = parent.get_children()
    for child in children:
        browse_name: ua.QualifiedName = child.get_browse_name()
        if browse_name.Name == node_name:
            return child  # 返回已存在的节点

    # 如果节点不存在,创建它
    if node_type == "var":
        if SERVER_TYPE.upper() == "FANUC":
            node_idx = f"ns={node_ns};i={node_id}" if node_id else idx
        else:
            node_idx = f"ns={node_ns};s={node_path}"
        new_node = parent.add_variable(node_idx, node_name, str(value))
    else:
        new_node: Node = parent.add_object(idx, node_name)
        # new_node.set_writable()  # 设置变量为可写
    return new_node


def set_node_value(node_info: str, value):
    node_dict = get_node_dict(node_info)
    node_path: str = node_dict.get("s")
    if node_path.startswith("/Server/"):
        return
    try:
        last_node: Node = node_cache_dict.get(node_path)
        if last_node is None:
            # 递归查找或创建节点
            parent = objects
            parts = node_path.split("/")
            for part in parts[:-1]:  # 遍历除了最后一个节点的所有节点
                if part == "":
                    continue
                parent = add_node(
                    parent, part, value, node_dict
                )  # 创建节点(如果不存在)

            # 设置或更新最后一个节点的值
            last_node_name = parts[-1]
            last_node = add_node(parent, last_node_name, value, node_dict, "var")
            node_cache_dict[node_path] = last_node
        last_node.set_value(str(value))
    except Exception as e:
        print(f"Error setting node value: {e}")
5. 读取CSV文件

使用csv模块读取CSV文件,并更新OPC UA节点的值。

csv.field_size_limit(500 * 1024 * 1024)

try:
    with open(CSV_FILE, "r") as csvfile:
        csvreader = csv.reader(csvfile)
        header = next(csvreader)
        row = next(csvreader)
        for i in range(len(header)):
            set_node_value(header[i], row[i])  # 首次创建节点

        server.start()  # 启动服务器(先创建结构再启动server)
        print(f"Server started at {SERVER_URL}")

        # 每秒读取csv中的一行,更新节点值
        while True:
            try:
                row = next(csvreader)
                for i in range(len(header)):
                    set_node_value(header[i], row[i])
                time.sleep(1)
            except StopIteration:
                csvfile.seek(0)  # 回到文件开头
                next(csvreader)  # 跳过表头
finally:
    server.stop() if server else None
6. 运行服务器

执行脚本,服务器将启动,并开始从CSV文件读取数据更新OPC UA节点。

python opcua_simulator.py --ip 0.0.0.0 --port 4840 --source opcua_data.csv

查看服务器

可以使用 UA Sample Client (下载链接)软件连接到创建的opcua服务器查看结构和数据。
【Python】OPC UA模拟服务器实现,Python,IoT,python,服务器
数据监控:
【Python】OPC UA模拟服务器实现,Python,IoT,python,服务器

客户端

【Python】OPC UA 服务器与客户端的实现

总结

 本文介绍了如何使用Python和OPC UA库创建一个模拟服务器。通过读取CSV文件,服务器能够动态更新OPC UA节点的值,这对于开发和测试OPC UA客户端应用程序非常有用。您可以按照上述步骤进行实践,并根据具体需求调整代码。文章来源地址https://www.toymoban.com/news/detail-861712.html

到了这里,关于【Python】OPC UA模拟服务器实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OPC UA】C# 通过OpcUaHelper建立OPC客户端访问KEPServerEx6 OPC服务器数据

    OpcUaHelper 一个通用的opc ua客户端类库,基于.net 4.6.1创建,基于官方opc ua基金会跨平台库创建,封装了节点读写,批量节点读写,引用读取,特性读取,历史数据读取,方法调用,节点订阅,批量订阅等操作。还提供了一个节点浏览器工具。 KEPServerEX 第三方的OPC服务器,各不

    2023年04月11日
    浏览(36)
  • Java模拟OPC Server服务器并创建节点代码实现

    模拟OPC Server服务器的方法除了使用KEPServerEX6软件以外,还可以使用java代码模拟启动一个opc server。下文详细讲解,如何使用java代码,实现模拟一个或者多个opc server服务器。 OPC(OLE for Process Control)Server是一种用于实时数据通信的标准化软件接口,它允许不同厂商的设备和软

    2024年02月09日
    浏览(42)
  • Python模拟MQTT v3.1.1服务器

    示例代码 运行结果 解决办法: 降低websockets版本 新报错: 解决办法 : 根据错误信息,看起来问题出在您的MQTT服务器配置中缺少了\\\"listeners\\\"配置项。您可以在实例化Broker对象时,提供一个有效的配置,包括\\\"listeners\\\"配置项。 参考:《mqtt 客户端和服务端搭建及基本使用详解》

    2024年02月15日
    浏览(38)
  • 使用opc-ua-sim模拟server

    一直想找一种将模拟server放到docker容器中运行的方式,这样就不需要在每个电脑上都安装软件,仅仅只需要将镜像保存起来,使用时加载就行。于是乎就跑到了HUB里搜寻,你说巧不巧,就刚好找到了. 在HUB里找到这个作者(iotechsys)发布的镜像。里面有一个opc-ua-sim的镜像,这个

    2024年04月08日
    浏览(38)
  • OPC UA服务端(Prosys OPC UA Simulation Server)和客户端(OPC UA Explorer)工具使用

    1.Prosys OPC UA Simulation Server下载地址 https://downloads.prosysopc.com/opc-ua-simulation-server-downloads.php 2.简单使用 2.1 特殊项设置 【1】端口设置 【2】OPC UA Simulation Server运行状态 2.2 新加需要模拟上数的点 2.3 模拟动态变化值,修改ValueType 效果图如下: 2.4 模拟固定值(手动修改值) 1.Matriko

    2024年02月14日
    浏览(43)
  • python实现UDP服务器

    import socket   # 创建UDP socket udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   # 绑定地址和端口 server_address = (\\\'localhost\\\', 12000) udp_server_socket.bind(server_address)   # 服务器循环 while True:     # 接收客户端消息     message, client_address = udp_server_socket.recvfrom(1024)     print(f\\\"Received

    2024年04月27日
    浏览(40)
  • python实现/直播服务器/聊天服务器/的多种解决方案

    在Python中,您可以使用以下技术栈来实现直播服务器: Flask:Flask是一个轻量级的Web框架,可用于构建直播服务器的后端。您可以使用Flask编写API端点来处理直播流的控制和管理。 Django:Django是一个功能强大的Web框架,提供了许多内置功能和插件,可用于构建复杂的直播服务

    2024年02月11日
    浏览(41)
  • C# 中,使用OpcUaHelper读写OPC服务器

    nuget包 帮助类: Winform: KepServer 设置: 结果:

    2024年02月10日
    浏览(35)
  • c#通过opcautomation获取opc服务器数据

    本代码是一个基于OPCAutomation的OPC连接程序,通过此程序可以连接OPC服务器并读取OPCItem的值。程序的主要功能包括: 连接到指定的OPC服务器 断开连接 读取指定OPCItem的值 定时读取OPCItem的值 暂停/继续读取OPCItem的值 程序使用了OPCAutomation库,在程序中实例化了OPCServer和OPCBrows

    2024年01月21日
    浏览(40)
  • Python实现搭建-简单服务器教程

    Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文件的环境) 3.提取出文件的环境之后,利用截断取片的方法将文件名转化为模块

    2023年04月18日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包