一、 概述

工业设备采用HMI+PLC控制是比较常见的方案,随着工业自动化的要求越来越高,现在很多设备都要求接入企业MES系统,MES系统一般为WEB系统,接口形式大部分为HTTP协议,这种传统方案和MES系统接口就比较麻烦。

本文提供一种简单的PC+PLC的工控方案,可以采用C#开发控制端人机交互页面,PLC做控制中心,两者通过Modbus协议通信交换数据。通过这个方案也可以对旧设备进行改造增加MES接口功能。

具体方案如下:

1、 试验下位机采用SIMENS S7-200 Smart,上位机应用程序采用C#开发,软件和PLC之间采用Modbus TCP协议进行通信。

2、 通信时,上位机避免访问PLC的IQ、AI、M等区域,只通过V区域进行数据交换:PLC实时将设备状态信息复制到指定位置,上位机每隔200ms去取一次状态数据,并根据设备状态和用户指令进行相关操作;

3、 上位机将PLC需要执行的动作指示传输到指定位置,PLC每次执行程序扫描时根据数据做出相应反应。PLC应对数据的有效性进行检验,如果检验不通过将拒绝执行动作,并报错。

4、 PLC还需要对一些安全方面的控制进行直接检查,不需要等待上位机指示。包括:急停响应、限位开关、过压等。

二、 方案说明

理论上,通过Modbus协议,上位机是可以直接访问I/O、A/D、D/A等端口的,也就是说可以直接读取输入状态,并控制输出。但我们不建议这种方案,主要有下面几个原因:

1、  PC向PLC询问的时间不可能很及时,我们设定为200ms,这个时间对控制系统来说响应时间有点长了,PLC扫码周期一般只几有个ms,响应较快;

2、 通讯过程存在不稳定性,当通讯异常时,PLC恰好处于一个不安全的状态就太危险了。

所以应保证PLC是具备控制能力的,当上位机向PLC发送命令时,如果出现异常,也应该保证PLC处于一个安全的状态。

三、 试验

我们做一个人简单的试验程序,它只有两个功能

1、  将输入(I0.0)的状态显示在程序界面上;

2、 通过上位机控制输出状态(Q0.0)

PLC部分程序:

一共有3行程序:

第1行:启动一个ModBus Server

说明:

1) MaxIQ:设置IQ的访问范围;

2)MaxAI设置AD的访问范围;

3)HoldStart:参数 HoldStart 为指向 V 存储器中保持寄存器起始位置的指针。通常将该值设置为 &VB0(VB0 地址);

4)MaxHold:参数 MaxHold 设置可用于 Modbus 地址 4xxxx 的 V 存储 器中的字保持寄存器数;

5)即使HoldStart不指向VB0,Modbus寻址仍是从0开始,范围为0~MaxHold,如果超出范围将报告非法数据地址的错误;

第2行:将输入状态映射到V0.0

第3行:将V2.0数据映射到输出状态

上位机界面:

程序通过一个方块的颜色显示PLC输入口的状态;Start和Stop按钮控制PLC输出端口状态。

客户端通过EasyModbusTCP库来实现基础通讯,首先通过Nuget下载依赖库。

状态读取:

int[] words = _modbusClient.ReadHoldingRegisters(0, 10);

byte VB0 = (byte)(words[0] >> 8);

byte VB1 = (byte)(words[00] & 0x00FF);

bool IsEmergencyStop = (VB0 & 0x01) == 1;

说明:

1)  首先从地址0读取10个字(WORD),由于设置了HoldStart为VB0,所以会读取VB0~VB10,共20个字节, words长度为10,每两个字节形成一个int数据,低位在前,高位在后;

2)  通过第一个int数据取得VB0和VB1,然后再取得VB0.0即可得到位信息。

控制输出:

public void StartTest()

{

//V2.0

_modbusClient.WriteSingleRegister(1, 0x0100);

}

public void StopTest()

{

//V2.0

_modbusClient.WriteSingleRegister(1, 0x0000);

}

WriteSingleRegister也是按照WORD来进行寻址的,例如:

WriteSingleRegister(10, 0x1234)

表示:VB20设置为0x12,VB21设置为0x34;

双方交换float类型的实时也是可以的,这里就不详细介绍了。

示例项目地址:https://gitee.com/seabluescn/plcsamples.git

