变电运检常用知识分享

Modbus通讯协议之三——ASCII

2018-12-29  本文已影响0人  洪城小电工

在之前的Modbus通讯协议之二中絮絮叨叨的写了那么多,如果大家认真看完的话,剩下的两种方式——ASCII与TCP,只是语法上的不同,没有本质上的区别。现在我就开始介绍Modbus ASCII。

一、ASCII码表

ASCII(American Standard Code for Information Interchange)的中文翻译是美国信息互换标准代码,它基于拉丁字母的一套电脑编码系统。主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符,这是标准的ASCII。

其构成说明如下:0~31及127是控制字符或通信专用字符;32~126是字符,其中48~57为0~9十个阿拉伯数字,65~90为25个大写英文字母,97~122号为26个小写英文字母,其余位一些标点符号。

在标准ASCII中,其最高位(b7)用作奇偶校验位,这种校验机制在之前的文章中讲到过,就不在复述了。

后来人们又对ASCII码进行了拓展,称为扩展ASCII码。许多基于x86的系统都支持使用扩展ASCII。扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号。ASCII完整码表如下图所示:

ASCII码主要用于计算机领域,在国内工业控制中很少采用ASCII码作为标准,所以Modus ASCII在国内的工业控制领域运用很少。

二、Modbus ASCII

在ASCII传输模式下,消息帧以英文冒号:(3A)开始,以回车(0D)和换行(0A)结束,允许传输的字符集为十六进制的0~9和A~F。网络中的从设备监视传输通路上是否有英文冒号”:”,如果有的话,就对消息帧进行解码。查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中数据;如果不同的话就不予理会。其消息帧格式如下:

在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制0xAF(1010 1111),会被分解成ASCII字符“A”(0100 0001)和”F”(0100 0110)进行发送,其发送量显然比RTU增加一倍。ACII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(LRC)。

综上所述,同一条命令用Modbus RTU和Modbus ASCII方式表现出来,虽然在命令长度上有很大区别(ASCII为RTU的两倍),但表达的意思是完全一样的。

三、LRC校验

最后我们来讲一下LRC校验,LRC校验十分简单。它仅仅是把每一个需要传输的数据字节迭加后取反加1即可。它检测了消息帧中除开始的冒号及结束的回车换行号外的内容。

比如有如下数据段:30 31 30 33 30 31 32 31,求其LRC校验码。

首先30H+31H+30H+33H+30H+31H+32H+31H=188H,然后化为2进制,得0001 1000 1000,取反得1110 0111 0111,最后加1得1110 0111 1000,化为16进制,得0E78。

其完整消息帧应为:3A 30 31 30 33 30 31 32 31 0E 78 0D。

将ASCII传输模式的数据段换成RTU传输模式的数据段应为 01 03 01 21,由此可明显看出,ASCII传输模式数据相比RTU模式过长。

LRC校验虽然简单,但不可靠,多个错误可能相互抵消,在1个数据块内字节顺序的互换无法识别,一般用于快速校验很小的数据块。

上一篇下一篇

猜你喜欢

热点阅读