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指针的可以只看其属性即可。

carData.networkIP = QHostAddress("192.168.0.10");	
carData.networkPort = 8501;
carData.networkTcpSocket.connectToHost(carData.networkIP,carData.networkPort);
connect( &carData.networkTcpSocket, &QTcpSocket::connected, this, &WindowDialog::connectSuccessDisplay, Qt::UniqueConnection);
connect( &carData.networkTcpSocket, &QTcpSocket::disconnected, this, &WindowDialog::connectErrorDisplay, Qt::UniqueConnection);
connect( &carData.networkTcpSocket, &QTcpSocket::readyRead, this, &WindowDialog::plcInforFeedback, Qt::UniqueConnection);


void WindowDialog::connectSuccessDisplay()
{
	...
}

void WindowDialog::connectErrorDisplay()
{
	...
}

void WindowDialog::plcInforFeedback()
{
    QByteArray feedbackInfor = carData.networkTcpSocket.readAll();		//读取
    ...反馈的信息处理...
}

void WindowDialog::readValue()
{
	QString JOGPlusFeedbackString = "RD DM5012\r";

    carData.networkTcpSocket.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。

你可能感兴趣的:(#,Qt功能模块,qt,tcp/ip,网络)