plc与linux通讯_linux与plc网口通讯 - CSDN
精华内容
参与话题
  • PLC通信网络

    2019-08-19 18:31:13
    PLC通信网络的分层 PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层。如下图所示。 在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及Profibus三种通讯方式...

        PLC通信网络的分层

          PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层。如下图所示。

     

            在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及Profibus三种通讯方式。

          MPI通信多用于西门子内部产品通讯,以及对下位机调试监控时使用。MPI是一种通信协议,其物理接口底层是RS-485,每个点都有自己的网络地址,通过建立全局数据表,进行小数据量通信,MPI网络通讯速率可达19.2kbit/s-12Mbit/s。

         Profibus总线由西门子与其他研究机构联合开发,Profibus协议包括三个主要部分,Profibus-DP(分布式外部设备)、Profibus-PA(过程自动化)和Profibus-FMS(现场总线报文规范)。其中Profibus-DP应用最多、最为广泛,Profibus-DP定义了三种设备类型,分别是DP-1类主站设备(PLC一类)、DP-2类主站设备(PC、OP一类)、DP-从站设备(分布式IO、ET200等)。其物理接口底层也是RS-485,每个点也有自己的网络地址,建立主站和从站以及定义通信接口区进行数据交互,常见传输速率为1.5Mbit/s。

        ProfiNet总线是属于工业以太网中的一种,PROFINET 分为原来划分为 v1,v2,v3 ,现在一般称为 ProfiNetCBA 、 ProfiNet IO 和 ProfiNet IRT. 也就是通过以太网来实现对等通讯、实时控制和运动控制。 v1 采用 TCP/IP 协议,采用标准的以太网,而 V2 和 V3 不采用 tcp/ip 协议,这两种都绕过 tcp/ip 协议,采用另外的网络层和传输层协议。其中使用较多的是ProfiNet IO在各类PLC数据之间进行实时通讯。

       各类通讯协议及其物理接口简介

        工业通讯协议常用的大致可分为串行通信(数据传输方式划分)、现场总线(通讯单元组成方式划分)以及工业以太网。

        工业中任何一种国际标准的通信协议,其协议结构都以ISO/OSI参考模型为基础,以以太网为例分为7层,如下图所示。

          通常可简单分为4层,物理接口层,网络层,传输层以及应用层。如RS-232以及RS-485则是物理接口层,即常见的串行通信,属于硬件接口层,算不上国际标准的通信协议,均带有自己自主定义的方式。而现场总线以及工业以太网则普遍为国际标准的通信协议,通常都定义了网络层或传输层,甚至应用层的通信协议。其物理硬件接口有RS-485或者以太网口,现场总线包括,Modbus(Modbus RTU、Modbus TCP、Modbus ASCII)、Profibus(上面介绍过)、Can总线等。工业以太网包括,EtherCat、EtherNet/IP、ProfiNet、Modbus-TCP、PowerLink等。

    转载于:https://www.cnblogs.com/dzw2017/p/6791764.html

    展开全文
  • PLC与PC通讯

    2019-08-06 04:59:06
    using System; using System.Windows.Forms; using Microsoft.Win32; // for the registry table using System.Runtime.InteropServices; // for the P/Invoke namespace WindowsApplication1 ... p...
    using System;
    using System.Windows.Forms;
    
    
    using Microsoft.Win32; // for the registry table
    using System.Runtime.InteropServices; // for the P/Invoke
    
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            private IntPtr _hDmtDll; // handle of a loaded DLL
    
            private delegate void DelegateClose(int connNum); // function pointer for disconnection
    
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            private static extern IntPtr LoadLibrary(string dllPath);
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            private static extern bool FreeLibrary(IntPtr hDll);
    
            // 数据相关
            [DllImport("DMT.dll", CharSet = CharSet.Auto)]
            private static extern int RequestData(int commType, int connNum, int slaveAddr, int funcCode, byte[] sendbuf, int sendlen);
            [DllImport("DMT.dll", CharSet = CharSet.Auto)]
            private static extern int ResponseData(int commType, int connNum, ref int slaveAddr, ref int funcCode, byte[] recvbuf);
    
            // 串口通信
            [DllImport("DMT.dll", CharSet = CharSet.Auto)]
            private static extern int OpenModbusSerial(int connNum, int baudRate, int dataLen, char parity, int stopBits, int modbusMode);
            [DllImport("DMT.dll", CharSet = CharSet.Auto)]
            private static extern void CloseSerial(int connNum);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
                string path = Environment.CurrentDirectory;
    
                path = path.Remove(path.Length - 9);
                path = path.Replace("\\", "\\\\");
                path = path.Insert(path.Length, "DMT.dll"); // obtain the relative path where the DMT.dll resides
                _hDmtDll = LoadLibrary(path); // explicitly link to DMT.dll 
                var myRegKey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DEVICEMAP\\SERIALCOMM");
                if (myRegKey == null) return;
                foreach (var valueName in myRegKey.GetValueNames())
                {
                    ComPort.Items.Add(myRegKey.GetValue(valueName)
                        .ToString());
                }
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                FreeLibrary(_hDmtDll);
            }
    
            private void button1_Click_1(object sender, EventArgs e)
            {
                string strReq = "";
                string strRes = "";
    
                ActStatus.Text = "";
    
                int baud_rate = 9600;
                int data_len = 7;
                char parity = 'E';
                int stop_bits = 1; 
                int modbus_mode = 1; // ASCII 
                int comm_type = 0; // RS-232
                var connNum = Convert.ToInt32(ComPort.Text.Replace("COM", ""));
                DelegateClose closeModbus = CloseSerial;
    
                var status = OpenModbusSerial(connNum, baud_rate, data_len, parity, stop_bits, modbus_mode);
                if (status == -1)
                {
                    ActStatus.Text = @"串口打开失败";
                }
                byte[] sendbuf = new byte[1024];
                byte[] recvbuf = new byte[1024];
                int modbusAddr = 0;
                int modbusFunc = 0;
                int modbusAddrRet = 0;
                int modbusFuncRet = 0;
                int sendlen = 0;
                int i;
    
                strReq = ReqData.Text;
    
                const string strValid = "0123456789ABCDEF";
    
                if (strReq.Length < 4) 
                {
                    ActStatus.Text = @"长度不够";
                    closeModbus(connNum);
                    return;
                }
    
                if (strReq.Length % 2 != 0) 
                {
                    ActStatus.Text = @"发送数据必须为偶数位";
                    closeModbus(connNum);
                    return;
                }
    
                for (i = 0; i < strReq.Length; i++) 
                {
                    if (strValid.IndexOf(strReq.ToUpper()[i]) == -1)
                    {
                        ActStatus.Text = @"包含无效数据";
                        closeModbus(connNum);
                        return;
                    }
                }
    
                for (i = 0; i <= strReq.Length - 2; i += 2) // 将发送数据放入缓冲区
                {
                    string strConvert = strReq[i] + strReq[i + 1].ToString();
                    if (i == 0)
                        modbusAddr = Convert.ToByte(strConvert, 16);
                    else if (i == 2)
                        modbusFunc = Convert.ToByte(strConvert, 16);
                    else
                    {
                        sendbuf[sendlen] = Convert.ToByte(strConvert, 16);
                        sendlen++;
                    }
                }
    
                // 发送数据
                int req = RequestData(comm_type, connNum, modbusAddr, modbusFunc, sendbuf, sendlen);  // modbus request
                if (req == -1)
                {
                    ActStatus.Text = @"数据发送失败";
                    closeModbus(connNum);
                    return;
                }
    
                // 接收数据
                int res = ResponseData(comm_type, connNum, ref modbusAddrRet, ref modbusFuncRet, recvbuf);  // modbus response
                if (res > 0)
                {
                    strRes += modbusAddrRet.ToString("X2");
                    strRes += modbusFuncRet.ToString("X2");
    
                    switch (modbusFuncRet)
                    {
                        case 0x01:
                        case 0x02:
                        case 0x03:
                        case 0x04:
                        case 0x11:
                        case 0x17:
                            strRes += res.ToString("X2");
                            break;
                    }
    
                    for (i = 0; i < res; i++) // recover a string from recvbuf
                    {
                        strRes += recvbuf[i].ToString("X2");
                    }
                    ActStatus.Text = @"数据接收完成";
                    ResData.Text = strRes;
                }
    
                else
                {
                    ActStatus.Text = @"未接受到数据";
                    ResData.Text = "";
                }
                closeModbus(connNum);
            }
        }
    }

     

    转载于:https://www.cnblogs.com/LicwStack/p/8974179.html

    展开全文
  • PLC通过TCP/IP协议通信实例C#源码

    热门讨论 2020-07-30 23:32:16
    C#写的与PLC通过TCP/IP协议通信的实例,代码供参考
  • PLC 通 讯 小 知 识

    2019-06-28 13:19:55
    PLC中的通讯线一定不能动力线走在一起(太近),不然在动力机启动的一瞬间,会或多或少的影响实事通讯,这是很危险的哈。最好它们之间有20-30厘米的距离,这样可以让运行稳定点! 转载于:...

        我发现哈!PLC中的通讯线一定不能与动力线走在一起(太近),不然在动力机启动的一瞬间,会或多或少的影响实事通讯,这是很危险的哈。最好它们之间有20-30厘米的距离,这样可以让运行稳定点!

    转载于:https://www.cnblogs.com/Bolin/archive/2008/08/12/1266157.html

    展开全文
  • linux串口与PLC通信,没有返回正确的数据,但是在windows串口上是可以的,也就是说波特率一些的应该是对的。但是在linux上就是不行,这是什么原因。
  • 倍福PLC简介

    万次阅读 2019-09-29 11:03:42
     本文介绍倍福公司的嵌入式PLC产品。 1. 特点   家喻户晓的西门子相比,倍福(Beckhoff)并不为众人所知,虽然二者都是德国品牌,但风格却截然不同。西门子唯我独尊,不管是通信协议还是编程语言都不开放,让...

    目的
      本文介绍倍福公司的嵌入式PLC产品。

    1. 特点

      与家喻户晓的西门子相比,倍福(Beckhoff)并不为众人所知,虽然二者都是德国品牌,但风格却截然不同。西门子唯我独尊,不管是通信协议还是编程语言都不开放,让人又爱又恨;倍福则兼容并蓄,采用通用的windows操作系统,支持标准的IEC 61131-3编程语言,总线通讯EtherCAT也是开放的。笔者认为未来的世界应该是开放兼容的,因此暂时站在倍福一方。
      倍福的产品采用了“白+红”的主题色,一反工业领域的沉闷单调,乳白色的光滑机壳搭配铝制散热格栅,给人第一印象高端大气,题图显示的是其高端系列CX2010。笔者不由感叹,老外做产品确实用心,性能先不谈,首先外观设计和做工就让人无可挑剔。
      当然了,品质好价钱自然也不会便宜,像图中这么一台PLC就要2万7千元,里面用的库还要单独买。
      你可以把倍福的PLC看成一台小电脑,它的机身上就赫然贴着“Windows Embedded”的标签。PLC搭载操作系统并不稀奇,比如菲尼克斯的PLC就采用了Linux操作系统。

    项目 代号 价格/元
    CPU模块 CX2010 27000
    TCP/IP库 TF6310-0070 1030

      CX2040最多可以带255个扩展模块,但是每多加10个模块就要添加一个额外的供电模块EL9410。

    2. 仿真

      仿真是指PLC程序写好后不下载到控制器中,而是先在本机上试运行,看看是否满足要求。
      要想进入仿真,首先要在电脑的BIOS中打开VT-X支持功能,随后在任务栏右下角的图标中进入Start模式(默认是config模式),即图标为绿色。

    展开全文
  • 在进行上位机软件开发时,第一步就是要跟PLC取得通信,能够读写PLC内各数据区的变量值。 通常有两种办法来读写PLC内的变量: 1. OPC OPC可以同时兼容不同品牌的PLC,但OPC的缺点也是显而易见的...
  • Snap7 西门子S7系列PLC的通信库 简介

    万次阅读 2019-10-02 19:48:31
    目录简介参考Snap7 简介Snap7 用途适用系统支持语言西门子S7通信介绍Snap7 组件Sanp7 APISnap7 PythonSnap7 安装PLC设置连接PLC读取数据发送数据Sanp7 C/C++node.js 简介 最近在开发一个项目,作为技术帝,已经...
  • Java读写操作西门子S7系列PLC

    千次阅读 2019-06-13 13:26:39
    原帖地址 https://blog.csdn.net/pnoter/article/details/90231852
  • 通过python-snap7实现对PLC的读写

    万次阅读 多人点赞 2018-04-25 16:10:35
    现场的情况是这样的:一台Linux服务器通过以太网和S7-1200 PLC连接,用户希望从客户端实现对PLC的读写。 说到PLC通信,一开始我想到的是用OPC Server来实现,因为之前有做过OPC Server的相关开发。但是OPC Server是...
  • 三菱PLC FX系列编程口通信的若干问题

    千次阅读 热门讨论 2004-08-16 09:08:00
    ----最近一段时间,由于工作上的原因,接触到了PC机与PLC编程口通信方面的开发。开发过程也走过不少的弯路,由于编程口通信协议未被三菱公司公开,所以很难找到一个系统的教材,在网上搜集了许多这方面的资料。...
  • 如何使用 Python 构建 PLC 通信?

    万次阅读 多人点赞 2018-08-15 09:24:52
    转自:...amp;utm_campaign=client_share&amp;timestamp=1534206063&amp;app=news_article&amp;utm_source=mobile_qq&amp;iid=40708017633&...utm_medi...
  • 紧急请教高手:S7 PLC与 上位机之间可以采用TCP/IP,Socket通讯吗? 回复 69 | 人气 8643 | 收藏 | 打印 | 推荐给版主 分享文章到:  gongkongedit 个人主页 给TA发消息 加TA为好友 发表于:...
  • Kepware的完美替代者

    万次阅读 2017-12-07 17:13:38
    为了获取PLC运转数据以及相关寄存器数据信息,很多用户使用Kepware软件,基于OPCserver的方式,获得相应所需的PLC数据信息。对于Kepware来说,其优势在于支持市场上绝大多数的PLC厂商,而其劣势同样明显:费用高昂、...
  • PC西门子PLC通讯免费软件Libnodave

    千次阅读 2013-09-24 14:45:43
    软件介绍:PC西门子PLC通讯免费软件Libnodave 2012-04-13 20:45 阅读(595)评论(0)编辑删除 Introduction: Libnodave is a free communication library for Siemens S7 300/400. It is free softwar, and ...
  • AGV控制系统搭建

    万次阅读 多人点赞 2020-09-15 19:58:21
    目的  本文介绍自动导引车(AGV)车载控制系统的实现过程,分为硬件搭建和软件设计两部分,并在其中穿插 AGV 控制的基础知识讲解。 1. 车载控制器 ... 车载控制器是控制系统乃至整个 AGV 的核心,那么... PLC...
  • ************************************************ Environment:raspi3B系统、win10 +上位机 、usb转TTL线一根、显示屏(或用Viwer...有点麻烦,需要网上查找) Info:author@:New Time:20180722 ...
  • ROS-Industrial

    千次阅读 2014-08-29 09:00:06
    随着的不断进步,机器人控制将有更多的选择,包括使用开放式控制软件控制多个供应商的机器人,采用可编程逻辑控制器(PLC )以及非机器人控制器。   机器人可以胜任更多的工作  如果现有的工具在使用上缺乏灵活...
  • snap7读写西门子plc1200步骤(python)

    万次阅读 2020-08-25 09:43:34
    本文是利用snap7进行对plc1200进行读写,所用语言是python3,windows7下,plc具体型号为S7-1212DC/DC/DC 1.snap7安装 win+R打开运行串口,输入cmd,确定后,输入下面的命令:(需要提前安装python 和 pip) 使用...
  • 远程设备运维云平台的架构一般都是控制器+网关+云平台软件,网关作为桥梁嫁接的作用,将控制器...第一、云平台需要跨平台显示,WINDOWS、LINUX、安卓、MAC等操作系统均要能够显示。 第二、云平台要求设备管理简单,尤其
1 2 3 4 5 ... 20
收藏数 786
精华内容 314
关键字:

plc与linux通讯