PC+PLC通过Modbus协议构建工控系统的更多相关文章

  1. PLC模拟量采集模块在工控领域的应用

    在工业现场中,往往需要对温度.电流.电压等模拟量进行控制采集,这可以使用PLC对这些数据进行采集,但是如今生产各种PLC模拟量采集模块的厂家非常多,不同类型的PLC都是有自己专属的模拟量采集模块的,不 ...

  2. 工控安全入门(一)—— Modbus协议

    modbus基础知识 modbus协议最初是由Modicon公司在1971年推出的全球第一款真正意义上用于工业现场的总线协议,最初是为了实现串行通信,运用在串口(如RS232.RS485等)传输上的, ...

  3. 开源纯C#工控网关+组态软件(二)工控网关的实现

    一.   工控网关是什么 网关是物联网和工控系统的核心组件.网关起的是承上启下的作用.上即上位机,电脑/触屏监控系统.MES这些:下即下位机,包括PLC.传感器.嵌入式芯片等. 不同厂家的下位机,往往 ...

  4. [物联网] 电气 & 工控

    原理 一次回路和二次回路 一次回路:强电部分(380伏---22万伏),连接发电机.电动机.变压器.电网线路.电网开关.电网避雷器等等 二次回路:弱电部分,指的是控制线路.保护线路.测量线路.计量线路 ...

  5. 如何快速掌握plc或工控机与其他设备的modbus通讯协议?包括格式与实际过程 RT,本人从事工控行业多年,对于PLC与触摸屏也算比较熟悉,唯独对这个通讯协议比较难理解,请教高人指导,从什么地方开始下手,或者是说如何正确理解报文格式或正确写入

    Modbus协议是OSI模型的第七层的应用层通讯协议,定义了不同类型设备间交换信息方式,以及信息的格式. Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单 ...

  6. 构建虚拟工控环境系列 - 西门子虚拟PLC

    一. 概述 跟随着工控安全一路走来,工控安全市场今年明显有相当大的改善,无论从政策还是客户需求,都在逐步扩大中.但是,搞工控安全研究的人员却寥寥无几.一方面工控安全是个跨学课的技术,需要了解多方面的知 ...

  7. 工控安全入门之Modbus(转载)

    工控安全这个领域比较封闭,公开的资料很少.我在读<Hacking Exposed Industrial Control Systems>,一本16年的书,选了的部分章节进行翻译,以其抛砖引 ...

  8. Wireshark工控协议

    Wireshark是一个强大开源流量与协议分析工具,除了传统网络协议解码外,还支持众多主流和标准工控协议的分析与解码. 序号 协议类型 源码下载 简介 1 Siemens S7 https://git ...

  9. 工控安全入门(五)—— plc逆向初探

    之前我们学习了包括modbus.S7comm.DNP3等等工控领域的常用协议,从这篇开始,我们一步步开始,学习如何逆向真实的plc固件. 用到的固件为https://github.com/ameng9 ...

随机推荐

  1. 题解 c(留坑)

    传送门 这题卡常--而且目前还没有卡过去 首先以原树重心为根,向所有子树重心连边,可以建立一棵点分树 点分树有两个性质: 一个是树高只有log层 另一个是两点在点分树上的lca一定在原树上两点间的树上 ...

  2. luoguP2601 对称的正方形

    题目描述 给出一个数字矩形,求这个矩形中有多少个子正方形满足上下对称.左右对称. 思路 我们可以用3个哈希数组 \(a\ b\ c\) 分别表示矩形从左上往右下看,从左下往右上看,从右上往左下看的样子 ...

  3. SpringBoot快速入门(一)

    本文内容 SpringBoot概述 SpringBoot快速入门 SpringBoot起步依赖原理分析 SpringBoot配置 SpringBoot整合其他框架 1.SpringBoot概述 1.1 ...

  4. 多线程同步AutoResetEvent 和ManualResetEvent

  5. WPF---依赖属性(一)

    一.概要 C#中属性是抽象模型的核心部分,而依赖属性是专门针对WPF的. 在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性. 依赖属性优点如下: ...

  6. Quartz任务调度(2)CronTrigger定制个性化调度方案

    Cron表达式 1. 时间字段与基本格式 Cron表达式有6或7个空格分割的时间字段组成: 位置 时间域名 允许值 允许的特殊字符 1 秒 0-59 ,-*/ 2 分支 0-59 ,-*?/ 3 小时 ...

  7. Django中的增删改查

    1.model 假设我们的model如下: 某个JobType下有很多Job. class JobType(models.Model): name = models.CharField(max_len ...

  8. java包装类注意点

    Integer one = new Integer(100); Integer two = new Integer(100); Integer three = 100; Integer fore = ...

  9. Servlet常见问题

    时间:2016-12-6 23:18 java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMapcommo ...

  10. docker安装与配置nginx详细过程

    注:大鸟飞过,此方式只用于快速搭建使用 第一步 pull nginx 命令:docker pull nginx 第二步 启动nginx 命令:docker run --name nginx -p 80 ...