QT上位机开发(利用tcp/ip访问plc)

发布时间:2024年01月12日

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

? ? ? ? plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制,但是复杂的plc,还可以控制电机、变频器,在工业生产中非常重要。一般plc的价格,也是根据有多少的io口来确定的。另外,plc的控制接口也很多,一般是以485为主。而现在,越来越多的设备选择了网络型的plc,使用起来也十分方便。今天我们就来学习下,如何在qt的环境下操作plc。

1、创建基础的qt widget环境

? ? ? ? 为了编程和使用方便,首先创建一个qt widget环境。

2、练习qt的串口编程

? ? ? ? 串口编程在qt上开发,也是十分地方便。本身QtSerialPort支持串口。添加合理的头文件之后,只需要在链接文件的时候添加Qt5SerialPortd.lib即可。注意,这个时候最好给出完整地lib文件地址。

#include <QApplication>
#include <QtSerialPort/QSerialPort>
#include <QDebug>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	QSerialPort serialPort;
	serialPort.setPortName("COM1"); 
	serialPort.setBaudRate(QSerialPort::Baud9600); 
	serialPort.setDataBits(QSerialPort::Data8); 
	serialPort.setParity(QSerialPort::NoParity); 
	serialPort.setStopBits(QSerialPort::OneStop); 

	if (serialPort.open(QIODevice::ReadWrite)) {
		qDebug() << "Serial port opened successfully.";

		// write data to plc
		QByteArray writeData = "Hello PLC";
		qint64 bytesWritten = serialPort.write(writeData);
		qDebug() << bytesWritten << " bytes written";

		// read data from plc
		QByteArray readData = serialPort.readAll();
		qDebug() << "Read data:" << readData;

		serialPort.close();
		qDebug() << "Serial port closed.";
	}
	else {
		qDebug() << "Failed to open serial port.";
	}

	return app.exec();
}

3、继续练习qt的modbus网络编程

? ? ? ? 除了串口之外,qt还支持modbus编程。对应的头文件一般是QtSerialBus/QModbusTcpClient、QtSerialBus/QModbusDataUnit。同样,连接的时候需要添加上Qt5SerialBusd.lib文件。这个文件一样,最好添加上完整的目录地址。

#include <QApplication>
#include <QtSerialBus/QModbusTcpClient>
#include <QDebug>
#include <QtSerialBus/QModbusDataUnit>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	QModbusTcpClient modbusClient;
	modbusClient.setConnectionParameter(QModbusDevice::NetworkPortParameter, 502); 
	modbusClient.setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.1"); 

	// connect device first
	if (modbusClient.connectDevice()) {
		qDebug() << "Modbus TCP client connected successfully.";
		
		QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10); 

		// send request
		auto *reply = modbusClient.sendReadRequest(readUnit, 1);

		if (reply) {
			if (reply->isFinished() && reply->error() == QModbusDevice::NoError) {
				qDebug() << "Read successful:";
				const QModbusDataUnit result = reply->result();
				for (int i = 0; i < result.valueCount(); ++i) {
					qDebug() << "Register" << i << ":" << result.value(i);
				}
			}
			else {
				qDebug() << "Read error:" << reply->errorString();
			}

			reply->deleteLater();
		}
		else {
			qDebug() << "Failed to send read request.";
		}

		// disconnect device now
		modbusClient.disconnectDevice();
		qDebug() << "Modbus TCP client disconnected.";
	}
	else {
		qDebug() << "Failed to connect Modbus TCP client.";
	}

	return app.exec();
}

文章来源:https://blog.csdn.net/feixiaoxing/article/details/135562792
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。