串口通信 校验码_一文读懂S7-200 SMART自由口通信!

13ae22e45ebef1074fb6a7131c99ff04.png

学习S7-200 SMART时了解到,基于RS485接口可实现一下几种通信:

1)modbus RTU通信

2)PPI协议通信

3)USS协议通信

4)自由口通信

何为自由口通信呢?

前三种通信必须要PLC和与其通信的设备支持相同的通信协议,如果两者之间没有共同的通信协议则需要用到自由口通信。自由口通信也称无协议通信,需要根据对方设备的通信数据格式编写一个临时协议,不仅需要编程人员学会如何编写程序,还需要了解对方的通信数据格式,所以对编程人员要求较高,随着标准协议(modbus,USS等)普及,自由口应用越来越少,但是对于一下小的设备如扫码枪等,并没有集成标准通信协议,所以只能选用自由口通信,Moubus和USS其实是自由口的一个特例。很多人碰到自由口通信就手足无措了,其实只要掌握规律,自由口通信不一定很难。为此我总结了自由口通信的基本步骤:

1)读懂对方的数据格式。

串行通信中,数据是一位一位的进行发送,也就是0和1。为了能够准确的将数据发送过去,往往会加上1个起始位,1个校验位,1个停止位(无校验是为2个停止位)如图1-1所示。

3cf4e53eb2b8392d70f332a21b07fcdf.png

图1-1

我们就以Modbus RTU为例详细看一下串口通信中数据是如何发送和就收的。

ModbusRTU代码系统如下:

·1个起始位。

·7或8个数据位,最小的有效位先发送。

·1个奇偶校验位,设成无校验则没有。

·1个停止位(有校验时),2个Bit(无校验时)。

数据格式的描述如下表:

11-bit字符帧(BITl-BIT8为数据位):

起始位

Bit1

Bit2

Bit3

Bit4

Bit5

Bit6

Bit7

Bit8

校验位

停止位

10-bit字符帧(BITl-BIT7为数据位):

起始位

Bit1

Bit2

Bit3

Bit4

Bit5

Bit6

Bit7

校验位

停止位

通信中要保证通信双方要有相同的波特率,数据格式,奇偶校验位。

波特率:通信速度,每秒中发送的位的个数,单位为Bit/S或bps。

奇偶检验:偶校验的含义:在数据传输前附加一位偶校验位,用来表示传输的数据中“1”的个数是奇数还是偶数,为偶数时,校验位置为“0”,否则置为“1”用以保持数据的奇偶性不变。奇校验的含义:在数据传输前附加一位奇校验位,用来表示传输的数据中“1”的个数是奇数还是偶数,为奇数时,校验位置为“0”,否则置为“1”用以保持数据的奇偶性不变。

一个字符帧中,真正起作用的是数据位。起始位、检验位和停止位的加入只是为了将数据位正确地传输到对方设备。在实际应用时一定要将主站和从站数据位、奇偶校验、停止位设为一致。

在通信过程中一个完整的通信报文包括多个数据帧,一般包含地址帧、功能码帧、数据帧、检验帧。在Modbus RTU中,一个报文发送完成之后会保持3.5个字节的静默时间,再发送下一个报文,如图1-2所示。

873536c315202513d30a19dc9e6de8b1.png

图1-2

地址帧:指示从站的站号,以十六进制表示,如01H。

功能码帧:指示操作是读还是写,03H为读,06H为写操作。

数据帧:包含要读写的从站参数起始地址、个数及数值,数据帧在发送的时候每个字包含两个8位字符,先发高8位后发低8位。

校验帧:CRC校验值,也拆分成两个字节,先发低字节后发高字节。校验帧的原理是将将所有数据帧进行CRC运算,算出一个检验值,加在数据帧后面一起发送过去,从站设备接收到数据后再进行一次运算,将运算的检验值和接收的值进行比较,如果不一致则说明数据发送出错。

例如:从01H号站变频器,读取从0004H地址开始的2个数据的值。

发送报文:01H(地址帧),03H(功能码帧),00H(起始地址高位),04H(起始地址低位),00H(数据个数高位),02H(数据个数低位),85H(CRC低位),CAH(CRC高位)

例如:将5000(1388H)写到从站地址02H变频器的0004H地址中。

发送报文:02H,06H,00H,04H,13H,88H,C5H,6EH

