首页 新闻 会员 周边 捐助

Modbus通信协议是不是有问题,开发多线程串口通信遇该协议卡壳了

0
悬赏园豆:10 [已解决问题] 解决于 2024-08-26 09:49

软件中进行多线程串口通信时,用Modbus通信协议。
当线程A下发:01 03 00 00 00 01 84 0A读取X值。机器回文是:01 03 02 02 11 79 28
线程B下发:01 03 00 01 00 01 D5 CA 读取Y值。 机器回文是:01 03 02 05 15 7A DB

第一条下发命令含义是前两位01 03区分命令功能为读取,后面两位00 00是寄存器地址,再后面是寄存器位长00 01,再后面校验码占两位。

机器第一条回文: 01 03也是区分读取的回文。后面的02是数据长度,02 11 是内容,79 28是校验码。

这样回文只能靠前两位01 03来区分,现遇到问题是由于线程A是轮询式不断发送,当线程B发时有可能收到的是A的回文,叫硬件同事改协议,说改不了, 是Modbus通信协议,全球通用,Modbus通信协议是不是有问题?
现遇到的问题是:不改协议,软件上应该如何区分收到的是A还是B的回文?

tea2007的主页 tea2007 | 初学一级 | 园豆:37
提问于:2024-08-22 15:08
< >
分享
最佳答案
0

建议用锁的方式去做处理,等待发送接收到数据了,再做下一次的轮询

收获园豆:6
lf03 | 小虾三级 |园豆:547 | 2024-08-22 15:50
其他回答(3)
0

把指令全部放到一个队列里去,每个指令加个callback或者标志,收到回应后,交给对应的callback去处理. 然后再处理下一条指令.

收获园豆:1
www378660084 | 园豆:682 (小虾三级) | 2024-08-22 18:39
0

不是Modbus的问题,是你使用方式的问题。

必须使用串行的方式处理,发一条读一条。

建议重新整理一下你的逻辑,将串口发-收的功能放入临界区,或者放在同一个线程中。

串口只有一个是不可能并行发送的,如果不是发一条收一条的模式处理,挨着发送两条命令的话,接收时分析数据会很麻烦,甚至可能是混乱的数据完全无法分析(取决于硬件处理方式)。

收获园豆:1
左眼水星 | 园豆:118 (初学一级) | 2024-08-23 00:14
0

Modbus通信协议本身是一种通用的工业通信协议,可以在各种设备和系统中使用。在您描述的情况下,由于线程A和线程B一起发送和接收Modbus命令和回复时可能会出现混淆的问题。
为了确保正确地区分收到的是线程A还是线程B的回复,在软件层面可以采取以下方法:

  1. 增加命令标识:在线程A和线程B发送命令时,可以在Modbus命令中添加一个特定的标识符,以便在回复时识别它们。例如,可以在命令中的某个特定字节位置上添加一个标识符,以区分A和B的命令。
  2. 校验回复:在接收到回复后,您可以首先进行合法性校验,确认回复包含预期的数据长度和校验码。然后进一步检查回复中的特定数据内容是否与线程A或线程B所期望的一致。这有助于更准确地识别回复的来源。
  3. 时间戳标记:在软件层面,您可以为接收到的回复添加时间戳标记,记录每个回复的接收时间。这样,在处理回复时,可以根据时间戳来确定回复的来源。注意,在高速通信和高并发情况下,时间戳方法可能存在不确定性。
    除了这些方法,您还可以尝试与硬件同事或设备制造商合作,探讨可行的硬件层面解决方案。这可能涉及修改硬件设计或协议规范,以确保正确区分线程A和线程B的通信。
    总之,Modbus通信协议本身并没有问题,但在并行发送和接收命令时需要采取一些额外的措施来保证通信的准确性和确定性。
收获园豆:2
Technologyforgood | 园豆:7231 (大侠五级) | 2024-08-23 07:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册