精华内容
下载资源
问答
  • OPC工具读取PLC数据

    2015-09-22 14:38:20
    一个读取PLC数据的工具,OPC 配置参数过程(读取西门子 PLC S7200 SMART的数据) 1、 新建NEW Channel –> Channel name xxxx -> Device driver “Siemens TCP/IP Ethernet” -> Network Adapter “Realtek PCIe GBE...
  • Sharp7的功能是很强大的,除了可以读写PLC数据之外,还可以获取CPU的硬件信息,控制CPU运行,停止等。这个只介绍读写。 对于读数据来说,一般是先调用Sharp7提供的方法从PLC中获取数据保存到Byte类型的数组中,...
  • 适合labview2017版本直接安装,函数面板自动添加与西门子PLC通讯组件
  • C# WPF通过OPC读取PLC数据并实现语音报警
  • python通过KepServer读取plc数据

    千次阅读 2021-05-31 14:38:51
    Python可使用win32com模块实现通过kepserver读取plc数据的功能。 win32com模块的安装命令:pip install pypiwin32 一、运行环境 1.安装Python:python3各版本均可,但必须是32位。这里使用的是python-3.7.9,...

    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
    展开全文
  • S7.NET.DLL基于西门子GET/PUT封装了读取以及写数据功能,下面是不成熟的程序,基本可以将数据PLC读出,也可将数据写入PLC,仅供参考,以下是原代码: Option Explicit On 'Imports System.Collections.ge '...

    S7.NET.DLL基于西门子GET/PUT封装了读取以及写数据功能,下面是不成熟的程序,基本可以将数据从PLC读出,也可将数据写入PLC,仅供参考,以下是原代码:

    Option Explicit On
    'Imports System.Collections.ge
    'Imports System.Linq
    Imports System.Text
    'Imports System.Threading.tas
    Imports S7.Net

    Public Class Form1
        Dim Rack As Short
        Dim slot As Short
        Dim IPAddress As String = “192.168.1.50”
        Dim CPUTypes As String
        'Dim PLC_Pallet = New Plc(CpuType.S7300, "192.168.1.1", Rack, slot)
        Dim PLC_Pallet = New Plc(CPUTypes, IPAddress, Rack, slot)
        Dim AppXls As Microsoft.Office.Interop.Excel.Application

     Private Sub Btn_Connect_Click(sender As Object, e As EventArgs) Handles Btn_Connect.Click
            CPUTypes = CStr(Combox_CPUType.Text)
            IPAddress = txtAddress.Text
            Rack = Short.Parse(txtRack.Text)
            slot = Short.Parse(txtSlot.Text)
            PLC_Pallet = New Plc(CpuType.S7300, IPAddress, Rack, slot)
            Try
                PLC_Pallet.Open()
            Catch ex As Exception
                MessageBox.Show("连接PLC设备失败")
            End Try
      End Sub

        Private Sub Btn_Write_Click(sender As Object, e As EventArgs) Handles Btn_Write.Click
            PLC_Pallet.Write(
    "DB1.DBX0.1", True)
            PLC_Pallet.Write("DB1.DBD12.0", 123457)
     
      End Sub

        Private Sub Btn_Write_Click(sender As Object, e As EventArgs) Handles Btn_Write.Click
            PLC_Pallet.Write("DB1.DBX0.1", True)
            PLC_Pallet.Write("DB1.DBD12.0", 123457)
        End Sub

    End Class

    展开全文
  • C# 制作的OPC客户端,实现读取PLC数据,程序中点位可以配合KEPServer使用,在KEPServer的quick client中找到点位路径复制到程序中就可以读取
  • C#读写三菱、西门子、MoModbus、欧姆龙、松下等PLCDemo,是另一个博主写的开源代码HslCommunication,可直接运行
  • 在项目开发过程中,需要在labview上读取西门子plc的参数实时参数值,于是查找了很多资料,可以实现的方法有多种,这里记录的是其中成功实现的一种。 准备软件:opc scout v10,labview 1.plc搭建opc服务器,设定...

    注:  64位LabVIEW不支持使用DataSocke连接至OPC服务器。

    在项目开发过程中,需要在labview上读取西门子plc的参数实时参数值,于是查找了很多资料,可以实现的方法有多种,这里记录的是其中成功实现的一种。

    准备软件:opc scout v10,labview

    1.plc搭建opc服务器,设定通信的ip,包括plc的ip和电脑端的ip,导出xdb文件;(这里由于负责plc部分的不是我,所以只能概括该怎么做,具体可查阅各品牌plc的搭建过程)

    2.将xdb文件导入,打开程序(图2-1),修改station name为xdb文件名,import导入xdb文件(图2-2);

     

    图2-1

     

    图2-2

     

    3.打开opc scout v10,选择西门子opc.simaticNET\s7\s7_connection1\objects\M,选择[new definition]新建变量,填入变量类型、变量地址、(number of val)1个(图3-1),再讲变量拖放到右下角监视区域(图3-2),点击开始监视即可获得数据。

     

     

    图3-1

     

    图3-2

     

    4.此时电脑已经可以读取到plc的数据了,下一步是将数值读取到labview,labview通过datasocket的方式将plc的opc server进行数据读取;首先要知道变量地址在哪,labview才能去访问,新建程序如图,打开程序便会选择需要连接的变量,路径的选择与第三步一致,找到MREAL272(图3-1),点击确定,即可在文本框中生成labview可以访问的路径形式,后续程序将以此为基础进行读写。

     

    图4-1

    5.参数读写,编写labview程序

    在前面板创建一个显示控件,右键属性-如图5-1配置,其中路径处填入第4步生成的路径,确认;

    启动程序,如果右上角的datasocket指示灯绿色,则表示已经读取到,否则为红色(参考图5-2);

    那么恭喜,剩下可以根据自己的需求进行编写程序了,需要注意的是,对于程序逻辑要清晰,可能出现plc操作时被电脑控制而无法修改等程序上的问题,这只需要在labview程序中就能解决。

     

    图5-1

    图5-2

    展开全文
  • 一、写入PLC数据public static bool PlcWrite(int adres, int count, string SendData){if (Sys.PlcComUse == 0)return true;string s_adres = (adres + Sys.PlcBaseAddress).ToString("0#####");string s_count = ...

    一、写入PLC数据

    public static bool PlcWrite(int adres, int count, string SendData)

    {

    if (Sys.PlcComUse == 0)

    return true;

    string s_adres = (adres + Sys.PlcBaseAddress).ToString("0#####");

    string s_count = count.ToString("X").PadLeft(4, '0');

    string hdr = "500000FF03FF00";

    string s_data = "000A14010000D*" + s_adres + s_count + SendData;

    string n = (s_data.Length.ToString("X")).PadLeft(4, '0');

    string dtfram = (hdr + n + s_data);

    byte[] msg = Encoding.ASCII.GetBytes(dtfram);

    plcCom.txtSend.Text = "ABC";

    Application.DoEvents();

    if (Sys.Deb != 0)

    return true;

    int byteSend = Sock.Send(msg);

    System.Text.Encoding encoding = System.Text.Encoding.UTF8;

    string smsg = encoding.GetString(msg);

    System.DateTime Stime = DateTime.Now;

    TimeSpan Ctime = new TimeSpan(10000000);

    do

    {

    TimeSpan Ptime = (DateTime.Now - Stime);

    if (Ptime > Ctime)

    {

    MessageBox.Show("PLC comm. time out error.");

    return false;

    }

    Application.DoEvents();

    } while (Sock.Available == 0);

    int byteRec = Sock.Receive(RcvBytes);

    string rcvstr = System.Text.Encoding.UTF8.GetString(RcvBytes);

    plcCom.txtRcv.Text = rcvstr;

    string emsg = rcvstr.Substring(18, 4);

    if (emsg != "0000")

    {

    plcCom.txtRcv.Text += "error code " + emsg;

    MessageBox.Show("PLC comm. data error. " + emsg);

    }

    return true;

    }

    二、读取PLC数据

    public static bool PlcRead(int adres, int count, ref string ReadData)

    {

    if (Sys.PlcComUse == 0)

    return true;

    PlcReadBusy = true;

    string s_adres = (adres + Sys.PlcBaseAddress).ToString("0#####");

    string s_count = count.ToString("0###");

    string hdr = "500000FF03FF00";

    string s_data = "000A04010000D*" + s_adres + s_count;

    string n = (s_data.Length.ToString("X")).PadLeft(4, '0');

    string dtfram = (hdr + n + s_data);

    byte[] msg = Encoding.ASCII.GetBytes(dtfram);

    if (Sys.Deb != 0)

    {

    PlcReadBusy = false;

    return true;

    }

    int byteSend = Sock.Send(msg);

    System.Text.Encoding encoding = System.Text.Encoding.UTF8;

    string smsg = encoding.GetString(msg);

    System.DateTime Stime = DateTime.Now;

    TimeSpan Ctime = new TimeSpan(10000000);

    do

    {

    TimeSpan Ptime = (DateTime.Now - Stime);

    if (Ptime > Ctime)

    {

    MessageBox.Show("PLC comm. time out error.");

    PlcReadBusy = false;

    return false;

    }

    Application.DoEvents();

    } while (Sock.Available == 0);

    int byteRec = Sock.Receive(RcvBytes);

    ReadData = System.Text.Encoding.UTF8.GetString(RcvBytes);

    plcCom.txtRcv.Text = ReadData;

    string emsg = ReadData.Substring(18, 4);

    if (emsg != "0000")

    {

    plcCom.txtRcv.Text += "error code " + emsg;

    PlcReadBusy = false;

    return false;

    }

    ReadData = ReadData.Substring(22);

    PlcReadBusy = false;

    return true;

    }

    }

    展开全文
  • 相信我,这应该是最全最全的 C#通过opc ua 协议连接plc的项目和文档资料了!如果又不明白的可浏览我的博客,有相关的介绍和使用,欢迎交流讨论。
  • 两个PLC通过网管型交换机和WinCC连接,如何实现WinCC读取PLC-1中的变量的值发送给PLC-2
  • s7-1200支持以太网、串口等多种通讯,只要是双方均具备的通讯协议均可以实现数据交换。2)是的,如果你想调用modbusrtu通讯,则需要第三方从站设备也能够正常modbusrtu通讯协议才可以。如果第三方支持,则需要在原s7-...
  • LabVIEW工控软件源码 labview上位机 1.实际项目程序,读取plc数据并存到数据库里; 2.具有moudbus RTU通讯功能,与智能仪表通信。 tb429282236
  • 实现易语言读取三菱PLC数据连读,易语言本身对三菱的MX只支持每次读1个字,利用计数循环达来连读
  • socket读取plc

    2014-11-23 17:40:05
    linux平台下通过socket读取和接收plc的存储信息。使用modbus tcp协议。
  • VB与三菱Q系PLC通信读取PLC数据

    热门讨论 2011-04-15 11:11:57
    VB与三菱Q系PLC通信读取PLC数据,运动前要用三菱的ACT软件设定连接。
  • plc数据读取

    千次阅读 2021-01-26 13:17:37
    commMonitor串口监控+hsl+plc 目标:读取plc中的数据 1.用hsl读取plc 2.串口监控抓取报文 3.用指针提取有用的数据,拼接字符串
  • vs 2012 c# 编译成功。...OPC是工业控制和生产自动化领域中使用的硬件和软件的接口标准,以便有效地在应用和过程控制设备之间读写数据。O代表OLE(对象链接和嵌入),P (process过程),C (control控制)。
  • 使用西门子S7-200CN PLC,V4.0 STEP 7 MicroWIN SP9上导入Modbus Slave Port0(v1.0),下载slave.mwp到PLC并运行,串口连接PLC数据采集网关(PC、树莓派或开发板),运行数据采集网关上的server.py,运行另一台PC上...
  • 本文是采用串口调试工具发送十六进制的读写命令,通过RS-422将数据写入PLC或读取PLC内继电器的状态。本文测试了X、Y、M、D和S等常用的继电器,内含各种截图以及读写命令的数据帧格式解释。本文是参考编程口协议进行...
  • 项目中有两台S7-1500的PLC,需要将其数据通过一个智能网关采集到MySQL数据库;网关采集多台智能仪表数据到... 最后配置数据库参数和PLC数据寄存器地址,通过参数软件的功能视图->数据上报与查询,切换到如下画面:  
  • C# 实现读取三菱PLC数据,并通过网络把数据发送到服务器。
  • 在有些工程中,PLC处理的一些数据要求能保存下来,可以以后查询,这样可以实现的的方式有在电脑中做一些界面和PLC通讯,读取数据,这样做的方式比较费时、费力,但做出的界面可以很好看,但无为拉简单的应用,可以...
  • 电脑如何读取与保存三菱plc数据

    千次阅读 2021-06-25 02:49:26
    电脑读取与保存三菱plc数据的方法plc处理的一些数据要求能保存下来,可以以后查询,这样可以实现的的方式有在电脑中做一些界面和plc通讯,读取数据,这样做的方式比较费时、费力,不实用。可以选用三菱提供的两个小...
  • } private void Form1_Load(object sender, EventArgs e) { //下拉框添加数据类型项 Data_Type.Items.Add("Bool"); Data_Type.Items.Add("Int"); Data_Type.Items.Add("DInt"); Data_Type.Items.Add("Real"); Data_...
  • 下面将会简单简单介绍下OPC DA客户端数据访问,以及搭配整个系统的运行环境。OPC(OLE for Process Control)其实就是一套标准,我对这套标准理解不多,使用过程中就把它理解一套协议或者规范,主要用于工控领域。OPC...
  • delphi串口读写台达plc

    2018-12-04 16:04:30
    delphi串口读写台达plc PLC台达DELPHI通讯MODBUS procedure TfrmMain.btnReadMClick(Sender: TObject); var sStr:String; i:Integer; begin for i:= 0 to 1279 do Begin kmtPLC.SendData('0102'+IntToHex(i+$...
  • 效果如下:现介绍另一种通过Python实现PLC数据可视化呈现于Web端的方案。主要技能:Python+Flask+Bootstrap+Echarts+Modbus TCP/OPC UA实现方法:1、Python 通过Modbus TCP或OPC UA采集Modicon M580 PLC数据M580本体...
  • python 读写PLC实例

    2018-06-28 13:55:10
    python 使用 snap7 实现西门子 plc 1200的读写 地址读写

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,299
精华内容 2,519
关键字:

怎么读取plc数据