【PLC 网络通信及 MODBUS TCP通信测试】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、PLC的通信方式有?
  • 二、PLC网络通信
    • 1.MODBUS TCP
  • 三、安装虚拟软件
    • 2.测试
      • 2.1 测试程序
      • 2.2 对接虚拟软件
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

项目用到PLC 需要理解PLC的通信


提示:以下是本篇文章正文内容,下面案例可供参考

【PLC 网络通信及 MODBUS TCP通信测试】_第1张图片

一、PLC的通信方式有?

PLC的通信方式主要有以下几种:

  1. 串行通信:这是PLC最常用的通信方式,通过串行口进行数据交换。PLC可以通过RS-232、RS-485、RS-422等标准串行口,或者USB接口与其他设备进行通信。
  2. 以太网通信:这是目前最常用的通信方式,通过以太网口进行数据交换。PLC可以通过以太网口与计算机、其他PLC、HMI等设备进行通信。
  3. 现场总线通信:这是一种特殊的通信方式,通过专用的现场总线网络进行数据交换。常见的现场总线协议包括Modbus、Profibus等。
  4. 无线通信:这是近年来开始流行的通信方式,通过无线网络进行数据交换。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不提供加密或安全性选项,这可能会在自动化系统中造成潜在的安全漏洞。因此,在实际应用中,需要采取额外的安全措施来保护通信过程和数据安全。

三、安装虚拟软件

【PLC 网络通信及 MODBUS TCP通信测试】_第2张图片
【PLC 网络通信及 MODBUS TCP通信测试】_第3张图片
【PLC 网络通信及 MODBUS TCP通信测试】_第4张图片
【PLC 网络通信及 MODBUS TCP通信测试】_第5张图片

https://zhuanlan.zhihu.com/p/529828725
破解

【PLC 网络通信及 MODBUS TCP通信测试】_第6张图片

【PLC 网络通信及 MODBUS TCP通信测试】_第7张图片
【PLC 网络通信及 MODBUS TCP通信测试】_第8张图片

https://www.modbustools.com/

2.测试

2.1 测试程序

.pro 添加
QT += serialbus

cpp添加

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 
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 对接虚拟软件

配置软件
【PLC 网络通信及 MODBUS TCP通信测试】_第9张图片
测试自己的软件
在这里插入图片描述
实现读写
【PLC 网络通信及 MODBUS TCP通信测试】_第10张图片

总结

测试MODBUS TCP

你可能感兴趣的:(Qt,开发,tcp/ip,php,网络)