主题
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,用之前要改成您自己的):
- 每收到一包数据,就检查里面是否包含这段模式串(是"包含",不是"完全相等",所以主站多带几个字节照样能命中);
- 命中就把当前发送区的内容(按当前的校验设置装配好)回发出去;
- 回发的字节同样进记录区,是一条蓝色的
[发]。
三种情况不会回话
- 当前发送区是空的 —— 没内容可回,直接跳过;
- 回应内容本身也命中了模式串 —— 发出去又被自己收到(尤其 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 服务器群发时先用「客户端」下拉改成单发 |
自动回应内容本身命中匹配模式,已跳过以避免自激循环 | 见上面那节 | 把模式串改成只出现在请求里的字段 |
相关页面
- 12.1 打开调试工具与串口调试 —— 界面分区、记录区怎么看
- 12.2 TCP 与 UDP 调试 —— 三种网络角色怎么填
- 6.1 PLC 在线操作与诊断 —— 读运行状态、强制输出
- 3.5 寄存器操作与设备日志 —— 不想拼报文时,直接读写 D / M / T / C