PLC-串口通信实例

2023-11-14

随着微电子及控制技术的不断发展,PLC已逐渐成为一种智能型、综合型控制器,由PLC构成的集散控制是现代工业控制的一个重要组成部分。PLC具有使用简单方便,故障率低,抗干扰能力强等优点;但同时,数据的计算处理与管理能力较弱,且无法提供良好的人机界面。将计算机与PLC结合起来,可使两者优势互补,充分利用计算机友好的人机界面,实现人机对话和监控功能,并可进行一定的辅助决策,组成高性能价格比的控制系统。实现计算机与PLC结合的控制系统的关键之一是二者之间的通信。

    本设计选用三菱FX2N系列的PLC,以Visual c++6.0作为开发工具对PLC通讯主程序进行设计,串口通讯采用ActiveX控制Microsoft Communication Control 6.0,最后用PLC编程电缆将PLC编程口与计算机串口连接进行调试。

1 三菱PLC与计算机之间通信协议

    串行通信是指外设和计算机间使用一根数据信号线一位一位地传输数据,每一位数据都占据一个固定的时间长度。“串行”是指外设与接口电路之间的信息传送方式,CPU与接口之间仍按并行方式工作。串行通信的四个重要参数:波特率(衡量通信速度的参数)、奇偶校验位(一种简单的检错方式)、数据位(衡量通信中实际数据位的参数)和停止位(表示单个数据包的最后一位)。

    (1)三菱FX2N系列通信数据帧格式

    FX2N系列的PLC与计算机之间的通信采用RS-232C标准,其传输速率一般设为9 600 bps,实际传输过程还可设其它,比如115 200 bps等。奇偶校验位采用偶校验。数据以帧为单位发送和接收。一个多字符帧由起始字元、命令号码、元件首地址、结束字元、和校验五部分组成,其中和校验值是将命令码STX—ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX和ETX分别表示该字符帧的起始标志和结束标志。

    起始字元(STX):ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始;

    命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码随同其它信息一同发送给上位机;

    元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC;

    元件个数:一次读取位元件或字元件的数量;

    结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束;

    校验码(Checksum):校验码是将STX—ETX之间的ASCII字元的16进制数值以"LRC(Longitudinal Redundancy Check)"法计算出1个Byte长度(两个16进制数值00-FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。

    (2)三菱FX2N系列通信命令

    FX2N系列PLC有4个通信命令,它们是读命令(30H)、写命令(31 H)、强制通命令(37H)、强制断命令(38H)。

    (3)三菱FX2N系列通信控制字符

    ENQ(ASCII代码05H):计算机向PLC发送请求;

    ACK(ASCII代码06H):PLC对ENQ的确定回答;NAK(ASCII代码15H):PLC对ENQ的否认回答;

    STX(ASCII代码02H):报文开始;

    ETX(ASCII代码02H):报文结束。

    (4)FX2N系列设备地址

    ①读写时的软设备地址

    S0-S7:0000H;X0-X7:0080H;Y0-Y7:00AOH;TO-T7:00COH;M0-M7:0100H;CO-C7:01COH;DO-D7:1000H

    ②置位/复位时的软设备地址

    S0-S7:0000H;X0-X7:0400H;Y0-Y7:0500H;TO-T7:0600H:MO-M7: 0800H;CO-C7:0E00H;DO-D7:0100H

    ③传输过程

    PC机与FX系列PLC之间采用应答方式通信,传输出错则组织重发。其传输过程如图1所示。

传输过程

图1传输过程

    PLC根据PC机的命令,在每个循环扫描结束处的END语句后组织自动应答,无需用户在PLC一方编写程序。

2 系统功能设计

    系统主要实现PLC与计算机的通讯,具体主要完成PC机指令下传、监测PLC状态、接收PLC信息等功 能。系统组成:小型PLC一台、RS232串口、编程电缆、通讯界面。主操作界面在完成系统功能的前提下,力求明了直观,操作简单灵活方便。系统以VC++6.0为平台,设计的界面如图2所示。

系统界面

图2 系统界面

本程序设计了四个串口可供选择,只有在选择串口之后才可进行“打开串口,关闭串口”的操作,当打开串口以后,就可以对PLC进行相应的操作了,为了使界面整洁干净,特别设计了“清空发送区”和“清空接收区”选项,当发送数据和接收数据放满编辑框时只需点击这两个按钮,数据就会清空。且实现代码相当简单,m_sSend.Empty()、m_sReceive.Empty()就可轻松实现这一任务。

 

    PC机与PLC的通讯程序流程图如图3所示。

PC机与PLC的通讯流程图

图3 PC机与PLC的通讯流程图

    系统通信控制程序采用了MSComm控件。此控件提供了两种通信方法:①文件驱动,即用MSComm控件的OnComm文件捕获并处理通信事件和错误,它是处理串行端口交互作用的一种非常有效的方法;②查询方式,通过查询串口属性来获得事件和错误,实质上还是属于事件驱动,但在有些情况下显得更为便捷。MSComm6.0控件的属性:①CommPort,设置或返回通信端口号;②Settings,以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位;③PortOpen,设置或返回通信端口的状态,也可以打开和关闭端口;④Input,返回和删除接收缓冲区中的字符;⑤InputMode,设置或返回Input属性取回的数据的类型,数据取回的形式为字符串或二进制数据的数组;⑥CommEvent返回最近的通信事件或错误的数字代码,通信程序设计时可以根据该属性值执行不同的操作,在运行时为只写;⑦Output,将字符串写入发送缓冲区。

    MSComm6.0控件只有一个事件,即Oncomm事件。在通信时如果发生错误或者事件,将会引发Oneomm事件并且改变其属性值,通过GetCommEvent()可获得Oncomm产生事件或错误的代码。在与PLC进行通信的过程中,使用MSComm6.0控件可以自动完成PLC对计算机发送信息的接收,最终实现PC机对PLC的状态检测。

    软件实现过程:FX2N系列的PLC与计算机之间的通信采用RS-232C标准,其传输速率固定为9 600bps,奇偶校验位采用偶校验。数据以帧为单位发送和接收。PC机向PLC中写数据时首先需对串口进行初始化,并对波特率、校验位等进行设置,然后根据通信协议对PLC进行相应的读写、复位、置位等操作,PLC根据PC机送来的控制字进行相应的操作。数据发送,采用专用发送指令XMT TABLE,CommPort,其中TABLE为发送缓冲区的首地址,首地址中保存要发送的字节数,即数据长度,最大为255,其后的地址中保存要发送的数据,CommPort指定用于发送的端口。对于数据接收,使用接收指令RCV TABLE,CommPort,接收指令激活初始化或结束接收信息,通过制定端口接收信息并存储于数据缓冲区中,数据缓冲区的第一个数据指明了接收的字节数。

3 系统功能验证

    将计算机用通讯电缆与PLC相连后,首先发送请求05H以后,验证计算机与PLC是否可以正常通信,接收区显示06,表示PLC对ENQ的确定回答,即PLC已准备好,可以进行下面的操作,具体如图4和图5。

    这里主要对PLC读值功能进行验证。读操作命令格式如下:

    STX—CMD0一数据段一ETX—SUMH—SUML

    在按上述命令格式发送相应的代码后,就可直接读取PLC响应的信息了。响应信息格式如下:

    STX—DATA—ETX—SUMH—SUML

    图6和图7分别是对PLC进行读值验证时发送数据和接收数据的显示。

 发送数据显示

图6 发送数据显示

接收数据显示

图7 接收数据显示

    其中接收数据显示中的023030033633,是对x软地址值(0080H)读取后接收到的数据。具体算法如下:

    nSUMLx=(0X30+0X30+0X03)%16=3<9,

    nSUMHx=((0X30+0X30+0X03)%256)/16=6<9,

    nSUMLx=0x30+nSUMLYl=0X33,

    nSUMHx=0X30+nSUMHY2=0X36

    故,转变成两字节ASCII代码SUMLx=33;SUMHx=36。

    理论分析和实际操作的结果是一致的,即证明了本设计是准确无误的。

4 结语

    本文主要使用Visual C++6.0作为开发工具,通过编写各个模块对应的操作程序,最后用通讯电缆将PC机与三菱PLC相连进行调试,基本上达到了预期的设计目标,实现了计算机与PLC的通信功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PLC-串口通信实例 的相关文章

  • LeetCode第 292 题:Nim游戏(C++)

    292 Nim 游戏 力扣 LeetCode 剩下4块的时候 如果轮到你 那么你必输 先简单推一下 如果第n块的时候轮到你 n 5 必胜 拿1块 n 6 必胜 拿2块 n 7 必胜 拿3块 n 8 必败 无论我拿几块 对方都可以将我逼到4的
  • 基于Lasagne实现限制玻尔兹曼机(RBM)

    RBM理论部分大家看懂这个图片就差不多了 Lasagne写代码首先要确定层与层 RBM 正向反向过程可以分别当作一个层 权值矩阵互为转置即可 代码 coding utf 8 data format is bc01 written by Ph
  • 【Shell编程】Shell中Bash变量-用户自定义变量

    目录 系列文章 Bash变量 用户自定义变量 变量的命名规则 变量分类 本地变量 实例 系列文章 Shell编程 Shell基本概述与脚本执行方式 Shell编程 Shell中Bash基本功能 Bash变量 用户自定义变量 变量的命名规则
  • 前端跨域解决方案

    目录 同源政策 跨域 常见的跨域场景 跨域解决方案 1 JSONP跨域 1 原生JS实现 2 jquery Ajax实现 3 Vue axios实现 后端node js代码 2 跨域资源共享 CORS 1 简单请求 2 非简单请求 3 CO
  • 满载大模型技能干货的AI Day活动全新来袭

    AI大模型时代 创造力才是第一生产力 满载大模型技能干货的AI Day主题活动全新来袭 丰富有趣的Workshop即将空降你的学校 帮助大家掌握前沿技能 拓展技术视野 迈进AIGC的大门 打造属于你的AI应用 满足不同阶段的学习实践需求 无
  • AD10软件打不开,停留在开机界面上

    解决办法 把AD10的缓存文件都删掉 C Users Administrator AppData Roaming Altium下的文件都删掉
  • 二分图最大完美匹配

    嗯 想不通 就是二分之后的点 寻找左边的点和右边的点的保证两条边的顶点不相同的最大边数 匈牙利算法 O mn 左边寻找和右边相邻的边 如果右边还没有和左边进行连线 那么匹配成功 如果右边已经进行连线 那么考虑左边是否能更改连线 换一个右边
  • Qt总结——菜单隐藏

    我们在使用QMenu的时候经常会在其中添加子菜单以及action QMenu中的隐藏禁用的操作是针对action的 所以直接操作action是没有问题的可以想要的效果 但是menu不行 因为不是action类型的 QAction actio
  • 元组:(tuple)

    1 元组 tuple tuple 相比较列表list 元组和列表都是一种有序集合 0 2 3 5 9 第一个元素即是第一个存入的元素 按照存放顺序存储 元组的访问 格式 元组名 下标 tuple4 1 2 3 4 5 print tuple
  • python从视频信息中提取音频,只用了三行代码...

    在做多媒体素材的时候 往往需要从视频中提取音频信息 在python中提供了moviepy这个非标准库 可以很快的帮助我们完成这个操作 算上导入moviepy非标准库的操作只需要三行代码完成 喜欢记得收藏 关注 点赞 1 单文件处理 将mov
  • Java 性能优化的 50 个细节

    前言 在JAVA程序中 性能问题的大部分原因并不在于JAVA语言 而是程序本身 养成良好的编码习惯非常重要 能够显著地提升程序性能 1 尽量在合适的场合使用单例 使用单例可以减轻加载的负担 缩短加载的时间 提高加载的效率 但并不是所有地方都
  • MySQL 表的 添加、更新与删除数据

    添加数据 为表中的所有 部分字段 添加数据 可以添加部分 也可以全部添加 INSERT INTO 表名称 字段名 VALUES 数据类型对应的 值 指定的字段 或 全部字段添加的数据 INSERT INTO 表名称 SET 字段名 值 同时
  • 用python实现时间序列自相关图(acf)、偏自相关图(pacf)

    自相关图是一个平面二维坐标悬垂线图 横坐标表示延迟阶数 纵坐标表示自相关系数 偏自相关图跟自相关图类似 横坐标表示延迟阶数 纵坐标表示偏自相关系数 自相关图与偏自相关图的python代码实现 from statsmodels graphic
  • 一个对象赋予另一个对象

    它的两个对象 n1 和n2 是在 main 里创建的 每个对象中的i 值都赋予了一个不 同的值 随后 将 n2 赋给n1 而且 n1 发生改变 当给n1 i赋值时 n2 i也会随着改变 这是由于无论n1 还是n2 都包含了相同的句柄 它指向
  • stm32cubeide驱动LCD1602显示屏

    STM32驱动LCD1602 硬件连接关系 STM32CUBEIDE设置 代码 项目设置 最后运行 硬件连接关系 LCD1602 STM32 VCC VCC GND GND VO VCC 滑动变阻 RS PB1 RW PB2 BOOT1 E
  • 上海国际区块链赋能传统产业峰会-王伟:道道人才链启动

    上海国际区块链赋能传统产业峰会 王伟 道道人才链启动 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编 在当前 区块链成为全球技术发展的前沿阵地 谋定研究 对话中国经济和信息化 区块链将加速 可信
  • QPixmap的尺寸设置

    问题描述 在控件上使用QPixmap时 希望能重新修改图片的分辨率 而不是使用图片的原始分辨率 解决方法 主要有两种方法 设置控件的尺寸 例如QPixmap被传入一个QLabel控件时 可以通过设置QLabel控件的尺寸来对QPixmap进
  • C++11 noexcept 关键字用法学习

    最近学习和写了一个 mint 的板子 其中用到了 noexcept 关键字 对这个关键字不太熟悉 便学习一下刘毅学长的文章 C 98 中的异常规范 Exception Specification 傲芙小说网 https www 3973 i
  • kaggle冠军代码汇总

    https www cnblogs com rw rongwei p 6509146 html
  • linux 查看进程和内存使用情况,深入理解linux下查看进程内存的使用情况

    本篇文章是对linux下查看进程内存的使用情况进行了详细的分析介绍 需要的朋友参考下 动态查看一个进程的内存使用 复制代码 代码如下 1 top命令 top d 1 p pid pid 设置为delay 1s 默认是delay 3s 如果想

随机推荐

  • 为什么C++内置类型的局部变量不能默认初始化

    C 有个人所共知的特性 就是它的内置类型是无法在局部区域内默认初始化的 如下所示 int k int main int m cout lt
  • 对象中BigDecimal值转换为JSON中精度丢失(出错)的问题解决方法

    代码如下 1 定义一个包含BigDecimal类型的类 Data public class User private String name private BigDecimal salary 2 分别使用两种方法将对象转换为字符串 pub
  • Linux安装python3

    一 卸载python命令 rpm qa grep python xargs rpm ev allmatches nodeps 强制删除已安装程序及其关联 whereis python xargs rm frv 删除所有残余文件 xargs
  • Opencv寻找轮廓的最小外接矩形,并获取矩形的中心点,旋转角度

    本代码可用于获取物体的坐标偏移量 旋转角度 if thresholdValue Mat src Mat imHeight imWidth CV 8U pImageBuffer Mat mat src copyTo mat threshold
  • springboot 普通类自动注入mapper

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 解决方法 解决方法 普通类使用 Component注解修饰 添加本类型静态属性 所需mapper属性 添加init方法 用 PostConstruct注解修饰 方法
  • vue +element实现图片上传加展示

    一 声明变量 我们在这里声明了两个qrcodeaddress 分别是绑定表单的字段和作为展示图片的字段 二 编写html部分 在这里img标签是我们上传之后 展示的地方 action是上传路径 on success是上传成功后的方法 三编写
  • Vue之路由

    Vue之路由 今天来看看vue怎么实现路由功能 我们在vue cil脚手架搭建好的基础上来实现路由功能 如果搭建完初始化项目时没有路由功能则需在npm安装路由 命令 npm install vue router 然后在main js中引用路
  • 【Python】os.path.exists()的含义 及文件存在但os.path.exists()返回False的原因

    os path exists 函数的功能是查看给定的文件 目录是否存在 存在返回True 不存在返回False 如果给定的文件只有文件名 会在当前文件的目录下索引 给定的文件 目录可以是绝对索引 文件存在但os path exists 返回
  • Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

    当应用开始脱离单机运行和访问时 服务发现就诞生了 目前的网络架构是每个主机都有 个独立的 IP 地址 服务发现基本都是通过某种方式获取到服务所部署的 IP 地址 DNS 协议是最早将 个网络名称翻译为网络 IP 的协议 在最初的架构选型中
  • cenos自动启动tomcat

    首先创建一个脚本 关闭tomcat 等待2分钟 启动tomcat 并且把日志输出在 usr local tomcat tomcatchognqi log bin bash export JAVA HOME usr local jdk jdk
  • 创建Unity项目

    1 点击 新项目 2 根据实际所需选择对应模板 3 等待创建项目完成 4 点击项目即会在新窗口打开项目
  • 如何自动更新-CMD

    不打算讲得很细 我本人能看懂就行 现在客户端自动更新 一般要用到更新程序 这样就是两个项目 两个exe了 所以对我这来说比较反感 所以就选择了另外一种方法 cmd 由于是自动更新客户端 且是内置的 所以要关闭自身 但是cmd在process
  • VScode远程服务器docker环境

    经常会遇到需要对docker容器中的代码调试的问题 远程使用IDE是很好的选择 具体操作 1 在VScode中下载Remote SSH 2 创建一个ssh连接服务器 3 启动一个docker并注明服务器端口与docker端口的映射关系 Ti
  • 使用 RestSharp访问接口返回 空 数据原因(ssl加密)解决方法

    例子 var client new RestClient https wwwcie ups com rest Track var request new RestRequest Method POST request AddHeader p
  • QT中实现应用程序的单例化

    一介绍 通过编写一个QSingleApplication类 来实现Qt程序的单例化 原文的作者是在Windows Vista Qt4 4 下实现的 不过应用在其他平台上是没问题的 本文是我在http www qtcentre org wik
  • 女程序员的转型

    女 30 做了开发6年 各种语言都多少有点用 但以前都是野路子开发 两个人 一个人做pc端 一个人做web端 或者一个人做app 一个人做web 没有ui 没有前段 所有的人都是你 虽然之前也算是项目经理 但没有一个规范的流程 甚至连流程图
  • OpenCV中imread/imwrite与imdecode/imencode的异同

    OpenCV中的cv imdecode函数是从指定的内存缓存中读一幅图像 而cv imencode是将一幅图像写进内存缓存中 cv imread是从指定文件载入一幅图像 cv imwrite是保存一幅图像到指定的文件中 cv imread和
  • 如何阅读大型程序

    近期想读下程序 但发现非常难 比如一个网络程序模块 有6个cpp源程序 共5916行源代码 不包括头文件中引用的别的地方的代码 1 我对业务还算熟悉 但是看到那么多变量定义时还是感到理解起来很吃力 因为有些变量根本就是过程变量 2 函数层层
  • rust安装link.exe报错

    rust安装link exe报错 今天安装rust完成之后 直接cargo new一个hello world程序 等到cargo run代码的时候发现报错 linking with link exe failed exit code 113
  • PLC-串口通信实例

    随着微电子及控制技术的不断发展 PLC已逐渐成为一种智能型 综合型控制器 由PLC构成的集散控制是现代工业控制的一个重要组成部分 PLC具有使用简单方便 故障率低 抗干扰能力强等优点 但同时 数据的计算处理与管理能力较弱 且无法提供良好的人