首页 > 编程语言 >Python-OPCUA 读写西门子PLC设备的数据

Python-OPCUA 读写西门子PLC设备的数据

时间:2023-03-29 16:45:02浏览次数:43  
标签:sheet Python cell PLC tempvalue var1 ua OPCUA

Python版本:3.9
在python中,通过opc ua 通讯方式向PLC中读写数据

1. 安装opcua

首先安装一下opcua:pip install opcua

2. 实现与PLC的交互

我们可以通过导入文件的方式,实现plc设备数据的批量读取与写入
首先 我们可以通过KEPserve软件来实时监控到PLC设备的数据,这样方便我们待会读取的时候能够更加直观

3. KEPserver的配置

①:右键点击连接性,选择OPC UA Client

②:点击下一页,设置通道名称,然后在点击下一页

③ : 默认下一页,直到添加通道页面,输入PLC设备的地址与端口号,记住:opc.tcp://需保留,同时,安全策略选项需选择无,然后点击下一页,直到完成

④ :通道建好后,接下来右击通道选择新建设备,输入设备名称,然后默认下一页

⑤ :一直默认下一页,直到添加设备向导这一步,点击导入项,选择需要读取的点位的数据

⑥:当配置完成之后,点击页面上方的QC图标按钮,就能看到读取到的PLC设备的数据了

4. 当kepserver配置完成后,接下来使用Python 实现与PLC的交互,直接上代码

	# coding=utf-8
	# 导入需要的模块	
import importlib, sys, time, xlrd, sqlite3

importlib.reload(sys)
from opcua import Client, ua
from datetime import datetime
from xlrd import xldate_as_tuple
try:
# 输入PLC设备的IP地址,进行连接
    client = Client("opc.tcp://192.168.0.5:4840")
    client.connect()
    # print("连接成功=======================================================")
#在E:/data3.xls文件中,输入PLC数据的地址位,与需要写进PLC设备的相应地址位的数据
    filename = xlrd.open_workbook("E:/data3.xls")
    sheet = filename.sheet_by_index(0)
    rows = sheet.nrows
    cols = sheet.ncols
    all_content = []
    col_content = []
# 判断需要写入PLC设备的数据的类型
    for i in range(rows):
        row_content = []
        for j in range(cols):
            ctype = sheet.cell(i, j).ctype  # 表格的数据类型
            cell = sheet.cell_value(i, j)
            if ctype == 2 and cell % 1 == 0:  # 如果是整形
                cell = int(cell)
            elif ctype == 3:
                # 转成datetime对象
                date = datetime(*xldate_as_tuple(cell, 0))
                cell = date.strftime('%Y/%d/%m %H:%M:%S')
            elif ctype == 4:
                cell = True if cell == 1 else False
            row_content.append(cell)
        all_content.append(row_content[1::])
        col_content.append(row_content[0:1:])
    list = []
    list1 = []
    list2 = []

    for x in all_content[1::]:
        for y in x:
            list.append(y)
    for x in col_content[1::]:
        for y in x:
            list1.append(y)
    for i in range(len(list1)):
        list2_1 = list1[i]
        var = client.get_node(list2_1)
        list2.append(var.get_value())
    type1 = []
    for i in range(1, sheet.nrows):
        if sheet.cell(i, 1).ctype == 1:
            type1 = 'String'
        elif sheet.cell(i, 1).ctype == 3:
            type1 = 'Date'
        elif sheet.cell(i, 1).ctype == 4:
            type1 = 'Boolean'
        elif sheet.cell(i, 1).ctype == 2:
            if len(str(sheet.cell_value(i, 1)).split('.')[1]) == 1 and            str(sheet.cell_value(i, 1)).split('.')[1] == '0':
                type1 = 'Int32'
            else:
                type1 = 'Float'
# 如果需要写入PLC的数据的类型 与PLC地址位中的数据的类型一致,就将数据写入到PLC中
        if isinstance(list[i - 1], type(list2[i - 1])):
            if type1 == 'Boolean':
                var1 = client.get_node(list1[i - 1])
                tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.Boolean))
                var1.set_value(tempvalue)
            elif type1 == 'Date':
                var1 = client.get_node(list1[i - 1])
                tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.DateTime))
                var1.set_value(tempvalue)
            elif type1 == 'String':
                var1 = client.get_node(list1[i - 1])
                tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.String))
                var1.set_value(tempvalue)
            elif type1 == 'Float':
                var1 = client.get_node(list1[i - 1])
                tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.Float))
                var1.set_value(tempvalue)
            elif type1 == 'Int32':
                try:
                    var1 = client.get_node(list1[i - 1])
                    tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.UInt16))
                    var1.set_value(tempvalue)
                except:
                    var1 = client.get_node(list1[i - 1])
                    tempvalue = ua.DataValue(ua.Variant(list[i - 1], ua.VariantType.UInt32))
                    var1.set_value(tempvalue)
            else:
                pass
        else:
            pass

except:
    print("连接失败")
# 断开连接
client.disconnect()

至此,就实现了PLC变量中的读写,我们可以通过KEPserver来看 读取到的数据是否与PLC设备的数据一致以及需要写入的数据是否写入到了PLC设备中

作者:王鹏果

标签:sheet,Python,cell,PLC,tempvalue,var1,ua,OPCUA
From: https://www.cnblogs.com/DTCLOUD/p/17269460.html

相关文章

  • 全网最详细中英文ChatGPT-GPT-4示例文档-产品描述变广告文案应用从0到1快速入门——官
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载......
  • python 正则表达式
    1.检测工具https://www.regexbuddy.com/download.html 需要钱钱买license是真的好用   2.单字符匹配.匹配任意一个字符(除了\n)[]匹配[]内列举的字符\d匹......
  • Python-推导式
    1.什么叫列表推导式列表解析式(Listcomprehension)或者称为列表推导式,简单说对于一个可以迭代的对象,使用一个for循环来创建一个我们所需要的新的列表,且只需要使用一行......
  • 字符串函数_Linux_python_R_SQL
    字符串处理grep查找命令筛选信息awkcut按照指定要求分割-awk截取列信息cut截取字符串信息awkFS对第一行没作用要用大写的BEGIN方法01.利用exp......
  • python-docx表格样式列表
    示例源码importdocxwdoc=docx.Document()table=wdoc.add_table(rows=2,cols=2)row=table.rows[0]row.cells[0].text='书号'row.cells[1].text='我的著......
  • python字典合并
    #合并字典dic_a={"user":"aa","pwd":"123"}dic_b={"age":12,"sex":"男"}#1.update方法#dic_a.update(dic_b)#print(dic_a)#2.字典解包#dic_new={**dic_a......
  • 《Python编程快速上手—让繁琐工作自动化》实践项目答案:第三章
    Collatz序列1、题目:编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number//2,并返回该值。如果number是奇数,co......
  • 经典动态规划题(python)
    python动态规划性质最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算......
  • 《Python编程快速上手—让繁琐工作自动化》实践项目答案:第四章
    1.逗号代码:有这样的列表:spam=['apples','bananas','tofu','cats']编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项,表项之间以逗号和空格分隔......
  • Python基础 day7 数据类型(集合、字典、浮点型float)
    day7数据类型(集合、字典、浮点型float)课程概要:set集合,一个不允许重复重复&可变类型(元素可哈希)。dict字典,一个容器且元素必须是键值对。float类型,我们生活中常见的......