了解了通信协议的数据格式,接下来就是编写自由口通信程序:,下面就以通过自由口通信控制英威腾变频器启停为例讲解程序的编写。

归纳总结了一下分为以下几步:

1)定义通信端口。

SMB30 和 SMB130 分别为端口 0 和 1 的控制字节,提供了波特率、奇偶校验、数据位和通信协议的选择,如图1-3所示。

cd4f4e6e35e29956c1debba3bcf0d2c1.png

图1-3

利用字节传送指令将分析所得的控制字节数据写入到SMB30或SMB130中,如图1-4所示。

1ffd37149777d86d42c858a8a913299a.png

图1-4

往SMB30中写入2#01001001,则定义端口0为自由协议,波特率9600,8位数据位,偶校验。

2)按照发送指令XMT的缓冲区格式定义发送数据报文。

fbdcb630782db5151639dc5948dbae45.png

图1-5

图1-5中TBL(VB0)为发送缓冲区起始地址,格式为:

VB0:发送字节总数。

VB1:报文第一帧,即地址帧,16#01

VB2:功能码帧,写16#06。

VB3:通信地址高位,控制启停地址为16#2000,高位为16#20。

VB4:通信地址低位,16#00。

VB5:写入数值高位,16#00(写入16#0001正转,16#0002反转,16#0005停止)。

VB6:写入数值低位,16#01。

VB7:CRC校验码低位,16#43。

VB8:CRC校验码高位,16#CA。(校验码为16#CA43)

程序如图1-6所示,此处用到一个CRC算法程序,

a4ff651b12dc79e84ba1b54b36bc3a2d.png

图1-6

3)触发发送指令XMT,如图1-7所示。

53b1b8bbea574d7fd5a09edc2379e5bf.png

图1-7

3)接收数据,接收有两种方式,一是利用RCV指令接收,应用较为复杂,此处不介绍;一是利用SMB2缓冲地址接收,因为端口0接收到一个字符会触发8号中断,并将其存放于SMB2中,通常利用8号事件触发中断,在中断中将SMB2的数据转存到其它地址,否则下一数据将覆盖该数据,直到接收完所有数据后置位一个完成标志,延时一定事件再次触发发送指令。接收中断程序如图1-8所示。

1983603ef2254b1bab4becb52f2b699a.png

图1-8

以上介绍了S7-200SMART的自由口通信,使用自由口通信时编写程并不是难点,关键在于读懂对方通信数据格式,在以后编程过程中尽量选用支持标准协议的设备,确实需要选用自由口也不用害怕,只要按照上述步骤一步步来完成,相信肯定可以通信成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hbase 学习(十三)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪。一个master集…

python expect模块_Python基础教程:用Python怎么telnet到网络设备

Python基础教程:用Python怎么telnet到网络设备0.前言Telnet协议属于TCP/IP协议族里的一种,对于我们这些网络攻城狮来说,再熟悉不过了,常用于远程登陆到网络设备进行操作,但是,它的缺陷太明显了,…

Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

[Java教程]动态加载页面数据的小工具 javascript jQuery (持续更新)0 2014-05-07 18:00:06使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以…

pygame render怎么显示中文_PyGame开发游戏(2D)02.基础图元

这节将介绍PyGame的基础架构。并学习如何在PyGame里绘制各种几何图形和显示加载图片。01.应用框架上一节的示例程序里,我们用到一个PyGame的应用程序框架。这是一个基础框架,利用它我们可以很轻松的添加各类图型绘制,键盘鼠标输入处理和各类逻…

word+增加水印+java_为Word2019文档添加水印的两种方法

水印的类型包括文字水印和图片水印两种。在Word文档中添加文字水印时,可以使用程序中预设的水印效果,而图片水印则需要自定义添加。一、使用程序预设的文字水印Word 2019中预设了机密、紧急、免责声明三种类型的文字水印,用户可根据文件的类型…

如何设置CentOS 7获取动态及静态IP地址

自动获取动态IP地址1.输入“ip addr”并按回车键确定,发现无法获取IP(CentOS 7默认没有ifconfig命令),记录下网卡名称(本例中为ens33)。2.输入“cd /etc/sysconfig/network-scripts/”按回车键确定,继续输入“ls”按回…

请求列出指定服务器上的可用功能失败_滥用 ESI 详解(上)

