Skip to content

12.3 报文校验、循环发送与自动回应 ​

这一页讲发的那一半:报文怎么写、校验怎么自动补、怎么定时重发、怎么让这台电脑扮演一个会应答的从站。窗口怎么打开、记录区怎么看,见 12.1 打开调试工具与串口调试。

十个发送区 ​

右下一排 发送区0 … 发送区9 是十个互相独立的暂存格,切换标签各看各的内容,不会串。适合把一套要轮流测的报文先存好:0 号放读线圈、1 号放读寄存器、2 号放写单条……

  • 每一格里填什么、当前停在第几格、以及收发两侧的显示格式,关窗后都会记住,下次打开调试工具原样还在。
  • 清发送区 只清当前这一格,其它九格不动。
  • 十六进制模式下写法的容忍度很高:空格、逗号、换行、0x 前缀、大小写混着写都能识别,01 03 00 和 01,03,00、0x010300 是一回事。

发出去之前,先看这一行预览 ​

发送区下面是 将发送 N 字节:01 03 00 00 00 01 8B 44,随着您输入实时更新,勾没勾校验、校验加成了几字节,全部体现在这一行上。

这行就是最终上线的字节 —— 和上面输入框里写的不一样是正常的(多出来的就是校验)。想确认自己写的报文对不对,看这行比看输入框靠谱。

两种校验 ​

开关加什么用在什么协议上
modbus校验末尾追加 2 字节 CRC16,低字节在前Modbus RTU 帧
三菱校验末尾追加 2 个字符的和校验(所有字节求和取低 8 位,写成两位大写十六进制字符)三菱 FX 计算机链接

三个细节

  • 两个都勾:先算 CRC 再算和校验,和校验会把 CRC 一起算进去 —— 和老工具行为一致。
  • 发送区是空的时不会追加任何校验,不会出现只发 2 字节校验码的情况。
  • 校验只在点发送的那一刻生效,不会把校验码写回发送区,所以勾着校验反复发同一格不会越加越长。

循环发送 ​

勾 循环发送 后,工具按「周期」栏的毫秒数把当前发送区原样一遍遍重发。

项行为
周期默认 500 毫秒,最小 10 毫秒(填更小的数会被自动抬到 10)
未打开连接这个勾是灰的,点不了
关掉连接循环发送自动取消,不会一直报「请先打开连接」
上一包还没发完不会叠加。周期比对方响应还短时,宁可少发一轮,也不把请求堆在后端
切发送区标签循环的对象立刻变成新选中的那一格

典型用法:确认某个设备到底回不回、回得稳不稳 —— 勾上循环,盯记录区里绿色行的出现频率就行。

自动回应:让这台电脑扮演一个从站 ​

没有真实从站、但要验证主站的轮询报文对不对时,用这个。

报文装配顺序与两个自动动作

勾上 自动回应,在它右边的框里填一段十六进制模式串(默认预填 02 03 00 00 00 01,用之前要改成您自己的):

  1. 每收到一包数据,就检查里面是否包含这段模式串(是"包含",不是"完全相等",所以主站多带几个字节照样能命中);
  2. 命中就把当前发送区的内容(按当前的校验设置装配好)回发出去;
  3. 回发的字节同样进记录区,是一条蓝色的 [发]。

三种情况不会回话

  • 当前发送区是空的 —— 没内容可回,直接跳过;
  • 回应内容本身也命中了模式串 —— 发出去又被自己收到(尤其 UDP 广播)会无限互相回话,这时跳过并提示 自动回应内容本身命中匹配模式,已跳过以避免自激循环;
  • 两次回应间隔小于 200 毫秒 —— 同一瞬间来一堆包只会回一次,防止刷屏式回发。

所以现场看到"没回应",先确认发送区里存的是应答报文、模式串和请求报文对得上。

「生成报文」:写 HTTP 请求不用手算 ​

发送区右边有个 生成报文 按钮(鼠标停上去显示「生成 HTTP 报文并回填到当前发送区」),点开是一个小表单:

栏说明
方法GET / POST / PUT / DELETE
主机、端口、路径预填的是示例值(192.168.1.100、80、/api/status),要改
Content-Type只有 POST / PUT 才出现
Connection: keep-alive不勾就是 Connection: close
附加请求头每行一条,例如 Authorization: Bearer xxx。和上面自动生成的头重名时,以您写的这条为准,不会发出两遍同名头(很多服务端见到同名头直接返回 400)
正文只有 POST / PUT 才有正文

下面能先看预览,确认无误再点 回填到发送区。

回填之后编码会自动切成 UTF8

Content-Length 是按 UTF-8 字节数算的(中文按字符串长度算会算少)。回填时工具顺手把这一格的发送编码切到 UTF8,这样长度才对得上。反过来说:手动把 HTTP 报文放在 GBK 模式下发,长度一定是错的,工具会提示 报文含 Content-Length,但当前编码是 GBK,长度会与实际字节数不符,建议切到 UTF8。

发送相关的提示对照 ​

提示原因怎么办
请先打开连接还没点「打开串口 / 连接 / 开始监听 / 绑定」回左栏打开连接(此时「发送数据」按钮也是灰的)
发送内容为空当前这一格什么都没填换一格或填内容
有 N 个字符不在 GBK 码表内已丢弃,请改用 UTF8 或十六进制文本模式下有些字发不出去(生僻字、emoji),这几个字符没有被发送按提示切 UTF8 或十六进制;提示是"已丢弃",不是"已替换",发出去的字节比原文少
只发出 x/y 字节,对方可能未及时接收对方收得慢,本机发送缓冲写满,这一包被截断拉长循环周期;TCP 服务器群发时先用「客户端」下拉改成单发
自动回应内容本身命中匹配模式,已跳过以避免自激循环见上面那节把模式串改成只出现在请求里的字段

相关页面 ​

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研