2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Qt 基恩士PLC EtherNet/IP 单元上位链路通信功能TCP实现

Qt 基恩士PLC EtherNet/IP 单元上位链路通信功能TCP实现

时间:2023-07-31 09:46:38

相关推荐

Qt 基恩士PLC EtherNet/IP 单元上位链路通信功能TCP实现

上位链路通信功能

序言环境功能实现原理源码命令的编码问题

序言

老实说,对于这些设备通信的,只有没写过的才会觉得无从下手和难,一旦了解了,也就那么一回事而已。本来想写一些TCP/UDP的功能,但是奈何这类太多了,写了没意思。

环境

Android

Qt5.12——armeabi-v7a

KV-EP21V——EtherNet/IP 单元

注:该功能实现可跨平台,只要与EtherNet/IP 单元处于同一局域网下即可。

功能实现原理

在终端(PC)创建通信程序,然后终端(PC)通过以太网向KV-EP21V发送命令,并通过以太网接收EtherNet/IP单元返回的响应,这样可读写CPU单元的数据、监控其运行状态。

通信时,PLC(包括EtherNet/IP单元)为服务器,PC等终端为客户端。服务器从客户端接收命令,并自动向客户端返回响应。

上位链路通信支持TCP/IP和UDP/IP两种通信协议。

通俗来说,就算Qt上设个TCP/UDP客户端,连接EtherNet/IP 单元自带的TCP/UDP服务器即可,本文以TCP连接为例。

IP地址需要自行察看,但默认192.168.0.10,端口号默认8501

源码

//carData是我写的类似d指针的东西,不清楚d指针的可以只看其属性即可。workIP = QHostAddress("192.168.0.10");workPort = 8501;workTcpSocket.connectToHost(workIP,workPort);connect( &workTcpSocket, &QTcpSocket::connected, this, &WindowDialog::connectSuccessDisplay, Qt::UniqueConnection);connect( &workTcpSocket, &QTcpSocket::disconnected, this, &WindowDialog::connectErrorDisplay, Qt::UniqueConnection);connect( &workTcpSocket, &QTcpSocket::readyRead, this, &WindowDialog::plcInforFeedback, Qt::UniqueConnection);void WindowDialog::connectSuccessDisplay(){...}void WindowDialog::connectErrorDisplay(){...}void WindowDialog::plcInforFeedback(){QByteArray feedbackInfor = workTcpSocket.readAll();//读取...反馈的信息处理...}void WindowDialog::readValue(){QString JOGPlusFeedbackString = "RD DM5012\r";workTcpSocket.write( JOGPlusFeedbackString.toUtf8());//写入}

值得注意的是,发送命令给EtherNet/IP 单元时,要知道EtherNet/IP 单元只识别ASCII码,其他编码的命令会强行当ASCII码来识别。

所以要将QString的命令转化为UTF-8再发送过去,有人可能有些疑惑,我来解释下。

命令的编码问题

QString内部是以Unicode编码存储,Unicode以2个字节表示一个字符,而ASCII码以1个字节表示一个字符。

当写好的命令交以Unicode表示,并以ASCII码接受,那么这接受的编码命令应该是词不达意的。

UTF-8编码是“可变长编码”,以1-4个字节表示一个字符,其中单个字符时,字节第一位是0,后面为表示字符的二进制。

在这种情况下,常规ASCII码的表示范围就刚好符合UTF-8。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。