Modbus ASCII

当 Modbus 串行链路的设备被配置为使用 ASCII(American Standard Code For Information Interchange)模式通信时,报文中的每个 8 位字节以两个 ASCII 字符发送。当通信链路或者设备无法符合 RTU 模式的定时管理时使用该模式。

注:由于一个字节需要两个字符,此模式比 RTU 效率低。

例:字节 0x5B 会被编码为两个字符:0x35 和 0x42(ASCII 编码 0x35=”5”,0x42=”B”)。

ASCII模式每个字节(10位)的格式

1.编码系统:十六进制,ASCII字符 0-9,A-F,报文中每个 ASCII 字符含有 1 个十六进制字符。

2.每字节 bit 流:1 起始位、7 数据位,首先发送最低有效位、1 位奇偶检验、1 停止位。

奇偶校验是要求的,其它模式(奇校验,无校验)也可以使用。为了保证与其它产品最大的兼容性,同时支持无校验模式是建议的。默认校验模式必须为偶校验。

字符是如何串行传送的:

每个字符或字节均由此顺序发送(从左到右):最低有效位(LSB)…最高有效位(MSB)。

image.png

ASCII模式位序列

设备配置为奇校验、偶校验或无校验都可以接受。如果是无奇偶校验,将传送一个附加的停止位以填充字符帧:

image.png

ASCII模式位序列(无校验的特殊情况)

帧检验域:

纵向冗余校验(LRC-Longitudinal Redundancy Checking)。

Modbus ASCII报文帧

由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。

报文帧的地址域含有两个字符。

在ASCII模式,报文用特殊的字符区分帧起始和帧结束。一个报文必须以一个‘冒号’(:)(ASCII 十六进制 3A)起始,以‘回车-换行’(CR LF)对(ASCII十六进制0D和0A)结束。

注:LF 字符可以通过特定的 Modbus 应用命令改变。

对于所有的域,允许传送的字符为十六进制 0-9,A-F(ASCII 编码)。设备连续的监视总线上‘冒号’字符。当收到这个字符后,每个设备解码后续的字符一直到帧结束。

报文中字符间的时间间隔可以达1秒。如果有更大的间隔,则接收设备认为发生了错误。

image.png

ASCII报文帧

注:每个字符字节需要用两个字符编码。因此,为了确保ASCII 模式和 RTU模式在 Modbus 应用级兼容,ASCII 数据域最大长度为(2x252)是 RTU 数据域(252)的两倍。

必然的,Modbus ASCII 帧的最大尺寸为 513 个字符。

ASCII 报文帧的要求在下面的状态图中综合。“主设备”和“从设备”的不同角度均在相同的图中表示。

图片

ASCII传输模式状态图

1.“空闲”态是没有发送和接收报文要处理的正常状态。

2.每次接收到“:”字符表示新的报文的开始。如果在一个报文的接收过程中收到该字符。则当前地报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。

3.检测到帧结束后,完成LRC 计算和校验,然后分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。

LRC校验

在 ASCII 模式,包含一对全部报文内容执行的,基于纵向冗余校验(LRC-Longitudinal Redundancy Checking)算法的错误检验域。LRC 域检验不包括起始“冒号”和结尾 CRLF 对的整个报文的内容。不关报文有无奇偶校验,均执行此检验。

LRC 域为一个字节,包含一个8 位二进制值。LRC 值由发送设备计算,然后将 LRC 附在报文后面。接收设备在接收报文时重新计算 LRC 的值,并将计算结果于实际接收到的 LRC 值相比较,如果两个值不相等,则为错误。

LRC 的计算,对报文中的所有的连续 8 位字节相加,忽略任何进位,然后求出其二进制补码。执行检验针对不包括起始“冒号”和结尾 CRLF 对的整个 ASCII报文域的内容。在 ASCII 模式,LRC 的结果被ASCII 编码为两个字节并放置于 ASCII模式报文帧的结尾,CRLF 之前。

delphi代码如下:

function GetLRC(AData: array of Byte;  iLen: Integer): Byte;
var
  iLoop : Integer;
begin
  Result := 0;
  for iLoop := 0 to iLen - 1 do Result := Result + AData[iLoop];
  Result := Result xor $FF + 1;
end;
function CalculateLRC(const Data: string): Byte;
var
  i: Integer;
  LRC: Byte;
begin
  LRC := 0;
  for i := 1 to Length(Data) do
    LRC := LRC xor Byte(Data[i]);
  Result := LRC;
end;

c#代码如下:

static byte LRC(byte[] data)
  {
    byte lrc = 0;
    foreach (byte c in data)
    {
      lrc += c;
    }
    return (byte)-lrc; 
  }

c代码如下:

static unsigned char LRC(auchMsg,usDataLen)
  
  unsigned char *auchMsg ; /* 要进行计算的消息 */
  
  unsigned short usDataLen ; /* LRC 要处理的字节的数量*/
  
  { unsigned char uchLRC = 0 ; /* LRC 字节初始化 */
  
  while (usDataLen--) /* 传送消息 */
  
  uchLRC += *auchMsg++ ; /* 累加*/
  
  return ((unsigned char)(-((char_uchLRC))) ;
  
  }

Modbus ASCII是一种基于ASCII字符编码的Modbus通信协议。它是Modbus协议的一种变种,用于通过串行通信进行数据传输。Modbus ASCII使用可打印的ASCII字符来表示数据,每个字节以两个十六进制字符的形式呈现。它使用起始字符“:”和结束字符“CR LF”(回车换行)来标识每个数据帧的开始和结束。 Modbus ASCII协议中的功能码指令集与标准的Modbus协议相似,主要用于读取和写入设备的参数。常用的功能码有8个,可以分为位操作和字操作两类。其中,位操作功能码主要用于读取和写入单个或多个离散输入和线圈状态,而字操作功能码则用于读取和写入单个或多个寄存器的数值。 在Modbus ASCII通信中,数据帧通过字符的形式进行传输。每个数据帧由起始字符“:”、地址、功能码、数据、校验和和结束字符“CR LF”组成。校验和是通过对数据域和地址域中的每个字节进行异或运算得到的。 综上所述,Modbus ASCII是一种基于ASCII字符编码的Modbus通信协议,用于通过串行通信进行数据传输。它具有与标准Modbus相似的功能码指令集,并使用特定的字符表示数据帧的开始和结束。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [modbus ascii](https://download.csdn.net/download/weixin_42265194/10428459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MODBUS-ASCII协议](https://blog.csdn.net/qq446252221/article/details/128248581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljklxlj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值