在进行安全性评估时,我们注意到了标记语言 Edge Side Includes (ESI)中的一个意外行为,这种语言用于许多流行的 HTTP 代理(反向代理、负载平衡器、缓存服务器、代理服务器)。我们发现成功的 ESI 攻击可以导致服务器端请求伪造(SSRF)、各种绕过 HTTPOnly …

openstack nova-network 的小bug的排错经历

环境是 nova-network vmwareflatdhcp错误表现为 开出来的虚拟机有一定几率获取不到dhcp地址,手工赋予ip则正常,用flat模式注入的ip正常,下面是排错过程1首先找网络防火墙已经把 dnsmasq对应的端口已经打开抓包结果:可以看到虚拟机…

anaconda base环境_anaconda中安装packages:pip还是conda install?

conda install我就不说了,这都不会别学了就。Using command:$ which -a pip, the terminal will return:This indicates two different pip path to install packages[1].在tf23环境中pip install在base环境中pip install在windows下powershell内,进入到…

【风马一族_xml】xmlp之dtd1

什么是XML约束?在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为xml约束 2. 为什么要使用xml约束? 参看提示栏 3. xml约束的作用? 约束xml的写法对xml进行校验4. 常见的xml约束技术 xml dtdxml Schema…

java ssm框架 缓存_SSM框架之MyBatis3专题4:查询缓存

查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库中查询获取结果数据,从而提高访问速度。MyBatis的查询缓存机制,根据缓存区的作用域(声明周期)可划分为两种:一级查…

matplotlib画图_漂亮,超详细的matplotlib画图基础

来自 | 逐梦erhttps://zhumenger.blog.csdn.net/article/details/106530281本文仅作技术交流,如有侵权,请联系后台删除。数据可视化非常重要,因为错误或不充分的数据表示方法可能会毁掉原本很出色的数据分析工作。matplotlib 库是专门用于开发…

android recycleview长按多选_UI设计中Android和IOS设计差异总结

由于设计师、产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照iOS的规范进行设计,两端只做一套。只做一套的会存在两个问题:1、安卓用户的使用习惯不太适应iOS的设计&#xff0c…

自定义动画属性java_创建酷炫动画效果的10个JavaScript库

原标题:创建酷炫动画效果的10个JavaScript库1) Dynamics.jsDynamics.js是设计基于物理规律的动画的重要Java库。它可以赋予生命给所有包含CSS 和SVG属性的DOM(文本对象模型)元素,换句话说,Dynamics.js适用于所有Java对象以及一系列其它的元素…

php xlsx里插入图片_常见的 PHP 面试题和答案分享

如何直接将输出显示给浏览器&#xff1f;将输出直接显示给浏览器&#xff0c;我们必须使用特殊标记 <&#xff1f;and&#xff1f;>。PHP 是否支持多重继承&#xff1f;PHP 只支持单继承。PHP 的类使用关键字 extends 继承另一个类获取图片属性&#xff08;size, width, …

pandas concat_pandas-数据合并-concat(最全参数解释,含代码和实例)

pandas中的concat的功能&#xff1a;假设你现在需要将多个数据合并&#xff0c;前提是&#xff1a;这几个文件列名都一致&#xff0c;也就是说这几个文件格式完全一样&#xff0c;只是数据不太一样&#xff0c;类似于合并多个文件这种&#xff0c;实际数据分析中也会遇到这种情…

java中的de是什么_【转】java中main函数解析

源地址&#xff1a;http://www.cnblogs.com/xwdreamer/archive/2012/04/09/2438845.html从写java至今&#xff0c;写的最多的可能就是主函数public static void main(String[] args) {}但是以前一直都没有问自己&#xff0c;为什么要这么写&#xff0c;因为在c语言中就没有这样…

JAVA多线程(一)线程安全问题产生的原因

JAVA线程内存与主存间映射示意图Java内存模型中规定了所有的变量都存储在主内存中&#xff0c;每条线程还有自己的工作内存&#xff0c;线程的工作内存中保存了该线程使用的变量到主内存副本拷贝&#xff0c;线程对变量的所有操作&#xff08;读取、赋值&#xff09;都必须在工…

两顶点的路径长度为k_计算两个顶点之间的所有可能路径

两顶点的路径长度为kWhat to Learn? 学什么&#xff1f; How to count all possible paths between two vertices? 如何计算两个顶点之间的所有可能路径&#xff1f; In the graph there are many alternative paths from vertex 0 to vertex 4 在图中&#xff0c;有许多从…