提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、PLC的通信方式有?
- 二、PLC网络通信
- 1.MODBUS TCP
- 三、安装虚拟软件
- 2.测试
- 2.1 测试程序
- 2.2 对接虚拟软件
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
项目用到PLC 需要理解PLC的通信
提示:以下是本篇文章正文内容,下面案例可供参考
一、PLC的通信方式有?
PLC的通信方式主要有以下几种:
- 串行通信:这是PLC最常用的通信方式,通过串行口进行数据交换。PLC可以通过RS-232、RS-485、RS-422等标准串行口,或者USB接口与其他设备进行通信。
- 以太网通信:这是目前最常用的通信方式,通过以太网口进行数据交换。PLC可以通过以太网口与计算机、其他PLC、HMI等设备进行通信。
- 现场总线通信:这是一种特殊的通信方式,通过专用的现场总线网络进行数据交换。常见的现场总线协议包括Modbus、Profibus等。
- 无线通信:这是近年来开始流行的通信方式,通过无线网络进行数据交换。PLC可以通过WiFi、ZigBee、LoRa等技术与其他设备进行无线通信。
在选择PLC的通信方式时,需要根据具体的通信需求和应用场景来选择最合适的通信方式。例如,对于短距离、低速率的通信,可以选择串行通信或现场总线通信;对于长距离、高速率的通信,可以选择以太网通信或无线通信。
二、PLC网络通信
1.MODBUS TCP
PLC MODBUS TCP是一种基于以太网的通信协议,用于实现可编程逻辑控制器(PLC)之间的数据交换。它结合了以太网物理网络和网络标准TCP/IP,以及MODBUS作为应用协议标准的数据表示方法。
在PLC MODBUS TCP通信中,数据被封装在以太网TCP/IP数据包中,而不再带有数据校验和地址。通信双方通过服务器与客户机的通信方式进行数据交换,其中PLC作为服务器端等待来自客户端的请求,而客户端则通过读写操作与服务器进行数据交换。
在PLC MODBUS TCP中,地址分配和数据读写操作非常重要。地址分配包括对离散输入寄存器、线圈寄存器、保持寄存器、输入寄存器等的设置,以及对起始地址和数据长度的分配。在数据读写操作中,需要指定服务器IP地址、服务器端口、读写请求类型、起始地址、数据长度等参数。
需要注意的是,PLC MODBUS TCP不提供加密或安全性选项,这可能会在自动化系统中造成潜在的安全漏洞。因此,在实际应用中,需要采取额外的安全措施来保护通信过程和数据安全。
三、安装虚拟软件
https://zhuanlan.zhihu.com/p/529828725
破解
https://www.modbustools.com/
2.测试
2.1 测试程序
.pro 添加
QT += serialbus
cpp添加
#include "widget.h"
#include "ui_widget.h"
#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QModbusReply>
#include <QMessageBox>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
modbusClient = new QModbusTcpClient(this);
modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, 503); // 设置Modbus端口
modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1"); // 设置Modbus服务器地址
if (!modbusClient->connectDevice()) {
qDebug() << "连接失败";
}
}
Widget::~Widget()
{
if(modbusClient->state() == QModbusTcpClient::ConnectedState)
{
modbusClient->disconnectDevice();
}
delete ui;
}
void Widget::on_ReadBtn_clicked()
{
ReadValue();
}
void Widget::ReceiveData()
{
QModbusReply* reply = (QModbusReply*)(sender());
QModbusDataUnit unit = reply->result();
reply->deleteLater();
if(unit.valueCount() > 0)
{
ui->lb_templbtemp->setText(QString::number(unit.value(0)));
}
}
void Widget::on_WriteBtn_clicked()
{
if(ui->tb_Line->text() == "")
{
QMessageBox::warning(this,"提示","请输入设定值!");
return;
}
if(modbusClient->state() == QModbusDevice::ConnectedState)
{
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // 写入一个寄存器
writeUnit.setValue(0,ui->tb_Line->text().toUInt());
if (auto *reply = modbusClient->sendWriteRequest(writeUnit, 1))
{
reply->deleteLater();
//ReadValue();
}
}
}
void Widget::ReadValue()
{
if(modbusClient->state() == QModbusDevice::ConnectedState)
{
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // 读取一个寄存器
if (auto *reply = modbusClient->sendReadRequest(readUnit, 1))
{
if (!reply->isFinished())
{
// connect(reply,QModbusReply::finished,this,ReceiveData);
connect(reply, &QModbusReply::finished, this, &Widget::ReceiveData);
return;
}
reply->deleteLater();
}
else {
// qDebug()<< "提前退出";
qDebug() <<"提前推出";
}
}
}
2.2 对接虚拟软件
配置软件
测试自己的软件
实现读写
总结
测试MODBUS TCP