【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
? ? ? ? plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制,但是复杂的plc,还可以控制电机、变频器,在工业生产中非常重要。一般plc的价格,也是根据有多少的io口来确定的。另外,plc的控制接口也很多,一般是以485为主。而现在,越来越多的设备选择了网络型的plc,使用起来也十分方便。今天我们就来学习下,如何在qt的环境下操作plc。
? ? ? ? 为了编程和使用方便,首先创建一个qt widget环境。
? ? ? ? 串口编程在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();
}
? ? ? ? 除了串口之外,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();
}