序言
老实说,对于这些设备通信的,只有没写过的才会觉得无从下手和难,一旦了解了,也就那么一回事而已。本来想写一些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.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。
|