- 主题:socket通信,实时性太差的问题
请教开发过socket客户端的大佬,我弄了个socket客户端,和三菱的PLC做MC通信,实时性非常差,由于三菱的MC协议的报文结构没有报文的ID号,没法做异步通信,我用的是同步通信,很多时候要好几秒钟才能得到PLC的回复。写数据还好,读数据尤其慢,是不是操作系统哪里的设置问题?多线程的时候问题更严重。
--
修改:hengcuiyuan FROM 113.70.65.*
FROM 113.70.65.*
MC通信和socket矛盾?这是何解?MC协议就是规定了报文结构,我得调用操作系统的通信接口才能把报文发出去,不用socket,那用什么发呢?
【 在 simonvic 的大作中提到: 】
: MC通讯和Socket本来就是矛盾的,你如果要用socket,应该在三菱里也写通讯程序,收发报文。
: 如果你用MC,多半是你MC协议实现的不对,还是找个现成的库吧。
--
FROM 113.69.195.*
socket并不是一个协议呀,只是操作系统的一个接口呀,我理解是这样的。无论是什么协议的报文,比如三菱的MC协议,欧姆龙的Fins都可以借助socket把数据通过以太网发出去呀,不同的协议只是规定了报文格式而已
【 在 simonvic 的大作中提到: 】
: 你用socket,PLC最好那边也用socket。你要是用MC,你要是有能力实现一个好的协议,当然也是可以的,但是现在看起来不行,所以最好找个现成的库。
:
: :
--
FROM 113.69.192.*
什么叫怪?这不是在向高手请教嘛?而且qq聊天有什么实时性要求嘛,收一个消息迟到了一两秒有什么关系,但是工业场合就很糟糕了。
【 在 clwd 的大作中提到: 】
: 是你的问题不要怪socket协议,qq都是用的socket协议
--
FROM 113.70.88.*
没,这几天没空搞这个问题。我用的是qt 4,也可能和qt库有关
【 在 poikilotherm 的大作中提到: 】
: 问题解决了吗?
--
FROM 113.70.64.*
用wireshark抓了一下包,发现通信的时间非常短,PLC的响应没有问题,但是数据包到了协议栈之后,有的时候触发qt的ReadyRead信号耗时很长,一般都有几十毫秒,偶尔出现几秒钟的情况,我每次通信的数据量很少,是不是数据量太少了,操作系统在等待更多的数据一起发送?有修改的方法吗?
【 在 foliver 的大作中提到: 】
: 先在链路上抓包,确定是哪端的问题。
: A端业务提交消息,链路传送消息,B端业务接收消息,B端提交回应消息,链路传送消息,A端业务收到回应。
: 把每个时间点记录下来,以便确定问题出现在哪里。
: ...................
--
FROM 113.70.67.*
我现在是多线程环境,通信程序在一个独立的线程里面,有点坑的是三菱的3E帧结构不含数据包的序列号的,所以我只能同步通信,我现在是只能一次通信完成之后再做下一次通信,信道被占用的时间里面就用QCoreApplication::processEvents去做事件处理。这种情况下,我发现:1、Debug模式下,数据包到了之后readyRead信号没有被触发,但release模式下,readyRead大部分情况被触发了;2、release模式下,偶尔出现数据包呆在协议栈里面几秒钟,readyRead不被触发,但是下一个数据包到来的时候,readyRead被立刻触发,导致粘包,无法处理;3、数据通信的时间很短,但是从协议栈到socket的时间要长的多。
可能是我的代码真写的有问题,我现在是需要读的时候读,需要写的时候写,每次数据传输的报文很小,再加上多线程环境,又没法搞异步通信,特别凌乱。我打算简单点,直接设定定时器来读和写,读完写,写完读,一次性把所有的数据读或者写完,也许可以解决这个问题。
【 在 z16166 的大作中提到: 】
: 大概率是qt的库没用对,贴你的代码让各位大拿看看
:
--
FROM 113.70.67.*
因为还可以凑合着用呀,只是不太理想,我也不是专职程序员呀
【 在 z16166 的大作中提到: 】
: 8月份到12月初,还没搞定?
:
--
FROM 113.69.192.*
有几万行代码呢,如果单单是通信代码,可以弄上去。我感觉应该是多线程环境下,三菱的帧结构导致无法异步通信带来的问题。我现在直接定时通信,这样就是简单明了的同步通信,我先试试看。
【 在 hgoldfish 的大作中提到: 】
: 从你的描述看,连 QCoreApplication::processEvents() 都用上了,几乎可以肯定是你的代码有问题。
: 可以弄个最新测试可运行代码,包含 CMakeLists.txt 等工程文件到 github 去。我可以给你诊断一下。
:
--
FROM 113.69.192.*